高斯赛德尔方法不适用于特定输入

时间:2013-05-07 13:14:46

标签: c

我已经完成了gauss-seidel方法的编程,该方法适用于所有输入,但以下公式除外:

    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

当我使用此输入运行时,存在“浮点溢出”的运行时错误。如果我使用整数输入,它工作正常。我的代码如下:

// GAUSS SEIDEL METHOD

#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

我找不到要修改的内容。

1 个答案:

答案 0 :(得分:1)

  

虽然它可以应用于对角线上具有非零元素的任何矩阵,但只有当矩阵是对角占优的,或对称的和正定的时,才能保证收敛。

in the wikipedia article所述。

你的示例矩阵不是,所以它不能让方法无法收敛太过惊人。

如果你重新排序方程,最后移动第一个方程(然后系数矩阵成对角占优势),它会快速收敛到近似解

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),
    • 接下来,第二行的总和变为负值,而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]的负值比第一轮的负值更小,
    • 然后x[0]*a[1][0] + x[2]*a[1][2]为负数,x[1]的值变大以补偿,
    • 然后x[2]的值变为较小的负值以补偿
  3. 以及其他轮次:见第2轮。

  4. 过了一段时间,你会得到无穷大和NaN。