首页 > 解决方案 > 使用 simpy.optimize.bisect 查找函数的零点,具有复杂函数

问题描述

我是一名机械工程专业的学生,​​这是我第一次接触 Python 环境,或者 Anaconda 的发行版。我的任务是找到这个函数的零点:

⋅sin()cos()+⋅cos()sin()2−⋅cos()−ℎ⋅sin()=0

使用参数:

D = 220mm,
h = 1040mm,
l = 1420mm,where
n = 81

是函数上等距点的数量,函数限于:

∈[0,2] 其中是一个 np.array。

绘制函数 问题是,当我尝试将函数插入时bisect(fun, a, b),错误提示

“numpy.ndarray”对象不可调用

有人可以帮助一个菜鸟程序员吗?谢谢。

标签: pythonscipyzeroscipy-optimizebisect

解决方案


问题不清楚,你应该分享你的代码,如果我是正确的,标题应该说 scipy,而不是 simpy。

除此之外,我没有得到相同的函数图,你能检查它是否正确吗?

如果你想使用二分法,你应该这样做:

import numpy as np
from scipy.optimize import bisect

def fun(x, D, h, l):
    return D * np.sin(x) * np.cos(x) + l * np.cos(x) * np.sin(x) * 2 - l * np.cos(x) - h * np.sin(x)

D = 220
h = 1040
l = 1420

print(bisect(lambda x: fun(x, D, h, l), 0, 2*np.pi))

请注意,二分法只能找到一个零,这根本不起作用,因为函数的两个极值具有相同的符号。对于这个特定的函数,您可以在 (0, pi) 和 (pi, 2pi) 区间运行平分以找到两个零点。


推荐阅读