首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gauss迭代法

Gauss迭代法
EN

Stack Overflow用户
提问于 2021-12-01 15:37:22
回答 1查看 192关注 0票数 0

我正在编写一个用Gauss迭代法求解方程组Ax=B的程序。

代码语言:javascript
复制
#include <math.h>
#include <stdlib.h>
#include <stdio.h>

int main(void) {
    double **a, *b, *x, *f, eps = 1.e-2, c;  
    int n = 3, m = 3, i, j, bool = 1, d = 3;
    /* printf("n=") ; scanf("%d", &n);
       printf("m=") ; scanf("%d", &n) */
   
   
    a =malloc(n * sizeof *a);
    for (i = 0; i < n; i++) 
        a[i] = (double*)malloc(m * sizeof(double));

    b = malloc(m * sizeof *b);
    x = malloc(m * sizeof *x) ;  
    f = malloc(m * sizeof *f) ;
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) { 
            printf("a[%d][%d]=", i, j); 
            scanf("%le", &a[i][j]); 
            if(fabs(a[i][i])<1.e-10) return 0 ; 
        }

        printf("\n") ;
    }
        
    printf("\n") ;
        
    for (i = 0; i < n; i++) {
        for (j = 0; j < m; j++) { 
            printf("a[%d][%d]=%le  ", i, j, a[i][j]); 
        }
         
        printf("\n") ;
    }
    
    for (j = 0; j < m; j++) { 
        printf("x[%d]=", j); 
        scanf("%le", &x[j]); 
    } //intial guess
    
    printf("\n") ;
    
    for (j = 0; j < m; j++) { 
        printf("b[%d]=", j); 
        scanf("%le", &b[j]); 
    }
    
    printf("\n")  ;

    while (1) {
        bool = 0;
        for (i = 0; i < n; i++) {
            c = 0.0;
            for (j = 0; j < m; j++) 
                if (j != i) 
                    c += a[i][j] * x[j];  
            f[i] = (b[i] - c) / a[i][i];
        }
       
        for (i = 0; i < m; i++)  
            if (fabs(f[i] - x[i]) > eps) 
                bool = 1;
       
        if (bool == 1) 
            for (i = 0; i < m; i++) 
                x[i] = f[i];
        else if (bool == 0) 
            break;
    }

    for (j = 0; j < m; j++) 
        printf("%le\n", f[j]);

    return 0;
}

停止循环的条件是,所有x的先前近似减去电流近似小于epsilon。好像我是按照算法做的,但是程序不起作用。我在哪里犯了个错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-01 18:45:16

虽然不是最严格的条件,但保证Jacobi和Gauss方法收敛的通常条件是对角优势,

代码语言:javascript
复制
abs(a[i][i]) > sum( abs(a[i][j]), j=0...n-1, j!=i)

这个测试也很容易实现为在迭代之前运行的检查。

这些不等式中的相对间隙越大,该方法的收敛速度就越快。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70187066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档