以前にも同じ質問をさせていただいたのですが、解決できなかったので再送します。
Gnome端末を使っています。
x1+2x2+3x3=6
3x1+10x2-4x3=-29
-2x1-4x2+x3=9
という連立方程式をGauss-seidel法で求める問題です。
下記のようにプログラミングすると、
ILL CONDITION i=0
Iteration x1 x2 x3
1 1.0000 1.1034 1.7126
2 -0.2241 0.7406 1.2793
3 0.1135 0.8353 1.3964
4 0.0233 0.8098 1.3651
5 0.0475 0.8166 1.3735
6 0.0410 0.8148 1.3713
7 0.0428 0.8153 1.3719
8 0.0423 0.8152 1.3717
9 0.0424 0.8152 1.3717
10 0.0424 0.8152 1.3717
11 0.0424 0.8152 1.3717
となり、x1=1、x=ー2、x3=3が得られません。
また、
3x1+x2+x3=10
x1+5x2+2x3=21
x1+2x2+5x3=30
を同じプログラミングで解こうとすると、
Iteration x1 x2 x3
1 1.0000 0.9524 0.9032
2 0.8144 0.8752 0.9145
3 0.8210 0.8738 0.9144
4 0.8212 0.8738 0.9144
5 0.8212 0.8738 0.9144
のようになり、x1=1、x=2、x3=5が得られません。
“♯include<stdio.h>
♯include<math.h>
♯define eps 1.e-5
int main(void)
{
double a[3][3],b[3],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][i])<=s){
printf("ILL CONDITION i=%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 /=b[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;
}
”
御指摘いただきたいです。
回答3件
あなたの回答
tips
プレビュー