Gnome端末を使っています。
x1+2x2+3x3=6
3x1+10x2-4x3=-29
-2x1-4x2+x3=9
という連立方程式をGauss-seidel法で求める問題で、下記のようにプログラミングすると、エラーはでなかったのですが、よくわからない文字の羅列が続き、止まらなくなりました。どこが間違っているか教えていただきたいです。
♯include<stdio.h>
♯include<math.h>
♯define eps 1.e-5
int main(void)
{
double a[3][3],b[0],x[3];
double s,w,anorm,xnorm;
int i,j,k,n;
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%lf",&a[i][j]);
}
scanf("%lf",&b[i]);}
for(i=0;i<n;i++){
s=0.0;
for(j=0;j<n;j++){
if(i==j) continue;
s+=fabs(a[i][j]);
}
if(fabs(a[i][j])<=s){
printf("INN CONDITION iI=%d\n",i);
break;
}
}
for(i=0;i<n;i++){
x[i]=0.0;
}
printf("Iteration x1 x2 x3\n");
for(k=1;;k++){
anorm=0.0;
xnorm=0.0;
for(i=0;i<n;i++){
w=b[i];
for(j=0;j<n;j++){
if(j==i) continue;
w -=a[i][j]*x[j];
}
w /=a[i][i];
anorm+=fabs(x[i]-w);
xnorm+=fabs(w);
x[i]=w;
}
printf("%6d",k);
for(i=0;i<n;i++){
printf("%.4f",x[i]);
}
printf("\n");
if(anorm/xnorm<eps)
break;
}
return 0;
}
ご回答いただき、ありがとうございます。
double a[3][3],b[0],x[3];
↓
double a[3][3],b[3],x[3];
に直しても同じように羅列が出ます。
ご指摘いただければうれしいです
ご返答いただき、ありがとうございます。連絡が遅くなり申し訳ございません。
w /=b[i];に訂正した所、ループはしなくなったのですが、
INN CONDITION iI=0
Iteration x1 x2 x3
11.00001.10341.7126
2-0.22410.74061.2793
30.11350.83531.3964
40.02330.80981.3651
50.04750.81661.3735
60.04100.81481.3713
70.04280.81531.3719
80.04230.81521.3717
90.04240.81521.3717
100.04240.81521.3717
110.04240.81521.3717
となり、得たい結果 x1=1、x2=-2、x3=3
が出ません。ご指摘いただければ幸いです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。