# python----不动点迭代

编程用不动点迭代求方程 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)

    
    
    

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值