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

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

大家好 我是初学者 利用二分法求解函数近似解 在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函数用法 ,无果

我想要达到的结果

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

方程 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

报错信息贴一下吧,我复制你的代码运行没问题

img


我运行也没问题

```python

import numpy as np
def f(x):
y=x41+x3+1
return y
x1=-1.1;x2=-0.9;n1=0#二分法
while 1>0:
n1+=1;x3=x10.5+x20.5
if f(x3)f(x1)>0:
x1=x3;x2=x2
if f(x3)f(x2)>0:
x1=x1;x2=x3
if np.abs(x1-x2)<=10**-8:
print('二分法的近似根:{};程序计算次数:{}'.format(x3,n1))#输出
break
x1=-1.1;x2=-0.9;n2=0#黄金分割法
while 1>0:
n2+=1;x3=x1
0.382+x2
0.618
if f(x3)f(x1)>0:
x1=x3;x2=x2
if f(x3)f(x2)>0:
x1=x1;x2=x3
if np.abs(x1-x2)<=10
-8:
print('黄金分割法的近似根:{};程序计算次数:{}'.format(x3,n2))#输出
break

```python对二分法以及黄金分割比法近似求解方程