Python算法详解
上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)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。