2015-04-14 4 views
5

Ich habe ein numpy.poly1d Polynom wie folgt:Erhalten Minimalpunkt (e) von numpy.poly1d Kurve

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

Die Kurve sieht wie folgt aus, wenn im Bereich grafisch dargestellt -2.5 <= x <= 2.5:

enter image description here

Wie kann ich den minimalen Punkt dieser Kurve innerhalb des gegebenen Bereichs finden, ohne unter Verwendung der diskreten Werte, die verwendet werden, um die Kurve graphisch darzustellen (damit meine ich, nur das Kontinuum zu verwenden) uous poly1d Objekt)?

Antwort

8

OK ein bisschen andere Funktionen als @matiasg Ziel ist es, mehr kopierfähigen Code zu machen und so viel vektorisierten Code wie möglich zu verwenden.

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

Bild 1: Ergebnis. Beachten Sie, dass es ein anderes lokales Minimum außerhalb Ihrer Grenzen gibt;)

3

Dies gibt Ihnen die kritischen Punkte, d. H. Diejenigen x im Intervall, so dass die Ableitung Null ist oder sie in der Grenze des Intervalls liegen. Von diesem sollte es nur ausgewertet werden und min nehmen.

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)] 

Aus der Grafik, in diesem Fall scheint es, dass die min die letzte ist.

Verwandte Themen