- ベストアンサー
Jacobi法のアルゴリズムについて
- Jacobi法のアルゴリズムについて質問です。
- 質問者がプログラムを組んだ際の疑問点について説明します。
- 2つのプログラムの違いとそれぞれのアルゴリズムの正確性について説明してください。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
激しくカテゴリー違いですが…。 (1) xnew[i] = b[i]; について ⇒ それでいいんです。 for( j=0; j<n; j++ ) のループを回る度に、xnew がどのように更新されてゆくか、 追跡してみましょう。 for に入る前 : xnew[i] = b[i] j が 0 のとき : xnew[i] = b[i] - a[i][0] * xold[0] j が 1 のとき : xnew[i] = b[i] - a[i][0] * xold[0] - a[i][1] * xold[1] 以下同様… ちゃんと、xnew[i] = b[i] - Σ{j≠i}( a[i][j] * xold[j] ) になっているでしょう? x[i]_{m+1} = Σ{j≠i}( b[i] - a[i][j] * x[j]_{m} ) だったら、 xnew[i] = b[i]; は、for( j=0; j<n; j++ ) の { } 中に入っているはずです。 for( i が何のループで、for( j が何のループか、確認のこと。 それよりも、a[i][i] で割るところは、xold[i] = xnew[i] / a[i][i]; じゃないとね。 k++ するときに、一回前の xnew を今度は xold と見なすようになるのだから。 (2) 1つ目のプログラムについて ⇒ ダメな箇所が三つあります。 ・ for( j の範囲が違う。 for( j=0; j<i; j++ ) if( j != i ) では、結局 Σ{j<i} にしかなりません。 Σ{j≠i}( a[i][j] * x2[j] ) を求めたいなら、2つ目のプログラムのように for( j=0; j<n; j++ ) if( j != i ) でないと。 ・ temp を初期化してない。 for( j=0; j<n; j++ ) の中身を j が 0 で通るとき、未代入の temp を右辺で参照していますね。 これでは、for が終わったとき、temp = (最初に temp に入ってた何か) + Σ{j≠i}( a[i][j] * x2[j] ) になっていまいます。for の前に temp = 0; が必要です。 どうせ初期化するなら、このとき temp = b[i] としてしまえば、2つ目のプログラムの考え方になります。 ・ x1 を x2 へコピーしてない。 このままでは、for( m のループを何度回っても、1度だけ回ったのと同じことです。 x1[] と x2[] は、同じ変数でいいんじゃないですかね。
お礼
なるほど、Jacobi法の意味も含めてよく理解できました。 ありがとうございます。