我已经完成了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
我找不到要修改的内容。
答案 0 :(得分:1)
虽然它可以应用于对角线上具有非零元素的任何矩阵,但只有当矩阵是对角占优的,或对称的和正定的时,才能保证收敛。
你的示例矩阵不是,所以它不能让方法无法收敛太过惊人。
如果你重新排序方程,最后移动第一个方程(然后系数矩阵成对角占优势),它会快速收敛到近似解
x[0]=0.500006
x[1]=0.333334
x[2]=0.250001
(确切的解决方案是(1/2, 1/3, 1/4)
)。
会发生什么:
轮:
x[0]
获得负值(-0.972/1.876
),x[1]
的值太大,x[1]
的过大值,x[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]
的值变为较小的负值以补偿以及其他轮次:见第2轮。
过了一段时间,你会得到无穷大和NaN。