上篇文章中提到不知道時間間隔deltaT的微分形式是如何計算出來的,多方查找找到了答案,如下記錄。
對於離散數據求微分,不能直接使用求導公式來計算,需要利用數值方法中的知識。即數值微分(可參考《數值方法》[美]安妮·戈林鮑姆等)。具體內容資料很多不再贅述,然而數值微分對於誤差採用的是截斷或者舍入的方法,因此數值微分一定存在誤差。
然而誤差的絕對存在不代表近似值一定小於真實值,隨着h值的減小,截斷誤差f(h)與舍入誤差g(h)會逐漸接近,當兩個近似值相近時,數值微分達到最大精度,可以證明,此時誤差約等於機器精度的平方根,當h繼續減小,由於舍入誤差的存在,此時誤差會逐漸擴大。用matlab可以計算如下。
由於我電腦中未安裝matlab,用python計算了在sin(0)處隨h逐漸減小的數值微分結果。
import pandas as pd
import numpy as np
def get_diff(h):
x = np.arange(0,1,h)
y = np.sin(x)
df = np.diff(y)
res = df/h
return res[0]-1
def print_diff(h):
for i in range(10):
h=h/10
print(get_diff(h))
print_diff(1)
或者
import pandas as pd
import numpy as np
def get_diff(h):
t = np.sin(0+h)-np.sin(0)
res = t/h
return res-1
def print_diff(h):
for i in range(10):
h=h/10
print(get_diff(h))
print_diff(1)
兩種結果一致,思路略有差別,另外不能使用yield。原理略過。
附上結果