大家好 我是初学者 利用二分法求解函数近似解 在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
报错信息贴一下吧,我复制你的代码运行没问题
```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=x10.382+x20.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对二分法以及黄金分割比法近似求解方程