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

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()
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

a9c93f2300

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值