具有多个返回值的函数的python语法:using fsolve

时间:2015-03-17 14:44:28

标签: python numpy syntax scipy

我是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执行此操作的示例。有人能指出我正确的方向吗?

1 个答案:

答案 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']