1

次の方程式を除いて、すべての入力に対して機能するガウスザイデル法のプログラミングを行いました。

    1.876 x1+2.985 x2-11.620 x3=-0.972

    12.214 x1+2.367 x2 +3.672 x3=7.814

    2.412 x1+9.879 x2 +1.564 x3 =4.890

この入力で実行すると、「浮動小数点オーバーフロー」の実行時エラーが発生します。整数入力を使用している場合は正常に動作しています。私のコードは次のとおりです。

//ガウスザイデル法

#include  <stdio.h>
#include <conio.h>
#include <math.h>
#define e 0.001

void main() {

int i,j,n,count;
double a[10][10],x[10];
double sum,temp,error,big;

printf("Enter the number of equations: ");
scanf("%d",&n) ;
printf("Enter the co-efficients of the equations: \n");

    for(i=0;i<n;i++) {
        for(j=0;j<n+1;j++) {
          printf("a[%d][%d]= ",i,j);
          scanf("%lf",&a[i][j]);
        }
    }

     for(i=0;i<n;i++)
        x[i]=0;

    count=1;

    do {
        big=0;
        for(i=0;i<n;i++) {
            sum=0;

            for(j=0;j<n;j++) {
                if(j!=i) {
                    sum = sum+a[i][j]*x[j];
                }
            }

            temp = (a[i][n]-sum)/a[i][i];
            error = fabs((x[i]-temp)/temp);

            if(error>big) {
                big=error;
            }

            x[i]=temp;
            printf("%d\tx[%d] =%lf",count,i,x[i]);
        }

        printf("\n");
        count++;

    }while(big>=e);

    printf("\n\nconverges to solution");

    for(i=0;i<n;i++) {
        printf("\nx[%d]=%lf",i,x[i]);
    }
    getch();
}//end

変更する対象が見つかりません。

4

1 に答える 1

1

対角要素が非ゼロの任意の行列に適用できますが、収束が保証されるのは、行列が対角優勢であるか、対称かつ正定である場合のみです。

ウィキペディアの記事に記載されているとおりです。

あなたの例の行列はそうではないので、メソッドが収束しないことはあまり驚くべきことではありません.

方程式を並べ替える場合、最初の方程式を最後に移動すると (係数行列が対角線上で支配的になります)、近似解にすばやく収束します。

x[0]=0.500006
x[1]=0.333334
x[2]=0.250001

(正確な解は です(1/2, 1/3, 1/4))。

何が起こるか:

  1. 円形:

    • まず、負の値 ( ) をx[0]取得し、-0.972/1.876
    • 次に、2 行目の合計がマイナスになり、x[1]値が大きくなりすぎます。
    • 次に、 の大きすぎる値を補正するためにx[1]x[2]負の値も取得します。
  2. 円形:

    • とのx[1]*a[0][1] + x[2]*a[0][2]両方が負であり、とが正であるため、合計は正です。したがって、最初のラウンドよりもさらに小さい負の値を取得し、x[2]a[0][2]x[1]a[0][1]x[0]
    • thenx[0]*a[1][0] + x[2]*a[1][2]は負であり、x[1]補償するために の値が大きくなります。
    • の値は、x[2]補正するために小さい負の値になります。
  3. 以降のラウンド: ラウンド 2 を参照してください。

しばらくすると、無限大と NaN が得られます。

于 2013-05-07T14:11:07.340 に答える