質問編集履歴

2 修正してもできないため。

uv-

uv- score 24

2017/01/16 13:14  投稿

C言語 Linux
Gnome端末を使っています。
x1+2x2+3x3=6
3x1+10x2-4x3=-29
-2x1-4x2+x3=9
をGauss-seidel法で求める問題で、下記のようにプログラミングすると、エラーはでなかったのですが、よくわからない文字の羅列が続き、止まらなくなりました。どこが間違っているか教えていただきたいです。
という連立方程式を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
が出ません。ご指摘いただければ幸いです。
  • C

    5759 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1 修正してもできないため

uv-

uv- score 24

2017/01/12 16:56  投稿

C言語 Linux
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];
に直しても同じように羅列が出ます。
ご指摘いただければうれしいです
  • C

    5759 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る