質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Q&A

解決済

2回答

1200閲覧

C言語 Linux

uv-

総合スコア26

C

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

0グッド

0クリップ

投稿2017/01/12 07:30

編集2017/01/16 04:15

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
が出ません。ご指摘いただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

プログラムだけを見て判断してますが、実行が止まらないのであれば
for(k=1;;k++){ のループを抜けないのだと思われます。
ループを抜ける条件としては if(anorm/xnorm<eps) なので、この
条件が真にならないと考えられるので、forの条件にk<10等を追加して
ループ回数を制限して原因箇所を特定してみてください。
よくわからない文字の羅列が続くのは、printf("%.4f",x[i]);の書式と
引数の型が合わないか、確保した配列以上の領域(x[3]で宣言してるので
i=3はオーバーします)を参照しているのではないでしょうか。
scanfで入力した値も使っているので、その値を当てはめてループ回数や
配列の参照箇所を確認してみてください。

投稿2017/01/12 08:02

Take-y

総合スコア91

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

bの要素数が0になっていますね。

c

1double a[3][3],b[0],x[3]; 23double a[3][3],b[3],x[3];

投稿2017/01/12 07:47

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2017/01/13 00:19

b[3]だけではダメでしたか。 (できれば修正したのならここにコメントくださいね。気づかないので) 他に怪しそうなところでは、 w /=a[i][i]; が両方とも[i]になっているのは大丈夫でしょうか? 何にしたらいいのか仕様を理解していないのでなんとも言えませんが、jのループのあとなので、 w /= b[i]; でしょうか。 こうすることで一応は動きましたが、正しいのかはわかりません。
uv-

2017/01/17 03:38

ご解答ありがとうございます。コメント遅くなり、申し訳ございません。 #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; } のようにした所、 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、x2=-2、 x3=3 が得られません。御指摘いただけるとありがたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問