【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21194

ガウスの消去法のプログラムでわからないところ
投稿者---じょー(2005/05/30 16:56:47)


#include<stdio.h>
#define N 3
main()
{ int i,j,k,n;
double a[N][N]={{2.,1.,1.},{1.,3.,1.},{1.,1.,2.}};
double b[N]={4.,5.,4.};
double x[N],y[N];
double d,p,w;
n=N;
for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++) {printf("%lf ",a[i][j]);}
printf(" \n");}
_________________________________

     d=1.0;
for(k=0;k<=n-2;k++)
{ p=a[k][k]; d=d*p;
for(i=k+1;i<=n-1;i++)
{ a[i][k]=a[i][k]/p;
for (j=k+1;j<=n-1;j++)
a[i][j]=a[i][j]-a[i][k]*a[k][j] ;
}
}
d=d*a[n-1][n-1];
printf(" 行列式の値 %lf \n",d);
/*for(i=1;i<=n;i++)
{scanf("%lf",&b[i]);printf(" \n");}*/
printf("\n");
for(i=0;i<=n-1;i++)
{printf(" %lf ",b[i]); printf(" \n");}
printf("\n");

y[1]=b[1] ;
for(i=0;i<=n-1;i++)
{
w=b[i];
for(k=0;k<=i-1;k++)
w=w-a[i][k]*y[k];
y[i]=w;
}
x[n]=y[n]/a[n][n];
for(i=n-1;0<=i;i--)
{ w=y[i];
for(k=i+1;k<=n-1;k++)
w=w-a[i][k]*x[k];
x[i]=w/a[i][i];
}
for(i=0;i<=n-1;i++)
printf(" x%d = %lf \n",i,x[i]);
}


出力結果

2.000000 1.000000 1.000000
1.000000 3.000000 1.000000
1.000000 1.000000 2.000000
 行列式の値 7.000000

4.000000
5.000000
4.000000

x0 = 1.000000
x1 = 1.000000
x2 = 1.000000
Press any key to continue



このプログラムがよくわかりません。(線から上はわかるが、線から下はわからない。)
ガウスの消去法のプログラムなんですけど、線から下の
d=1.0;
for(k=0;k<=n-2;k++)
{ p=a[k][k]; d=d*p;
for(i=k+1;i<=n-1;i++)
{ a[i][k]=a[i][k]/p;
for (j=k+1;j<=n-1;j++)
a[i][j]=a[i][j]-a[i][k]*a[k][j] ;
}
}
d=d*a[n-1][n-1];
printf(" 行列式の値 %lf \n",d);
ここがまずよくわかりません。
forと配列がたくさんあるのでわからないのかもしれないのですが出力結果では行列式の値が「7」になります。
しかし、なんで「7」になるかがわかりません。
最終的にdの値が7になるようなのですが、まったくなりません。
d=d*a[n-1][n-1]を考えてみるとd=d*a[2][2]となりますよね?
そして、a[2][2]は、a[N][N]を見てみると「2」となるはずです。
そうなると、dは「3.5」にならなくてはだめなのですが、どう考えても「3.5」になりません。
いや、根本的に考えが間違っているような気がします。
とにかく、forの考え方が難しくてよくわかりません。
どなたか丁寧に教えてくれたらありがたいです。
長々となってすいません。
どうぞよろしくおねがいします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ガウスの消去法のプログラムでわからないところ 21195 REE 2005/05/30 17:56:03


No.21195

Re:ガウスの消去法のプログラムでわからないところ
投稿者---REE(2005/05/30 17:56:03)


※ソースの添付は「HTML変換ツール」で字下げ!

値の変化がわからないのであれば、
その値を知りたいところに、printfを追加してみてください。

今回の例では、d=d*a[n-1][n-1]の前と後に下記2行をどうぞ
printf("before d=%f, a[n-1][n-1]=%f\n", d, a[n-1][n-1]);
printf("after d=%f\n", d);



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧