Jas*_*pel 4 python optimization numpy scipy
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]
Run Code Online (Sandbox Code Playgroud)
第一个问题是如何抑制正在返回的警告信息?
第二,为什么可能首先产生这个错误(除了显而易见的,迭代没有取得良好进展:))?
最后,这个函数的根是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)
Run Code Online (Sandbox Code Playgroud)
事实上,p(x0, 1.42, 41.0, -1)
并不接近于零,所以fsolve
正确地警告你它找不到解决方案.
PS.当你说
fsolve(p, np.arange(33.86, 50.86, 1.0),...)
Run Code Online (Sandbox Code Playgroud)
你告诉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)
Run Code Online (Sandbox Code Playgroud)
例如,
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)
Run Code Online (Sandbox Code Playgroud)
产量
[ 42.42]
Run Code Online (Sandbox Code Playgroud)
fsolve
如果初始猜测> = 41.0(值k
),那么在根上进行归零会做得不错,但是当初始猜测<41.0时失败.
我的猜测是,这是由于np.maximum
许多猜测没有改变s
.因此fsolve
,不知道是增加还是减少s
,并且容易猜错,s
并且从根部越来越远.