<p>下面是一个实现basinhopping方法的尝试<a href="https://stackoverflow.com/a/50353752/190597">described by Erwin Kalvelagen</a>。在</p>
<p>首先,构造一个根在0、15、30和50的多项式
在所需区域为正:</p>
<pre><code>In [123]: x = np.linspace(-1, 51, 100)
In [124]: plt.plot(x,-(x-0)*(x-15)*(x-30)*(x-50))
Out[124]: [<matplotlib.lines.Line2D at 0x7fa01d65b748>]
In [125]: plt.axhline(color='red')
Out[145]: <matplotlib.lines.Line2D at 0x7fa01d6620b8>
In [146]: plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/EPO91.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/EPO91.png" alt="enter image description here"/></a></p>
<p>现在可以使用该多项式作为约束:</p>
^{pr2}$
<p>收益率</p>
<pre><code> message: 'Optimization terminated successfully.'
nfev: 13
nit: 4
njev: 4
status: 0
success: True
x: array([15.])
message: ['requested number of basinhopping iterations completed successfully']
minimization_failures: 0
nfev: 178
nit: 10
njev: 56
x: array([15.])
</code></pre>
<p>注意,最初的猜测是在<code>40</code>处,但是{<cd2>}设法在<code>x = 15</code>处找到另一个非连续区间的最小值。
使用与两个间隔之间的距离顺序相同的步长对于让<code>basinhopping</code>有机会从两个间隔进行采样非常重要。在</p>
<p>如果没有basinhopping,<code>optimize.minimize</code>使用带有非凸约束的SLSQP可能无法从所有允许的区间进行采样。例如</p>
<pre><code>import scipy.optimize as optimize
cons = ({'type': 'ineq', 'fun': lambda x: -(x-0)*(x-15)*(x-30)*(x-50)}, )
def f(x):
return (x-20)**2
res = optimize.minimize(
f, [40], method='SLSQP', constraints=cons)
print(res.x)
# [30.]
res = optimize.minimize(
f, [5], method='SLSQP', constraints=cons)
print(res.x)
# [15.]
</code></pre>
<p>显示您必须运行<code>optimize.minimize</code>两次,并在每个间隔内进行猜测
为了找到真正的最小值。在</p>