連立方程式を解くプログラムを多元線形連立方程式にするには。
#include <stdio.h>
#include <time.h>
#define N 3
int main(void) {
clock_t start, end;
start = clock();
float a[N][N+1] = {
{5,-1,-1,0},
{ 2,1,-3,-5 },
{ 1,1,1 ,6} }; // The matrix
//前進消去
int i;
float d = a[1][0] / a[0][0];
for (i = 0; i <= 3; i++) {//forを使う上で上限がなかったので3までが上限なのでi<=3と書いた。
a[1][i] = a[1][i] - a[0][i] * d;
{
printf("a[1][%d]=%fとなる\n", i,a[1][i]);
}
}
float r;
r = a[2][0] / a[0][0];
for (i = 0; i <= 3; i++) {
a[2][i] = a[2][i] - a[0][i] * r;
}
int I;
for (I = 0; I <= 3; I++) {
printf("a[2][%d]=%fとなる\n", I,a[2][I]);
}
float z;
z= a[2][1] / a[1][1];
int y; //iは1から3まで入るのでkに+1した形で入ってもらいiを利用する。kはforより3までとする。
for (y = 0; y <= 3; y++) {
a[2][y] = a[2][y] - a[1][y] * z;
printf("a[2][%d]=%fとなる\n", y, a[2][y]);
}
//前進消去終わり
//後退代入
float g = a[2][3] / a[2][2];
printf("Z=%f\n", g);
float h;
h = a[1][3] / a[1][1] - a[1][2] / a[1][1]* a[2][3] / a[2][2];
printf("Y=%f\n", h);
float j;
j = h / a[0][0] + g / a[0][0];
printf("X=%f\n", j);
end = clock();
printf("%f sec\n", (double)(end - start) / CLOCKS_PER_SEC);
return 0;
}
//後退代入終わり
以上のプログラムを多元線形連立方程式にできないでしょうか?
どうかよろしくお願いいたします。
またできるならば多元線形連立方程式のプログラムにできるのならばその過程も教えていただけるとありがたいです。
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
あ"〜〜〜。
・・・・う〜〜ん・・・・・・。多分「やりたい事」が何なのか、うっすらと想像は出来るんですが・・・・。
単純には「できません」って言っておくべきですかねぇ。
あるいは「できる」としても「メチャクチャメンド臭い」んで、今の貴方には出来ない、あるいは「ツールが悪い」って言い方になるかもしれません。
基本的にはプログラミング言語は「電卓」です。
つまり、例えば、「多元線形連立方程式」なんぞ持ち出さなくても、
int x = 1;
printf("%d\n", 2*x);
なんつーのは解けます。xに「代入」して「結果を出す」、なんて電卓的に出来るのが通常のプログラミング言語なんですよ。
ところが、例えば
2*x + 1 = 3
みたいな「方程式」を与えて、上のように「xに何かを代入する」のではなくって、「xの値を自動的に出しなさい」となると、途端に通常のプログラミング言語では「お手上げ」になるのです。
100円ショップで売ってるような電卓と同じですね。「電卓では実は方程式は扱えない」。
実は「方程式を解かせるプログラム」と言うのは過去研究されていました。その割にはその成果を目にする事は少ないです。それほどプログラムに「方程式を解かせる」ってのは難しいのです。
平たく言うと、貴方が提示したプログラムのように、「数値を与えて計算させる」んではなくって、「文字列(あるいはそれに類する何か)を与えて操作する」と言うのが方針になります。
貴方が提示したようなプログラムの形式を「数値計算」と言いますが、反面、「文字列(等)を操作して」計算させるのを「記号計算」と呼びます。全くジャンルが違うのです。
単純に言うと、
char str[] = "2*x + 1 = 3";
みたいにして「文字列を弄って行って」計算していくわけですが、そうなると文字列のパーズ(構文解析)をどうするのか、とかそのテのシチメンドクサイ話が出てくるんですね。しかもC/C++辺りだと文字列操作関数が「貧弱」過ぎて、全部実装するとなるとシャレにならなくなるでしょう。
従って、現時点では「諦めなさい」と言うか、あるいは「別のプログラミング言語でやった方が良い」としか言いようが無くなっちゃうんですよね。
多分こういうプログラムを「完成形」として想像してるんだとは思うんですが。
Maxima:
http://maxima.sourceforge.net/
解答ありがとうございます。
あの、もしかしたら私の勘違いかも知れないのですが、
多元線形連立方程式って4次元とか6次式を処理すると思うのですが、
ガウスの消去法で調べるとNを変えれば何次式でも解けるようなのですが、これはどうなのでしょうか?https://www.mk-mode.com/octopress/2013/09/24/cpp …
No.2
- 回答日時:
> ガウスの消去法で調べるとNを変えれば何次式でも解けるようなのですが、これはどうなのでしょうか?
「何次式」じゃなくって「何元でも」じゃないですか?
そうだとすればその通りです。
ソースコードに付いてはC++は知らないのでなんとも言えないですが、例えばNを入力する形にして、任意の連立方程式を入力、拡張する、ってのは十分可能なのではないでしょうか。
かつ、そのソースでも「連立方程式に直す」と言うのは、結局、配列内の数値を文字列にはめ込んで並べるだけ、になっていますね。
何次元にするかで
プログラムに5次元の式を計算する場合、forループで限界が来たりしないのでしょうか?
100次元でも計算できるのでしょうか?
No.4
- 回答日時:
> 100次元でも計算できるのでしょうか?
100元連立方程式でも理論上は可能ですね。
どっちにせよ、多重ループするにしてもたかだか2〜3重、しかも一つのループでせいぜい100回です。フツーの計算でループさせても100回なんて大した数じゃないです。
(モンテカルロ法なんかのプログラムでは10,000回ループを回す、なんつーのもザラです)
だから、「言語規格上は」ループに上限なんかはありません。
仮に「限界」があるとすれば、言語上のループの問題じゃなくって、メモリが足りなくなる、とかあるいは大きな数になって一つのメモリブロックに置ける数の上限超えてしまう、なんつーことはあるかもしれませんが、少なくとも最近のPCだとメモリ容量自体は16GB(これは実はかなりデカい)もある、とかザラなんでフツーに計算する上では容量的には大した障害にならないでしょうねぇ。
No.5
- 回答日時:
>100次元でも計算できるのでしょうか?
行列を保持するのに必要なメモリ量は
n x (n+1) x 8 byte =800,800
つまり、たったの800 kbyteです。
計算量は、浮動小数点の掛け算と足し算併せて70万回くらい。
#かけ算回数=足し算回数≒(1/3)n^3
現在、普通の市販のパソコンが 100 GFLOPS をこえる
ところまで来てるのて、処理時間は 10 μs のオーダー
n=1000でも100回くらい計算をくり返さないと計算時間を
体感できません(^-^;
No.6
- 回答日時:
> なるほど、ではメモリ以外で解けないとしたらどんな式?なら間違えるんですかね?
間違える?
いや、間違えないでしょう。間違えるのは常に人間の方です。
正確に言うと、CPU設計時にミスをしたり、プログラミング言語の実装時にミスをする、とかあって、「機械が間違える」ように見える、って事はあるでしょうけどね。それにしても突き詰めると「人為的ミス」です。
No.7
- 回答日時:
>n x (n+1) x 8 byte =800,800
>つまり、たったの800 kbyteです。
間違えた 80,800byte≒81 kbyteですね。
n=1000でも 8 Mbyte
今時のパソコンなら余裕です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# 並列プログラミングのπ計算について 1 2022/07/16 22:30
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語: ポインタ 5 2022/06/01 08:33
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# LU分解法のピボッティングについて(C言語/gcc-9) 3 2022/07/11 23:10
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
めちゃきれい
-
65536は2の何乗なのでしょうか?
-
CとFORTRANの計算速度はどちら...
-
VBAで関数をつくる
-
mod でうまく
-
y=(x^2 +3x+1)^4を微分の定義を...
-
FORTRANでの階乗の表現
-
エクセル VBAで 再計算を...
-
理由がわかりません・・・
-
VBでReplace
-
チェックデジット計算できる関...
-
アドオン利率を実質年率に変換
-
加速度から変位の変換について
-
C言語で N行*M列 の逆行列を求...
-
エクセルのセル式で恐縮ですが...
-
10進数から8進数へ
-
smartyで計算を行う方法
-
WAMとSWANの違い
-
剰余の計算方法
-
C言語についてです。 再帰を使...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
65536は2の何乗なのでしょうか?
-
VBAの再計算が反映されない件に...
-
排他的論理和 BCC(水平パリテ...
-
EXCELなどで「返す」という表現
-
C言語の課題で、1年の秒数を計...
-
バッチファイルでウインドウを...
-
骨折リスク評価のFRAXについて...
-
変化させるセルが変化しない
-
CとFORTRANの計算速度はどちら...
-
なぜオーバーフローになるので...
-
数値計算の高速化 (cos, sin, exp)
-
モジュラス103の計算とは何でし...
-
C# 計算処理中に実行中ウィン...
-
モジュロ
-
60進数の四則計算
-
C言語についてです。 再帰を使...
-
引き放し法による除算アルゴリ...
-
Perlで時間の計算
-
傾いた四角形内の範囲の条件式
-
CRC8を教えてください
おすすめ情報