Im Allgemeinen sind die vom Sensor erhaltenen Daten diskrete Daten.
Bei diskreten Daten ist die einfachste Annäherung
Diese Berechnung ist mit der Slice-Funktion einfach.
import numpy as np
def diff(x, h):
res = x[2:] - x[:-2]
return res/(2*h)
In der folgenden Formel ist der Fehler etwas kleiner und der Fehler ist $ \ omicron (h ^ 4) $.
def diff4(x, h):
"""
1. Differential{-f(x+2h)+8f(x+h)-8f(x-h)+f(x-2h)}/12h
x sind Zeitreihendaten,h ist die Zeit zwischen Daten(second)
"""
res = -x[4:] + 8*x[3:-1] - 8*x[1:-3] + x[:-4]
return res/(12*h)
Überprüfen Sie jeden Fehler
Dieses Mal haben wir eine 1-Hz-Cos-Welle erzeugt und differenziert.
#10 Sekunden 1 Hz cos Welle
time = np.linspace(0, 10, num=10000, endpoint=False)
wave = np.cos(2*np.pi*time)
#Fehleranfällige Methode
vel2 = diff(wave, time[1] - time[0])
#So reduzieren Sie Fehler
vel4 = diff4(wave, time[1] - time[0])
#Vergleiche mit dem theoretischen Wert 2π
print(vel2.max()-2*np.pi)
print(vel4.max()-2*np.pi)
Ausgabeergebnis -4.134161924973512e-05 -3.241460433400789e-10
Sie können sehen, dass die letztere Formel weniger Fehler aufweist.
Bei doppelter Differenzierung
def diffdiff4(x, h):
"""
Zweimal Differential,x sind Zeitreihendaten,h ist die Zeit zwischen Daten(second)
{-f(x+2h)+16f(x+h)-30f(x)+16f(x-h)-f(x-2h)}/12h^2
"""
res = -x[4:] +16*x[3:-1] -30*x[2:-2] +16*x[1:-3] -x[:-4]
return res/(12*h*h)
Recommended Posts