C 高斯-赛德尔方法不适用于特定输入
我已经完成了gauss-seidel方法的编程,该方法适用于除以下等式外的所有输入:C 高斯-赛德尔方法不适用于特定输入,c,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 使用此输入运行时,出现“浮点溢出”的运行时错误。如果使用整数输入,则工作正常。我的代码如下: //高斯-赛德尔法 #include <stdio.h> #inc
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
#包括
#包括
#包括
#定义e 0.001
void main(){
int i,j,n,计数;
双a[10][10],x[10];
双和,温度,误差,大;
printf(“输入方程式的数目:”);
scanf(“%d”和“&n”);
printf(“输入方程式的系数:\n”);
对于(i=0;i
虽然它可以应用于对角线上元素非零的任何矩阵,但只有当矩阵为对角占优矩阵或对称正定矩阵时,才能保证收敛
如前所述
您的示例矩阵不是,因此该方法不收敛也不应该太令人惊讶
如果对方程重新排序,将第一个方程移到最后(然后系数矩阵成为对角占优),它将快速收敛到近似解
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轮
一段时间后,你会得到无穷大和N
虽然它可以应用于对角线上元素非零的任何矩阵,但只有当矩阵为对角占优矩阵或对称正定矩阵时,才能保证收敛
如前所述
您的示例矩阵不是,因此该方法不收敛也不应该太令人惊讶
如果对方程重新排序,将第一个方程移到最后(然后系数矩阵成为对角占优),它将快速收敛到近似解
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轮
过了一段时间,你会得到无穷大和N。你试过调试它吗?你看到的很可能是由0除法引起的错误。按照目前的格式,无法理解这段代码的开头或结尾。我建议你整理它,并按照@IvayloStrandjev的建议通过调试器运行它。对不起,我刚才给出的答案是否定的nsense,让我再想一想。你试过调试它吗?你看到的很可能是由0除法引起的错误。按照目前的格式,无法确定这段代码的开头或结尾。我建议你整理一下,并按照@IvayloStrandjev的建议通过调试器运行它。对不起,我认为我刚才给出的答案是胡说八道的,让我来看看我再想想。非常感谢丹尼尔·菲舍尔……详细的答案是真的helpful@user71067,如果它对您有帮助,请将其标记为“已接受”(单击分数下方的绿色复选标记以获取答案)非常感谢Daniel Fischer…详细的答案非常简单helpful@user71067,如果对您有帮助,请将其标记为“已接受”(单击答案分数下方的绿色复选标记)