Z_stzz 2022-11-10 08: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 14: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
    

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    Z_stzz 2022-11-11 02:05

    大神你好,这个思路尝试后我有了新的理解,也知道自己问题出在哪里了,之前函数输入时候以常规的输入方式进行导致报错,例如:输入了f=2^x+3*x-7, 想知道输入函数是否必须以python函数命名要求进行输入?

    回复
    Z_stzz 2022-11-11 02:27

    img


    例如这样 我想输入一般函数 能否求解零点

    回复
    Z_stzz 回复 Z_stzz 2022-11-11 02:47

    疑问解决了,现在还是说函数输入时候是否必须以python函数命名要求进行,如果使用者不明白python命名方式 是否需要解析输入的命令

    回复
    展开全部4条评论
查看更多回答(3条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 11月18日
  • 已采纳回答 11月11日
  • 专家修改了标签 11月10日
  • 创建了问题 11月10日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部