因此,我正在尝试为学校项目创建一些基本的根查找函数,以下是我的代码:
import numpy as np
x = np.linspace(0, 3)
f = 14 * x * np.exp(x - 2) - 12 * np.exp(x - 2) - 7 * x ** 3 + 20 * x ** 2 - 26 * x + 12
def bolzano(function, lower, upper):
if function(lower) * function(upper) < 0:
return True
else:
return False
def bisection(function, lower, upper):
m = (lower + upper) / 2
while function(m) > 10 ** -6:
if bolzano(function, lower, m):
upper = m
else:
lower = m
m = (lower + upper) / 2
return float(m)
b = bisection(f, 0, 3)
print(b)然而,当我尝试运行它时,我得到了这个错误
Traceback (most recent call last):
File "C:/Users/user/PycharmProjects/untitled/Test.py", line 31, in <module>
b = bisection(f, 0, 3)
File "C:/Users/user/PycharmProjects/untitled/Test.py", line 22, in
bisection while function(m) > 10 ** -6:
TypeError: 'numpy.ndarray' object is not callable我尝试将二等分函数中的元素转换为已知的数据类型,但它没有完成这项工作。大多数关于ndarray的帖子都是关于...嗯,数组,我不使用它,所以在那里找不到解决方案。有什么想法吗?
发布于 2018-12-31 01:04:24
问题是你的函数定义f目前不是一个函数。它现在只是一个表达式。您有两个选择:要么使用SymPy,要么只创建一个计算f的函数,这样您就可以简单地使用普通的函数调用来调用它,如f(x),其中x是您的参数,可以是一个数组或单个数字。下面是如何使用第二个选项来完成此操作。
import numpy as np
x = np.linspace(0, 3)
def f(x):
return 14 * x * np.exp(x - 2) - 12 * np.exp(x - 2) - 7 * x ** 3 + 20 * x ** 2 - 26 * x + 12
# bolzano function here
# bisection function here
b = bisection(f, 0, 3)
print(b)
# 1.5正如@hpaulj所指出的,由于您正在评估标量输入的函数,因此使用math.exp而不是np.exp会更好。前者只需要标量输入,而后者也接受向量。
https://stackoverflow.com/questions/53979639
复制相似问题