Z_stzz 2022-11-10 16:37 采纳率: 100%
浏览 112
已结题

初学者 二分法解决方程近似解

问题遇到的现象和发生背景

大家好 我是初学者 利用二分法求解函数近似解 在python实现过程中 想设计手动输入函数解析式并实现方程近似求解 但无法解决含参数的赋值与引用问题 请帮忙提供下思路 我查看了compile和eval函数用法 但最后显示报错 意思是浮点数类型求值无法计算 麻烦了麻烦了。

用代码块功能插入代码,请勿粘贴截图
##二分法
import numpy as np
import ast


u=input('请输入函数解析式f=')
c = compile(u,'','eval') 
#x=2
#print(eval(c))
#print(c)
#print(type(eval(c)))
a=float(input('请输入区间左端点:a='))
b=float(input('请输入区间右端点:b='))
eps=float(input('输入停止精度要求:eps='))
k=0
x=(a+b)/2

def fun(t):
    x=t
    ##print(x)
    c = compile(u,'','eval') 
    ##x=str(x)
    z=eval(c)
    return z
    #return pow(2,t)+3*t-7  #pow(x,3)表示x的3次幂

print('k       a        f(a)       b         f(b)      c         f(c)')

T=[k,a,fun(a),b,fun(b),x,fun(x)]
T1=[k,a,fun(a),b,fun(b),x,fun(x)]


while abs(T1[3]-T1[1])>eps:
    k+=1
    if fun(x)*fun(a)==0:
        a=a
        b=x
        x=(a+b)/2
        T1=[k,a,fun(a),b,fun(b),x,fun(x)]
        T=np.row_stack([T, T1])
        break
    elif fun(x)*fun(a)>0:
        a=x
        b=b
        x=(a+b)/2
        T1=[k,a,fun(a),b,fun(b),x,fun(x)]
        T=np.row_stack([T, T1])
    elif fun(x)*fun(a)<0:
        a=a
        b=x
        x=(a+b)/2
        T1=[k,a,fun(a),b,fun(b),x,fun(x)]
        T=np.row_stack([T, T1])
print(T)
print('经过'+str(k)+'次迭代,方程的根为',a)
    
L=input('输入任意字符结束程序;')

我的解答思路和尝试过的方法

查看了compile和eval函数用法 ,无果

我想要达到的结果

手动输入函数解析式,并利用封装程序实现对函数零点的近似求解, 无法解决含参函数的赋值。

  • 写回答

4条回答 默认 最新

  • 天元浪子 Python领域优质创作者 2022-11-10 22:34
    关注

    方程 x*x -x + 2 = 0 没有实数根,即便题主的算法没有问题,也不可能得到正确的结果。以下代码,供题主参考。f_str是字符串形式的包含自变量x的函数表达式,a和b是函数过零点的左右两侧的点,eps是近似解可接受的误差(比如0.00001)。

    def bisection(f_str, a, b, eps):
        """二分法求方程的根"""
        def f(x):
            return eval(f_str)
        if a > b:
            a, b = b, a
        if f(a) * f(b) > 0:
            print('方程在[a, b]区间内无解')
        else:
            n = 0
            while True:
                n += 1
                root = (a+b)/2
                y = f(root)
                if abs(y) < eps:
                    break
                if f(a) * y < 0:
                    b = root
                else:
                    a = root
            print('经过%d次迭代求得方程的根为%f'%(n, root))
    
            
    f_str = input('请输入函数解析式: f = ')
    请输入函数解析式: f = 2*pow(x, 2) - 1
    a = float(input('请输入区间左端点: a = '))
    请输入区间左端点: a = 0
    b = float(input('请输入区间右端点: b = '))
    请输入区间右端点: b = 2
    bisection(f_str, a, b, 1e-5)
    经过17次迭代求得方程的根为0.707108
    2*pow(0.707108, 2) - 1 # 验证结果
    3.4473279999502893e-06
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月19日
  • 已采纳回答 11月11日
  • 专家修改了标签 11月10日
  • 创建了问题 11月10日

悬赏问题

  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂