ガウスの消去法のプログラムのつくりかた

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

ガウスの消去法のプログラムのつくりかた

#1

投稿記事 by E » 14年前

課題でこのようなものがでました。
1.課題で与えられたガウスの消去法のプログラムを完成し提出しなさい.
2.最終的にできあがる係数マトリックス tk[10][10]の内容を行1~3,列1~3の範囲でプリントアウトして,対角成分が1,左下の3角形の係数がゼロになっているか確認しなさい.なっていない場合はその理由を考察しなさい.
(なっていなくても間違いではないが,なぜ?)

とりあえず、解だけ出るプログラムを作ろうとしましたが、実行すると0が出てきてしまいます。どこが間違っているか教えてください。

また、実行結果に
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], tf[10]; 

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

// 方程式サイズ
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();
//後退代入
   solver();
//結果の出力
  int i;
 for(i=1; i<=3; i++){
   printf("%5.3f \n", tu[i]);
 }

 return 0;
}


void decomp(){
int i,j,k,n;
i=0;
j=0;
k=0;
n=1;

for( j = i+1; j < n; j++ ){
tk[i][j] /= tk[i][i];
}
tf[i] /= tk[i][i];
for( k = i+1; k < n; k++ ){
for( j = i+1; j < n; j++ ){
tk[k][j] -= tk[i][j] * tk[k][i];
}
tf[k] -= tf[i] * tk[k][i];
} 
}

void  solver(){
int i,j,n;
i=0;
j=0;
n=1;

for( i = n-1; i >= 0; i-- ){
for( j = i+1; j < n; j++ ){
tf[i] -= tk[i][j] * tf[j];
}
}
}
 

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: ガウスの消去法のプログラムのつくりかた

#2

投稿記事 by h2so5 » 14年前

コード:

int i,j,n;
i=0;
j=0;
n=1;
 
for( i = n-1; i >= 0; i-- ){
for( j = i+1; j < n; j++ ){
この条件だとループ内が処理されないことはお分かりですか?
j < n を満たすことは絶対にありません。

[追記]

コード:

for( j = i+1; j < n; j++ ){
tk[i][j] /= tk[i][i];
}
ここも同様です。このループは1度も実行されません。

E

Re: ガウスの消去法のプログラムのつくりかた

#3

投稿記事 by E » 14年前

わかりました。ありがとうございます。

閉鎖

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