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()
【计算方法】【数值解】简单迭代法求解
于 2022-05-02 17:05:43 首次发布