【计算方法】【数值解】简单迭代法求解

import math
from sympy import diff
from sympy import symbols

def findk():#预估迭代次数k
    x=symbols('x')
    global k
    x0=b
    x1=g(x0)
    L=max(dg(x).subs(x,a),dg(x).subs(x,b))#用ab的值代入试L,这里不严谨,但没有找到合适的方法
    formula1=eps*(1-L)
    try:
        k=math.ceil(math.log(formula1/abs(x1-x0),math.e)/math.log(L,math.e))
    except:
        print("无法求出迭代次数,用20代替")
        k=20

def ifRoot(a,b):
    x=symbols('x')
    if ( g(a)>=a and g(a)<=b ) and ( g(b)>=a and g(b)<=b ):#判断是否满足定义域包含值域
        print("定义域包含值域")
        if abs(max(dg(x).subs(x,a),dg(x).subs(x,b)))<1 :
            #判断是否满足Lipschitz条件
            #用ab的值代入试L,这里不严谨,但没有找到合适的方法
            findk()#预估迭代次数k
            print("满足Lipschitz条件")
            return True
        else:
            findk()
            print("不满足Lipschitz条件,全局收敛定理不能保证构造的简单迭代方法收敛")
            return False
    else :
        print("a:%f g(a):%f" %(a,g(a)))
        print("b:%f g(b):%f" %(b,g(b)))
        print("定义域不包含值域,全局收敛定理不能保证构造的简单迭代方法收敛")
        findk()
        return False    

def IterationMethod():
    global a
    global b
    global eps
    eps=0.5*math.pow(10,-2)#精度设置
    global x
    a=1.5
    b=2
    if(ifRoot(a,b)):
        x=b
        print("要满足精度%.11f需要迭代%d次" % (eps,k))
        for k1 in range(k):
            x=g(x)
            print("第%d次迭代:x的值为:%f,f(x)的值为:%f)" %(k1+1, x, f(x)))
    else:
        x=b
        print("要满足精度%.11f需要迭代%d次" % (eps,k))
        for k1 in range(k):
            x=g(x)
            print("第%d次迭代:x的值为:%f,f(x)的值为:%f)" %(k1+1, x, f(x)))

def f(x):#原函数
    return g(x)-x
    
def g(x):#新构建的迭代函数
    return (x+1)**(1/2)

def dg(x):#迭代函数g(x)求一阶导数,用来求k值并且判断是否满足全局收敛定理
    return diff(g(x),x)

if __name__ == "__main__":
    IterationMethod()
    

你可能感兴趣的:(算法習作,python)