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

最佳答案

这样做可能会使你错过一些重要的事情,但是,沉默你可以使用的警告信息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正确警告您,它找不到解决方案。
当你说
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的长度也是17。这是因为fsolve认为它正在寻找一个长度为17的数组来求解p
我想也许你的意思是成为一个浮子?在这种情况下,您只能为您的初始猜测传入一个浮点值:
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(值s),但初始猜测为“41”时失败,fsolve在根上做正确的工作。
我的猜测是,这是由于对k的许多猜测没有改变。因此np.maximum不知道是增加还是减少s,容易猜错,使fsolve离根越来越远。

关于python - Python scipy.optimize:将fsolve与多个首次猜测一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13057022/

10-11 18:14