获取 numpy.poly1d 曲线的最小点
Get minimum point(s) of numpy.poly1d curve
我有一个 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:结果。请注意,在您的范围之外还有另一个局部最小值 ;)
我有一个 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:结果。请注意,在您的范围之外还有另一个局部最小值 ;)