【问题标题】:Python scipy.optimize: Using fsolve with multiple first guessesPython scipy.optimize:将 fsolve 与多个初步猜测一起使用
【发布时间】:2012-10-14 22:53:40
【问题描述】:

Scipy 版本 0.10.0

考虑以下几点:

>>> import math
>>> from scipy.optimize import fsolve
>>> import numpy as np
>>> def p(s, l, k, q):
    p = q * np.maximum(s - k, 0.0)
    return (p + math.copysign(l, -q)) * math.fabs(q) * 100.0

>>> x0 = fsolve(p, np.arange(33.86, 50.86, 1.0), args=(1.42, 41.0, -1.0), xtol=1e-06, maxfev=500)
Warning (from warnings module):
  File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 152
    warnings.warn(msg, RuntimeWarning)
RuntimeWarning: The iteration is not making good progress, as measured by the 
   improvement from the last ten iterations.
>>> print x0
[ -4.87169392e+05  -4.87168392e+05  -4.87167392e+05  -4.87166392e+05
  -4.87165392e+05  -4.87164392e+05  -4.87163392e+05  -4.87162392e+05
   4.24200000e+01   4.24200000e+01   4.24200000e+01   4.24200000e+01
   4.24200000e+01   4.24200000e+01   4.24200000e+01   4.24200000e+01
   4.24200000e+01]

第一个问题是如何抑制返回的警告消息?

其次,为什么首先会产生这个错误(除了明显的,迭代没有取得好的进展:))?

最后,这个函数的根是42.42(找到了)。为什么fzero 也会返回-4.87e+05

【问题讨论】:

  • 尝试使用numpy.seterr关闭报错:numpy.seterr(invalid='ignore')
  • 感谢您的建议,但没有奏效。

标签: python optimization numpy scipy


【解决方案1】:

这样做可能会让您错过一些重要的事情,但是,您可以使用 warnings.filterwarnings 来消除警告消息:

import warnings
warnings.filterwarnings('ignore', 'The iteration is not making good progress')
import math
from scipy.optimize import fsolve
import numpy as np
def p(s, l, k, q):
    p = q * np.maximum(s - k, 0.0)
    return (p + math.copysign(l, -q)) * math.fabs(q) * 100.0

x0 = fsolve(p, np.arange(33.86, 50.86, 1.0),
            args=(1.42, 41.0, -1.0), xtol=1e-06, maxfev=500)
print(x0)

事实上,p(x0, 1.42, 41.0, -1) 并不接近于零,所以fsolve 正确地警告您它未能找到解决方案。


PS。当你说

fsolve(p, np.arange(33.86, 50.86, 1.0),...)

您告诉fsolve,您对s 的初始猜测是numpy 数组np.arange(33.86, 50.86, 1.0)。整个数组立即传递给p

请注意,np.arange(33.86, 50.86, 1.0) 的长度为 17,x0 也是如此。那是因为fsolve 认为它正在寻找一个长度为 17 的数组来解决 p

我想也许你的意思是 s 是一个浮点数?在这种情况下,您最初的猜测只能传入一个浮点值:

fsolve(p, 41.0, args = (1.42, 41.0, -1.0), xtol=1e-06, maxfev=500)

例如,

import math
import scipy.optimize as optimize
import numpy as np

def p(s, l, k, q):
    p = q * np.maximum(s - k, 0.0)
    return (p + math.copysign(l, -q)) * math.fabs(q) * 100.0

args = (1.42, 41.0, -1.0)
result = optimize.fsolve(p, 41.0, args=args, xtol=1e-06, maxfev=500)
print(result)

产量

[ 42.42]

如果初始猜测 >= 41.0(k 的值),fsolve 可以很好地在根上归零,但在初始猜测

我的猜测是,这是因为np.maximum 没有改变很多对s 的猜测。所以fsolve不知道是增加还是减少s,容易猜错,把s离根越来越远。

【讨论】:

【解决方案2】:
import math
import scipy.optimize as optimize
import numpy as np

def p(s, l, k, q):
    p = q * np.maximum(s - k, 0.0)
    return (p + math.copysign(l, -q)) * math.fabs(q) * 100.0


result = optimize.fsolve(p, 41.0, args=1,2,3, xtol=1e-06, maxfev=500)
print(result)

result = optimize.fsolve(p, 41.0, args=2,3,4, xtol=1e-06, maxfev=500)
print(result)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多