【问题标题】:python syntax for functions with multiple return values: using fsolve具有多个返回值的函数的 python 语法:使用 fsolve
【发布时间】: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

标签: python numpy syntax scipy


【解决方案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']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 2017-12-23
    • 1970-01-01
    相关资源
    最近更新 更多