获取numpy.poly1d曲线的最小点数

时间:2015-04-14 17:55:13

标签: python numpy scipy

我有一个numpy.poly1d多项式如下:

c = np.poly1d([2,-4,-28,62,122,-256,-196,140,392,240,72])

-2.5 <= x <= 2.5范围内绘制曲线时,曲线如下所示:

enter image description here

如何在给定范围内找到此曲线的最小点,不使用使用用于绘制曲线的离散值(我的意思是仅使用连续{{1对象)?

2 个答案:

答案 0 :(得分:9)

确定与@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()

result

图片1 :结果。请注意,在您的界限之外还有另一个本地最小值;)

答案 1 :(得分:3)

这为您提供了关键点,即区间中的那些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)]

从图中,在这种情况下,似乎min是最后一个。