上QQ阅读APP看书,第一时间看更新
3.6.2 实践演练——解决“非线程方程组”问题
非线性方程是指含有指数函数和余弦函数等非线性函数的方程,例如,ex−cos(πx)=0。与线性方程相比,无论是解的存在性,还是求解的计算公式,非线性方程都比线性方程要复杂得多,对于一般线性方程f(x)=0,既无直接法可用,也无一定规则可寻。
下面的实例文件Iteration.py演示了使用迭代算法解决“非线程方程组”问题的过程。
源码路径:daima\第3章\Iteration.py
import math #为了使用cos函数 def takeStep(Xcur): Xnex=[0,0,0]; Xnex[0]=math.cos(Xcur[1]*Xcur[2])/3.0+1.0/6 Xnex[1]=math.sqrt(Xcur[0]*Xcur[0]+math.sin(Xcur[2])+1.06)/9.0-0.1 Xnex[2]=-1*math.exp(-1*Xcur[0]*Xcur[1])/20.0-(10*math.pi-3)/60 return Xnex def initialize(): X0=[0.1,0.1,-0.1] return X0 def ColculateDistance(Xcur,Xnew): temp=[Xcur[0]-Xnew[0],Xcur[1]-Xnew[1],Xcur[2]-Xnew[2]] dis=math.sqrt(temp[0]*temp[0]+temp[1]*temp[1]+temp[2]*temp[2]) return dis def iteration(eps,maxIter): cur_eps=10000 Xcur=initialize() Xnew=[0,0,0] iterNum=1 print("--------------------------开始迭代--------------------------") print(" 迭代次数 | Xk1 | Xk2 | Xk3 | eps ") while (cur_eps>eps and iterNum<maxIter) : Xnew=takeStep(Xcur); cur_eps=ColculateDistance(Xcur,Xnew) print(" %d %.8f %.8f %.8f %8.8f"%(iterNum,Xcur[0],Xcur[1],Xcur[2],cur_eps)) iterNum+=1 Xcur=Xnew return 0 iteration(10**-10,200)
执行后会输出:
--------------------------开始迭代-------------------------- 迭代次数 | Xk1 | Xk2 | Xk3 | eps 1 0.10000000 0.10000000 -0.10000000 0.58923871 2 0.49998333 0.00944115 -0.52310127 0.00941924 3 0.49999593 0.00002557 -0.52336331 0.00023523 4 0.50000000 0.00001234 -0.52359814 0.00001231 5 0.50000000 0.00000003 -0.52359847 0.00000031 6 0.50000000 0.00000002 -0.52359877 0.00000002 7 0.50000000 0.00000000 -0.52359878 0.00000000
使用迭代法求根时应注意以下两种可能发生的情况。
(1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代次数进行限制。
(2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。