我是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”位工作正常,它打印解决方案,如果找到,则打印为true / false。第一个if块没有:运行时出现以下错误:
line 14, in <module>
opth, ier = fsolve(f,hmax)
ValueError: need more than 1 value to unpack
我猜它只是一个synatx错误,但我无法找到使用fsolve执行此操作的示例。有人能指出我正确的方向吗?
答案 0 :(得分:1)
您需要添加参数full_output=True
,实际上有4个返回值,查看the docs,因此您需要解压缩所有这些值。
以下是我的SciPy版本(0.14.0)中fsolve
的来源,您可以看到返回值的两个选项:
def fsolve(func, x0, args=(), fprime=None, full_output=0,
col_deriv=0, xtol=1.49012e-8, maxfev=0, band=None,
epsfcn=None, factor=100, diag=None):
options = {'col_deriv': col_deriv,
'xtol': xtol,
'maxfev': maxfev,
'band': band,
'eps': epsfcn,
'factor': factor,
'diag': diag,
'full_output': full_output}
res = _root_hybr(func, x0, args, jac=fprime, **options)
if full_output:
x = res['x']
info = dict((k, res.get(k))
for k in ('nfev', 'njev', 'fjac', 'r', 'qtf') if k in res)
info['fvec'] = res['fun']
return x, info, res['status'], res['message']
else:
return res['x']