En général, les données obtenues à partir du capteur sont des données discrètes.
Dans le cas de données discrètes, l'approximation la plus simple est
Ce calcul est facile avec la fonction de tranche.
import numpy as np
def diff(x, h):
res = x[2:] - x[:-2]
return res/(2*h)
Dans la formule suivante, l'erreur est un peu plus petite et l'erreur est $ \ omicron (h ^ 4) $.
def diff4(x, h):
"""
1er différentiel{-f(x+2h)+8f(x+h)-8f(x-h)+f(x-2h)}/12h
x est des données de séries chronologiques,h est le temps entre les données(second)
"""
res = -x[4:] + 8*x[3:-1] - 8*x[1:-3] + x[:-4]
return res/(12*h)
Vérifiez chaque erreur
Cette fois, nous avons créé une onde cos de 1 Hz et l'avons différenciée.
#Onde cos 10sec 1 Hz
time = np.linspace(0, 10, num=10000, endpoint=False)
wave = np.cos(2*np.pi*time)
#Méthode sujette aux erreurs
vel2 = diff(wave, time[1] - time[0])
#Comment réduire les erreurs
vel4 = diff4(wave, time[1] - time[0])
#Comparer avec la valeur théorique 2π
print(vel2.max()-2*np.pi)
print(vel4.max()-2*np.pi)
Résultat de sortie -4.134161924973512e-05 -3.241460433400789e-10
Vous pouvez voir que cette dernière formule a moins d'erreur.
En cas de double différenciation
def diffdiff4(x, h):
"""
Deux fois différentiel,x est des données de séries chronologiques,h est le temps entre les données(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