编程用不动点迭代求方程 x**5 +x=1的解,精确到8位小数。
# 编程用不动点迭代求方程 x**5 +x=1的解,精确到8位小数。
import numpy as np
import sympy as sp
from numpy import sign
import easygui as g
m=0
#------函数定义
def fun1(x):
f=x**5 +x-1 #亦可用隐函数代替-> fun=lambda x: x**5+x-1
return f
#------迭代格式的判断
def dd_form(a,b,fun2):
global m
x=sp.symbols("x")
ds=sp.diff(fun2,x) #ds---函数求导
dsfz1=float(ds.evalf(subs={x:a})) #dsfz1---导数赋值1
dsfz2=float(ds.evalf(subs={x:b})) #dsfz2---导数赋值2
if abs(dsfz1) < 1 and abs(dsfz1) < 1:
m=1
print("该函数迭代格式符合区间[%d,%d]内的压缩映射"%(a,b))
else:
m=2
def fun_makeup(x,fun2):
f=eval(fun2)
return f
#------迭代函数
def dd(a,b,fun1,eps,fun2,x0,fun_makeup):
"""
a,b为所取区间,a<b
fun1---为原本函数,用来判断该区间内是否有根,也可以程序外判断
eps为误差限,即|x(n+1)-x(n)|<eps 即迭代停止,即x*约等于x(n+1)
fun2为输入的迭代格式
x0 为区间内随意挑选的初值
fun_makeup为外输的函数内部构造完成
"""
flag=0
n=0
q=x0
if sign(fun1(a)) ==0: return a
if sign(fun1(b)) ==0: return b
if sign(fun1(a))*sign(fun1(b))>0: return print("该区间内没有根,请重新定义区间!")
dd_form(a,b,fun2)
if m==1:
flag=1
if m==2: return print("该函数迭代格式不符合区间内的压缩映射!请重新换函数的迭代格式!")
while flag:
n +=1
y=fun_makeup(q,fun2)
if abs(y-q) <eps:
break
q=y
result="{0:.8f}".format(y)
return g.msgbox("该函数的解为:%s,共迭代 %d次" %(result,n),ok_button="No Problem!")
dd(0,1,fun1,1e-8,"(1-x)**(1/5)",0.5,fun_makeup)
版权声明:本文为weixin_43747767原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。