Holen Ableitung von Daten in python
Schreibe ich ein Programm, um-Derivat. InterpolatedUnivariateSpline ist für die Berechnung von f(x+h). Die rote Linie ist die Ableitung des Cosinus, die grüne Linie ist Cosinus consine, die Blaue Linie ist die Sinus-Funktion. Die rote und Blaue Linie sind aufeinander abgestimmt. Es funktioniert gut in den folgenden.
from scipy.interpolate import InterpolatedUnivariateSpline
import numpy as np
import matplotlib.pyplot as plt
pi = np.pi
x = np.arange(0,5*pi,0.2*pi)
y = np.cos(x)
f2 = InterpolatedUnivariateSpline(x, y)
#Get dervative
der = []
for i in range(len(y)):
h = 1e-4
der.append( ( f2(x[i]+h)-f2(x[i]-h) )/(2*h) )
der = np.array(der)
plt.plot(x, der, 'r', x, y, 'g', x, -np.sin(x),'b')
plt.show()
Aber stoße ich auf ein problem. In meinem Projekt, meine variable x(Frequenz) variieren von 10^7 bis 2.2812375*10^9, der Schritt ist 22487500,so dass ich ändern, array x.
Als Ergebnis bekomme ich Folgendes Ergebnis.
Die Ableitung ist eine Linie und fast nahe 0, ist Es nicht -Sinus-Funktion. Wie kann ich dieses Problem lösen?
InterpolatedUnivariateSpline
hat einderivitive
- Methode. Gibt es einen Grund, warum du es nicht benutzt?- Wie es scheint, ein Bedeutungsverlust problem. Könnten Sie teilen
x
durch so etwas wie1e7
oder erhöhenh
zu etwas um die Größenordnung der1e5
. Auch wennx
hat die genug hohe Auflösung eine einfachere numerisch differenzieren Sie die Funktion wäredy = np.diff(y) / np.diff(x)
. Diese Weise tun Sie keine sorgen über die Einstellungh
. - Hi! wwii, ich versuche auch derivitive in InterpolatedUnivariateSpline Es das gleiche Ergebnis erhalten Sie unten.
- Ja! Ich Teile x durch 1e9 um abgeleitete Rechte. Auch dy = np.diff(y) / np.- diff(x) funktioniert gut, Aber ich brauche Sie zum anpassen der Länge von x ist.
- Super!!! Froh, dass ich helfen konnte.
- Ich umgewandelt mein Kommentar in eine richtige Antwort, um sich an die Richtlinien halten.
- Wow!!! Vielen Dank für deine Antwort! Ich bin besorgt über diese Seite gelöscht werden, wenn es keine Antwort gibt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Haben Sie eine Verlust von Bedeutung problem. Es bedeutet, dass, wenn Sie eine große floating-point-Zahl zu klein, die Präzision der kleine ist teilweise verloren, da ein numpy Doppel können nur die 64 bits von Informationen.
Um dieses Problem zu lösen, müssen Sie sicherstellen, dass die Skala der zahlen, die Sie addieren/multiplizieren/dividieren ist nicht viel anders. Eine einfache Lösung ist die Aufteilung
x
durch1e9
oder Multiplikationh
durch1e9
. Wenn Sie dies tun, erhalten Sie im wesentlichen die gleiche Präzision wie in deinem Beispiel.Auch wenn
x
hat die genug hohe Auflösung ein einfacher Weg, um numerisch differenzieren Sie die Funktion wäreder = np.diff(y) /np.diff(x)
. Diese Weise tun Sie keine sorgen über die Einstellung h. Jedoch ist in diesem Fall beachten Sie, dassdy
ist ein element kürzery
, unddy[i]
ist eigentlich ein Näherungswert für die Ableitung bei `(x[i] + x[i+1]) /2. So zeichnen Sie es tun würde: