あなたの「必」の書き順を教えてください

現在あらかじめ与えられた連立方程式をガウスの消去法を用いて、
求めるというプログラムをC言語で作っています。
しかし学校ではまだ行列のやっておらず、
ガウスの消去法についても説明があやふやでした。

一応プログラムは出来たのですが明らかに無駄が多すぎて困っています。

与えられた方程式は下記の通りです。

2x + 3y + 4z = 20
3x - 2y + 5z = 14
5x + 4y - 7z = -8

プログラムは以下の通りです。


#include <stdio.h>


int main(void){

double a[3][3] = {{2, 3, 4},//(1)
{3, -2, 5},//(2)
{5, 4, -7}};//(3)

double b[3] = {20, 14, -8};

double x = 0;
double y = 0;
double z = 0;

int i;

//前進消去
//(1)÷2 ・・・(1)'

for(i = 0; i < 3; i++){
a[0][i] = a[0][i] / 2;
}
b[0] = b[0] / 2;

//(2)-(1)'×3 ・・・(2)'
for(i = 0; i < 3; i++){
a[1][i] = a[1][i] - a[0][i] * 3;
}
b[1] = b[1] - b[0] * 3;

//(3)-(1)'×5 ・・・(3)'
for(i = 0; i < 3; i++){
a[2][i] = a[2][i] - a[0][i] * 5;
}
b[2] = b[1] - b[0] * 5;

//(2)'÷6.5 ・・・(2)''
for(i = 0; i < 3; i++){
a[1][i] = a[1][i] / 6.5;
}
b[1] = b[1] / 6.5;

//(2)''×3.5 + (3) ・・・(3)''
for(i = 0; i < 3; i++){
a[2][i] = a[2][i] + a[1][i] * 3.5;
}
b[2] = b[2] + b[1] * 3.5;

//(3)''÷3.53846でzを求める
z = b[2] / a[2][1];

//後退代入
//(2)''にzを代入してyを求める
a[1][1] = a[1][1] * z;
y = b[1] - a[1][1];

//(1)'にyとzを代入してxを求める
a[0][1] = a[0][1] * y;
a[0][2] = a[0][2] * z;
x = b[0] - a[0][1] - a[0][2];

printf("\n x = %f \n y = %f \n z = %f \n", x, y, z);

return 0;
}

制作はvc++を用いています。
ここからどうやって短くしていけばよいかがわかりせん。
アドバイスや指摘があればお願いいたします。

A 回答 (1件)

このプログラムは、3×3の方程式のみしか解けないですね。


ですから、手で計算する場合と同様にプログラムを書いてしまっています。

つまりヒントは、n×nの方程式をガウスの消去法で解くように書けば良いです。
数値計算の本にはアルゴリズムが必ず載っています。
参考にすると良いと思います。
    • good
    • 0
この回答へのお礼

ガウスの消去法について1から学んでみました。
付属の消去法のプログラムもあったのでそれを見ながらの一度書いてみて理解できました。
ありがとうございました。

お礼日時:2012/02/03 01:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報