• 締切済み

連立方程式

C言語で反復法の「ヤコビ法」と「ガウス・ザイデル法」、消去法を用いて連立方程式を解くプログラムを作りたい。 また、プログラムは任意の元数に対応できるように作りたい。 分かる方がいましたら、回答よろしくお願いします。

みんなの回答

回答No.4

#2ですが、反復法(ガウスザイデル・ヤコビ・CG法など)で解く場合、解が1つでもあれば、そこに収束します。つまり、解けます。 どういうことかというと、連立1次方程式を解く場合、数学的に解が1つしかない場合と、解が無数にある場合があり、そのような方程式であれば解くことができるということです。 解が1つしかない場合とは、中学や高校で学習するような1次方程式のことです。 解が無数にある場合とは、不定方程式となる場合、つまり係数マトリックスのランクが次元数より少なくなる場合です。 もちろん、その中でも解がない場合は反復法でも解けません。 画像の方程式は、解いていないのでわからないですが、多分解が1つしかない場合だと思います。 その場合だと、反復法でも直接法(ガウスの消去・LU分解法など)でもとけます。ただし、反復法で行う場合は、その解の初期値が必ず問題になります。この与え方が悪いと、解が見つからない場合があります。だいたい零ベクトルとして与える場合が多いのではないでしょうか。 また、直接法では解が1つしかない場合についてしか解けません。だから、解が無数にある場合の方程式は解くことができません。 それに対して、反復法ではそのような方程式でも解くことができます。その解に近づいていくはずです。もちろん、直接法で求められる値に対して、少々誤差がででくるとは思います。 その点、反復法のほうが強い方法であるといえます。

回答No.3

プログラムができたとしても、この画像中の連立方程式は反復法では解けないのではないでしょうか。

回答No.2

下のようなフォーマットで 3  //次元数 3 12 27   //係数マトリクス 5 80 405 7 448 5103 27 243 2187   //右辺のベクトル とか入力ファイルを作って、ファイル入力して解くというのはどうでしょうか? 次元数から、Cであればmallocを、c++であればnewを使って動的にメモリを確保すれば、係数マトリックスや、解ベクトル、右辺のベクトルに入力できて、まず、解く前段階の処理を行うことができます。 (”任意の次元数に対応できる”をこれで満たせると思います) あとは、ソルバ(解法)ですが、ヤコビ・ガウスザイデル・ガウスの消去などで行うのであれば、全て、同じ入力形式にしてしまうといいと思います。つまり、ソルバを呼び出して、連立方程式を解かせるときに、それぞれの関数(またはクラスの関数)の入力形式が同じであると、文字を少し変えるだけで違うソルバを用いることができるからです。 [そのようにすると、C++でクラスを使うとき、クラス名を変えてしまうだけで、違うソルバで解いたりすることができます] で、キモのソルバですが、アルゴリズムはもちろん、プログラムはインターネット上に落ちていると思います。しかも、図書館などで数値計算に関する本は、とても数え切れないくらいあります。初心者向けに書かれた本から、上級者向けまでさまざまです。正直、ネットよりも本の方がしっかり書いてると思います。 たとえば、ガウスザイデル法のプログラムでしたら、下のURLにありました。もちろん、動作確認は行っていないので、自分で使えるような形にして、プログラムを作成してください。

参考URL:
http://akita-nct.jp/yamamoto/lecture/2007/5E_comp_app/LinearEquations/concrete_relax_html/node2.html
noname#101303
noname#101303
回答No.1

ちょっと検索すれば、良いサイトが見つかるよ~! http://homepage3.nifty.com/gakuyu/suti/renritu/hanpuku/index.html 後は自分で…。