2016-07-07 5 views
2

Die Daten, die ich habe, sind immer auf einem Polynom zweiten Grades (quadratische Funktion). Ich möchte die Spitze der interpolierten Funktion so genau wie möglich finden.Genaueste Methode, um Daten zu interpolieren und den Peak zu finden?

Data sample points

Bisher habe ich interp1d worden und dann den Spitzenwert extrahieren linspace und eine einfache for Schleife. Obwohl Sie eine große Anzahl von neu erzeugten Samples in linspace verwenden können, können Sie mit der Ableitung des angepassten Polynoms noch genauer sein.
Ich habe keinen Weg gefunden, das mit interp1d zu tun.

Jetzt die einzige Funktion, die ich gefunden habe, die die angepassten Polynomkoeffizienten zurückgibt, ist polyfit, aber diese angepasste Funktion ist ziemlich ungenau (die meiste Zeit durchläuft die Funktion nicht einmal die Datenpunkte).

<code>interp1d</code> and <code>polyfit</code> functions

Ich habe versucht, UnivariateSpline verwenden und die angepasste Funktion scheint ganz genau zu sein, und es ist sehr einfach, das Derivat Spline und seine Wurzel zu bekommen.

Andere polynomiale Anpassungsfunktionen (BarycentricInterpolator, KroghInterpolator, ...) geben an, dass sie aus Gründen der numerischen Stabilität keine Polynomkoeffizienten berechnen.

Wie genau ist UnivariateSpline und seine Derivate, oder gibt es bessere Möglichkeiten da draußen?

Antwort

0

Am Ende habe ich mit polyfit ging. Obwohl die angepasste Funktion nicht genau durch die Datenpunkte ging, war das Endergebnis immer noch gut. Aus den zurückgegebenen Koeffizienten erhielt ich die gewünschten x- und y-Koordinaten des Peaks.

1

Wenn alles, was Sie brauchen, ist die min/max eines Polynom zweiten Grades zu finden, warum dies nicht tun:

import matplotlib.pyplot as plt 
from scipy.interpolate import KroghInterpolator 
import numpy as np 

x=range(-20,20) 
y=[] 
for i in x: 
    y.append((i**2)+25) 

x=x[1::5] 
y=y[1::5] 

f=KroghInterpolator(x,y) 
xfine=np.arange(min(x),max(x),.5) 
yfine=f(xfine) 

val_interp=min(yfine) 
print val_interp 

plt.scatter(x,y) 
plt.plot(xfine, yfine) 
plt.show() 
+0

Aber diese Methode basiert immer noch auf der Schrittweite von 'np.arange', die in diesem Fall _0.5_ ist. Ich möchte das Maximum der quadratischen Funktion auf Float/Double Precision reduzieren. –

+0

@TjazBrelih Es gibt Ihnen Float/Doppelpunktpräzision. Ändere 'y.append ((i ** 2) +25)' zu 'y.append ((i ** 2) +25.086)'. Dann führe das Programm aus. Die Interpolation im Abstand von 0,5 findet den Minimalwert, obwohl dieser Wert in den ursprünglichen Daten nicht vorhanden war. –

+0

Dies funktioniert nur, wenn die Funktion nicht entlang der X-Achse verschoben wird. Wenn Sie 'y.append ((i ** 2) +25)' zu 'y.append (((i + 0.2) ** 2) +25)' ändern, finden Sie nicht die wahre Spitze, nur die max/min Wert der interpolierten Funktion, die im Intervall von _0.5_ abgetastet wurde. –