数值分析——求方程解的不动点迭代法和斯特芬森法(Python实现)

一、不动点迭代法求方程的解

import sympy
#迭代的方程为  f(x)=pow(x,3)-x-1
def psi(x):
    return pow(x+1,1/3)


def dif(x0):  #求导函数用于判断最后的是否局部收敛
    x = sympy.Symbol('x')
    Y = pow(x+1,1/3)
    difY=(sympy.diff(Y, x))
    a=difY.subs(x,x0)
    return a


def Fix(x0):
    p0=psi(x0)
    x1=p0
    k=0
    while k>=0:
        if abs(x1-x0)<10e-9:
            
            print("方程的根为",x1)
            print("迭代次数为",k)
            if abs(dif(x0))<1:
                print("此迭代局部收敛")
            else:
                print("此迭代非局部收敛")
            break
        else:
            x0=x1
            p0=psi(x0)
            x1=p0
            print("第",k+1,"次迭代值为",x0)
        k=k+1
    return x0    


Fix(1.5)

运行结果

第 1 次迭代值为 1.3572088082974532
第 2 次迭代值为 1.3308609588014277
第 3 次迭代值为 1.325883774232348
第 4 次迭代值为 1.324939363401885
第 5 次迭代值为 1.3247600112927027
第 6 次迭代值为 1.3247259452268871
第 7 次迭代值为 1.324719474534364
第 8 次迭代值为 1.3247182454489357
第 9 次迭代值为 1.324718011988197
第 10 次迭代值为 1.3247179676430874
方程的根为 1.3247179592198772
迭代次数为 10
此迭代局部收敛

二、斯特芬森(Stephens)迭代法

# 斯蒂芬斯加速迭代,同样的例题,不动点迭代法用这个迭代方程还无法迭代,需要另一个迭代方程
#但这种方法即使是使用不动迭代的那个方程依旧可以迭代,而且这个方法迭代两次,用不动点迭代要十次迭代
import sympy
#迭代的方程为  f(x)=pow(x,3)-x-1   与不动点迭代是同个例子,但迭代方程不同
def psi(x):
    return pow(x,3)-1 #这个迭代方程用不动点迭代方法无法迭代,发散


def dif(x0):  #求导函数用于判断最后的是否局部收敛
    x = sympy.Symbol('x')
    Y = pow(x+1,1/3)
    difY=(sympy.diff(Y, x))
    a=difY.subs(x,x0)
    return a


def Fix(x0):  #x0是选取的初值
    p0=psi(x0)
    y0=p0
    z0=psi(y0)
    k=0
    while k>=0:

        if abs(y0-x0)<10e-9:
            
            print("方程的根为",x0)
            print("迭代次数为",k)
            if abs(dif(x0))<1:
                print("此迭代局部收敛")
            else:
                print("此迭代非局部收敛")
            break
        else:
            x0=x0-((y0-x0)**2)/(z0-2*y0+x0)
            y0=psi(x0)
            z0=psi(y0)
            
            print("第",k+1,"次迭代值为",x0)
        k=k+1
    return x0    


Fix(1.5)

运行结果

第 1 次迭代值为 1.4162929745889388
第 2 次迭代值为 1.355650441476644 
第 3 次迭代值为 1.3289487772840107
第 4 次迭代值为 1.3248044890410438
第 5 次迭代值为 1.3247179939688145
第 6 次迭代值为 1.3247179572447527
方程的根为 1.3247179572447527     
迭代次数为 6
此迭代局部收敛

你可能感兴趣的:(数值分析,python,算法)