# 编程用不动点迭代求方程 x**5 +x=1的解,精确到8位小数。import numpy as np
import sympy as sp
from numpy import sign
import easygui as g
m=0#------函数定义deffun1(x):
f=x**5+x-1#亦可用隐函数代替-> fun=lambda x: x**5+x-1return f
#------迭代格式的判断defdd_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---导数赋值2ifabs(dsfz1)<1andabs(dsfz1)<1:
m=1print("该函数迭代格式符合区间[%d,%d]内的压缩映射"%(a,b))else:
m=2deffun_makeup(x,fun2):
f=eval(fun2)return f
#------迭代函数defdd(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:returnprint("该区间内没有根,请重新定义区间!")
dd_form(a,b,fun2)if m==1:
flag=1if m==2:returnprint("该函数迭代格式不符合区间内的压缩映射!请重新换函数的迭代格式!")while flag:
n +=1
y=fun_makeup(q,fun2)ifabs(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)