教えてください

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

教えてください

#1

投稿記事 by » 14年前

ガウスの消去法のプログラミングをつくりました。
実行結果に
0.0 0.0 0.0 0.0
0.0 1.0 3.0 14.0
0.0 0.0 1.0 3.0
0.0 0.0 0.0 1.0
このような表示をするには、どのようにすればよいですか?
間違っているところや直すとよくなるなどアドバイスなどありましたらお願いします。

また、数値解析の方法でやろうと思いましたが、うまくいきませんでした。
この方法の場合は、下記のプログラムとどのように違ってくるんでしょうか?

コード:

 #include "stdafx.h"

// 関数のプロトタイプ宣言
void   decomp(void);
void   solver(void);
// 係数マトリックス,右辺(グローバル変数,余裕を見て10の大きさ)
float tk[10][10]={0}, tf[10]={0}; 

// 答えをストアする変数(グローバル変数)
float tu[10]={0};

// 方程式サイズ
int nn=3;

//====メインプログラム====//
int _tmain(int argc, _TCHAR* argv[])
{
	//係数マトリックス代入
	tk[1][1]=2.0f;  tk[1][2]=6.0f;  tk[1][3]=23.0f;
	tk[2][1]=3.0f;  tk[2][2]=4.0f;  tk[2][3]=27.0f;
	tk[3][1]=4.0f;  tk[3][2]=14.0f; tk[3][3]=60.0f;
	//右辺
	tf[1]=34; 
	tf[2]=66;
	tf[3]=68;
	//連立方程式の呼び出し
	decomp();
	int i,j;
	for(i=1; i<=3; i++){
		for(j=1;j<=3;j++){
			printf("%5.3f \n", tk[i][j]);
		}
	}
	//後退代入
	solver();
	//結果の出力
	//int i,j;
	for(i=1; i<=3; i++){
		for(j=1;j<=3;j++){
			printf("%5.3f \n", tk[i][j]);
		}
	}
	for(i=1; i<=3; i++){
		printf("%5.3f \n", tu[i]);
		
	}

	return 0;
}
void decomp(void){
	int i,j,k;
	float sum1,sum2;
	for(i=1;i<=nn;i++){
		sum1=tk[i][i];
		tf[i]=tf[i]/sum1;
		for(j=1;j<=nn;j++){
			tk[i][j]=tk[i][j]/sum1;
		}
		for(j=i+1;j<=nn;j++){
			sum2=tk[j][i];
			tf[j]=tf[j]-tf[i]*sum2;
			for(k=1;k<=nn;k++){
				tk[j][k]=tk[j][k]-tk[i][k]*sum2;
			}
		}
	}
}
void solver(void){
	int i,j,k;
	float sum;
	for(i=1;i<=nn;i++){
		for(j=i-1;j>=1;j--){
			sum=tk[j][i];
			tf[j]=tf[j]-tf[i]*sum;
			for(k=0;k<=nn;k++){
				tk[j][k]=tk[j][k]-tk[i][k]*sum;
			}
		}
	}
	for(i=1;i<=nn;i++){
			tu[i]=tf[i];
	}
}

non
記事: 1097
登録日時: 14年前

Re: 教えてください

#2

投稿記事 by non » 14年前

冬 さんが書きました: 実行結果に
0.0 0.0 0.0 0.0
0.0 1.0 3.0 14.0
0.0 0.0 1.0 3.0
0.0 0.0 0.0 1.0
このような表示をするには、どのようにすればよいですか?
上記結果のようになるのがわかりません。
与えられた式での結果は
1.000 0.000 0.000 22.182
-0.000 1.000 0.000 -3.818
0.000 0.000 1.000 0.545
このようになるのではないですか?
non

アバター
さかまき
記事: 92
登録日時: 14年前

Re: 教えてください

#3

投稿記事 by さかまき » 14年前

>「この方法の場合は、下記のプログラムとどのように違ってくるんでしょうか?」
方法がわからないのに、(うまくいかなかったにしても)どうやってやったんでしょうか?

>「数値解析の方法でやろうと思いましたが、うまくいきませんでした」
「やったところまでを見せて下さい」
よくある問答になります。

non
記事: 1097
登録日時: 14年前

Re: 教えてください

#4

投稿記事 by non » 14年前

もしかしたら、前進消去で、三角行列を作るところまでの途中結果が欲しいということなのでしょうか?
それでも
1.000 3.000 11.500
-0.000 1.000 1.500
0.000 0.000 1.000
実行結果は、こうじゃないかな?
non

Re: 教えてください

#5

投稿記事 by » 14年前

上に書いたのは、例えなので皆さんが書いたのが答えです。紛らわしくてすいません。
三角行列で実行結果に表示したいということです。

box
記事: 2002
登録日時: 14年前

Re: 教えてください

#6

投稿記事 by box » 14年前

for文を使ったループでprintf()を使っている箇所で、
1~3
ではなくて
0~3
にするとかそういう単純な話ではなくて、別の話なんでしょうかね。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

non
記事: 1097
登録日時: 14年前

Re: 教えてください

#7

投稿記事 by non » 14年前

>ガウスの消去法のプログラミングをつくりました。

自分で、プログラムを作ったなんて書くから、何を言っているのか意味不明になるのです。
なんで、掃出し法のプログラムを書けるのに、改行のタイミングがわからないのってことに。

29行から32行を、下のように変えれば良いと思われます。

コード:

    for(i=1; i<=3; i++){
        for(j=1;j<=3;j++){
            printf("%6.3f ", tk[i][j]);
        }
        printf("\n");
    }
non

box
記事: 2002
登録日時: 14年前

Re: 教えてください

#8

投稿記事 by box » 14年前

decomp()
では
tk[0][何とか]

tk[何とか][0]
にアクセスしていないのに
solver()
では
それらにアクセスして、値を変更している。
そのポリシーで本当に大丈夫なのか、個人的には気になります。
いや、大丈夫だったらいいんですけど。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る