关于雅可比迭代法的理解

代码实现;

/*********
求解方程:
    8 * x1 - 3 * x2 + 2 * x3 = 20
    4 * x1 + 11 * x2 - x3 = 33
    6 * x1 + 3 * x2 + 12 * x3 = 36

    精确解:
    x1 = 3, x2 = 2, x3 = 1
--->
迭代公式:
    x1^(k+1) = (3 * x2^(k) - 2 * x3^(k) + 20) / 8;
    x2^(k+1) = (-4 * x1^(k) + 1 * x3^(k) + 33) / 11;
    x2^(k+1) = (-6 * x1^(k) - 3 * x2^(k) + 36) / 12;
*/

#include <stdio.h>
#include <stdlib.h>

struct X {
    float x1;
    float x2;
    float x3;
};

X jcobi(X& v) {
    X r;
    r.x1 = (3 * v.x2 - 2 * v.x3 + 20) / 8;
    r.x2 = (-4 * v.x1 + v.x3 + 33) / 11;
    r.x3 = (-6 * v.x1 - 3 * v.x2 + 36) / 12;
    return r;
}

int main() {

    X v = {0,0,0};

    printf("迭代次数:0: x1=0.0, x2=0.0, x3=0.0\n");

    int iteration = 10;
    while (iteration-- > 0) {
        v = jcobi(v);
        printf("迭代次数:%d: x1=%f, x2=%f, x3=%f\n", 10 - iteration, v.x1, v.x2, v.x3);
    }

    printf("最终结果: x1=%f, x2=%f, x3=%f\n", v.x1, v.x2, v.x3);

    return 0;
}

输出结果:

迭代次数:0: x1=0.0, x2=0.0, x3=0.0
迭代次数:1: x1=2.500000, x2=3.000000, x3=3.000000
迭代次数:2: x1=2.875000, x2=2.363636, x3=1.000000
迭代次数:3: x1=3.136364, x2=2.045455, x3=0.971591
迭代次数:4: x1=3.024148, x2=1.947831, x3=0.920455
迭代次数:5: x1=3.000323, x2=1.983988, x3=1.000969
迭代次数:6: x1=2.993753, x2=1.999971, x3=1.003842
迭代次数:7: x1=2.999029, x2=2.002621, x3=1.003131
迭代次数:8: x1=3.000200, x2=2.000638, x3=0.999831
迭代次数:9: x1=3.000282, x2=1.999912, x3=0.999741
迭代次数:10: x1=3.000032, x2=1.999874, x3=0.999881
最终结果: x1=3.000032, x2=1.999874, x3=0.999881

本人在学习雅可比迭代法的过程中,一直没有理解,通过下面的文章才理解,并进行记录。

说明:

1、迭代公式里面的k和k+1,不是幂,而是迭代次数。第0次迭代是指定的,第1次迭代,是把第0次的结果带进去算出来的。

迭代次数0(直接指定):x1=0.0,x2=0.0,x3=0.0

迭代次数1:

x1 = (3 * x2 - 2 * x3 + 20) / 8 =  (3 * 0 - 2 * 0 + 20) / 8 = 2.5000;

x2 = (-4 * x1 + x3 + 33) / 11 = (-4 * 0 + 0 + 33) / 11 = 3.000;

x3 = (-6 * x1 - 3 * x2 + 36) / 12 = (-6 * 0 - 3 * 0 + 36) / 12 = 3.000;

依次类推

本文参考以下文章,感谢:

1、雅克比(Jacobi)迭代法求解线性方程组_jacobi迭代法-优快云博客

2、雅克比迭代法_百度百科

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值