1

我已经完成了 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

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

//高斯赛德尔法

#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),
    • 接下来,第二行的总和变为负数,并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 回答