【发布时间】:2015-03-17 14:44:28
【问题描述】:
我是 python 新手,并尝试转换一些 matlab 代码作为练习。其中一项任务涉及找到函数的根或最小绝对值(如果不存在根)。我可以做到这一点,但我想添加一些错误检查以查看 scipy.optimize.fsolve 是否确实找到了解决方案。特别是, fsolve 返回一个参数 ier ,它只是一个成功标志,我想阅读它。
我的代码如下:
import numpy as np
from scipy.optimize import fsolve, minimize
mu = -8
sigma = 4
mun = -2
ARL0 = 2000
hmin = 0.5
hmax = 100
f = lambda h: (np.exp(-2*mun*(h/sigma+1.166))-1+2*mun*(h/sigma+1.166))/(2*mun**2)-ARL0
if f(hmin)*f(hmax) < 0:
opth, ier = fsolve(f,hmax)
print ier
print opth[0]
else:
f = lambda h: np.abs((np.exp(-2*mun*(h/sigma+1.166))-1+2*mun*(h/sigma+1.166))/(2*mun**2)-ARL0)
opth = minimize(f,hmax,bounds=((hmin,hmax),))
print opth.success
print opth.x[0]
“else”位工作正常,它会打印解决方案,如果找到解决方案,则显示真/假。第一个 if 块没有:运行时出现以下错误:
line 14, in <module>
opth, ier = fsolve(f,hmax)
ValueError: need more than 1 value to unpack
我猜这只是一个语法错误,但我无法找到使用 fsolve 执行此操作的示例。有人能指出我正确的方向吗?
【问题讨论】:
-
看来您可能需要将
full_output=1设置为fsolve()Fsolve() Docs -
我还要补充一点,在使用 scipy 和 numpy 等外部库时,掌握 IDE(我使用 PyCharm)非常有帮助。由于 Python 包的性质,您通常可以直接从上下文菜单或使用热键跳转到函数定义。
-
谢谢,这就行了。我也会研究一下 IDE。
-
如果您是学生或与教育机构有其他关联,PyCharm Professional 是免费的:jetbrains.com/student