【发布时间】:2015-06-20 11:15:15
【问题描述】:
我有一个numpy.poly1d 多项式如下:
c = np.poly1d([2,-4,-28,62,122,-256,-196,140,392,240,72])
在-2.5 <= x <= 2.5 范围内绘制时曲线如下所示:
如何在给定范围内找到这条曲线的最小点,没有使用用于绘制曲线的离散值(我的意思是只使用连续的poly1d对象)?
【问题讨论】:
我有一个numpy.poly1d 多项式如下:
c = np.poly1d([2,-4,-28,62,122,-256,-196,140,392,240,72])
在-2.5 <= x <= 2.5 范围内绘制时曲线如下所示:
如何在给定范围内找到这条曲线的最小点,没有使用用于绘制曲线的离散值(我的意思是只使用连续的poly1d对象)?
【问题讨论】:
这为您提供了临界点,即区间中的那些 x,使得导数为零或它们位于区间的边界。从那以后,它应该只评估和接受min。
In [22]: p = numpy.poly1d([2,-4,-28,62,122,-256,-196,140,392,240,72])
In [23]: bounds = [-2.5, 2.5]
In [24]: crit_points = bounds + [x for x in p.deriv().r if x.imag == 0 and bounds[0] < x.real < bounds[1]]
In [25]: crit_points
Out[25]:
[-2.5,
2.5,
(-2.0243100544390678+0j),
(1.8753707038871632+0j),
(1.2307367723613383+0j),
(-0.41217268372324861+0j)]
从图中,在这种情况下,最小值似乎是最后一个。
【讨论】:
好吧,与@matiasg 的功能有点不同,目的是制作更多可复制的代码并尽可能多地使用矢量化代码。
import numpy as np
from matplotlib.pyplot import *
c = np.poly1d([2,-4,-28,62,122,-256,-196,140,392,240,72])
crit = c.deriv().r
r_crit = crit[crit.imag==0].real
test = c.deriv(2)(r_crit)
# compute local minima
# excluding range boundaries
x_min = r_crit[test>0]
y_min = c(x_min)
plot( x_min, y_min, 'o' )
xc = np.arange(-2.5, 2.6, 0.02)
yc = c(xc)
plot( xc, yc)
xlim([-2.5,2.5])
show()
图片 1:结果。请注意,在您的范围之外还有另一个局部最小值;)
【讨论】: