Python求解线性方程组实例

浏览: 1796

1.Jacobi 解法

                                                  

                                                                        

根据迭代公式可以编写程序如下

#线性方程组求根

def f(x1,x2,x3,count):
y1=0.1*x2+0.2*x3+7.2
y2=0.1*x1+0.2*x3+8.3
y3=0.2*x1+0.2*x2+8.4
if abs(y1-x1)<0.0001 and abs(y2-x2)<0.0001 and abs(y3-x3)<0.0001:
#设定精度为0.0001
print('最终的计算结果为%s%s%s' %(y1,y2,y3))
else:
print('第%s次迭代的计算结果为%s%s%s' %(count, y1,y2,y3))
x1,x2,x3,count=y1,y2,y3,count+1
return f(x1,x2,x3,count)

f(3,5,5,1)
#设置初始根为(3,5,5)

运行程序的结果为

#线性方程组求根实例.py jacobi迭代法
第1次迭代的计算结果为8.7、9.600000000000001和10.0
第2次迭代的计算结果为10.16、11.170000000000002和12.06
第3次迭代的计算结果为10.729000000000001、11.728000000000002和12.666
第4次迭代的计算结果为10.906、11.906100000000002和12.8914
第5次迭代的计算结果为10.968890000000002、11.968880000000002和12.962420000000002
第6次迭代的计算结果为10.989372000000001、11.989373和12.987554000000001
第7次迭代的计算结果为10.9964481、11.996448000000001和12.995749
第8次迭代的计算结果为10.9987946、11.998794610000001和12.99857922
第9次迭代的计算结果为10.999595305、11.999595304000001和12.999517842000001
第10次迭代的计算结果为10.9998630988、11.9998630989和12.9998381218
第11次迭代的计算结果为10.999953934250001、11.99995393424和12.99994523954
最终的计算结果为10.999984441332、11.999984441333002和12.999981573698001

2. seidel 迭代法求解

                                             

根据迭代公式编写代码如下:

#seidel 迭代法求根
def f(x1,x2,x3,count):
y1=0.1*x2+0.2*x3+7.2
y2=0.1*y1+0.2*x3+8.3
y3=0.2*y1+0.2*y2+8.4
if max(abs(y1-x1), abs(y2-x2), abs(y3-x3))<0.0001:
#设定精度为0.0001
print('最终的计算结果为%s%s%s' %(y1,y2,y3))
else:
print('第%s次迭代的计算结果为%s%s%s' %(count, y1,y2,y3))
x1,x2,x3,count=y1,y2,y3,count+1
return f(x1,x2,x3,count)

f(3,5,5,1)
#设置初始根为(3,5,5)

计算结果为

第1次迭代的计算结果为8.7、10.170000000000002和12.174
第2次迭代的计算结果为10.651800000000001、11.799980000000001和12.890356
第3次迭代的计算结果为10.9580692、11.973878120000002和12.986389464000002
第4次迭代的计算结果为10.994665704800001、11.996744463280002和12.998282033616
第5次迭代的计算结果为10.999330853051202、11.99958949202832和12.999784069015906
第6次迭代的计算结果为10.999915763006014、11.999948390103784和12.99997283062196
最终的计算结果为10.999989405134771、11.999993506637871和12.999996582354528

3. 两种方法的比较

显然,我们设置相同的初值,seidel迭代法比jacobi迭代法收敛速度更快。

                                              

                                        

3.7 更新

4.用numpy库求解

>>> from numpy import*
>>> a=matrix([[10,-1,-2],[-1,10,-2],[-1,-1,5]])
>>> b=mat([[72],[83],[42]])
>>> c=linalg.solve(a,b)
>>> c
matrix([[ 11.],
[ 12.],
[ 13.]])
推荐 0
本文由 霍开拓 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册