Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 高斯-赛德尔方法不适用于特定输入_C - Fatal编程技术网

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

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

我已经完成了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
#包括
#包括
#包括
#定义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,如果对您有帮助,请将其标记为“已接受”(单击答案分数下方的绿色复选标记)