代码实现;
/*********
求解方程:
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;
依次类推
本文参考以下文章,感谢: