2017-07-26 3 views
1

Ich habe den Code in Matlab, den ich nach Python bringen muss.Matlab polyval Funktion mit drei äquivalenten Ausgaben in Python/Numpy

x_cord = [58.2986 39.5842 23.0044 10.9427 3.0465] 
y_cord = [0.9600 0.9700 0.9800 0.9900 1.0000] 
[p,S,mu]=polyfit(x_cord, y_cord, 3); % p = [-0.002120716372462 0.004361710897014 -0.014104050472739 0.977080254892409] 
result=polyval(p, 16.574651718139650, [], mu); % result = 0.9848 

Wenn ich numpy.polyfit verwenden (x_cord, y_cord, 3) ich anderes Ergebnis als in Beispiel. Auch diese Art von polyval (mit mehr als zwei Eingabeparametern) konnte ich in Numpy nicht finden.

Matlab und Numpy Ergebnisse sind identisch, wenn ich einen Rückgabeparameter anfrage.

Antwort

1

Die Funktionen numpy und scipy zum Anpassen eines Polynoms enthalten nicht die Option, die Eingabe automatisch zu skalieren, wie es die Matlab-Funktion tut.

Zunächst ist hier, wie Sie Ihre Daten ohne die Skalierung passen:

In [39]: x_cord = [58.2986, 39.5842, 23.0044, 10.9427, 3.0465] 

In [40]: y_cord = [0.9600, 0.9700, 0.9800, 0.9900, 1.0000] 

In [41]: c = np.polyfit(x_cord, y_cord, 3) 

In [42]: c 
Out[42]: 
array([ -1.91755884e-07, 2.43049234e-05, -1.52570960e-03, 
     1.00431483e+00]) 

In [43]: p = np.poly1d(c) 

In [44]: p(16.574651718139650) 
Out[44]: 0.98483061114799408 

In [45]: xx = np.linspace(0, 60, 500) 

In [46]: plot(xx, p(xx)) 
Out[46]: [<matplotlib.lines.Line2D at 0x110c8d0f0>] 

In [47]: plot(x_cord, y_cord, 'o') 
Out[47]: [<matplotlib.lines.Line2D at 0x10d6f8390>] 

plot

Die numpy Berechnung agrees with Wolfram Alpha.


So können Sie der tatsächlichen Matlab-Berechnung ziemlich nahe kommen.

Konvertieren Sie aus praktischen Gründen x_cord aus einer Liste in ein numpy Array.

Berechnen Sie die mittlere und Standardabweichung von x_cord.

In [65]: mu = np.mean(x_cord) 

In [66]: std = np.std(x_cord, ddof=1) 

Anruf np.polyfit(), die verschobene und skalierte Version von x_cord verwenden.

In [67]: cscaled = np.polyfit((x_cord - mu)/std, y_cord, 3) 

Diese Werte sind ziemlich nah an den Array p im Kommentar im Code Matlab gezeigt.

In [68]: cscaled 
Out[68]: array([-0.00212068, 0.00436168, -0.01410409, 0.97708027]) 

erstellen poly1d Objekt, das aufgerufen werden kann.

In [69]: pscaled = np.poly1d(cscaled) 

Eingänge zu pscaled muß verschoben werden und skaliert mu und std verwenden.

In [70]: pscaled((16.574651718139650 - mu)/std) 
Out[70]: 0.98483061114799486 
+0

Vielen Dank für eine so detaillierte Antwort. Das hat mir sehr geholfen. – Vants