3分記事。
MATLABで差分diffという関数は簡単に離散n階差分を計算してくれますが,便利のように見えて配列の数を1つ減らしてしまうのがだるいです。
あとは,中心差分もサポートしてほしいっす。
中心差分の精度
以下のスクリプトを走らせてみてください。
%% Function
Fun = @(x) exp(-x).*sin(3*x);
dFun = @(x) -exp(-x).*sin(3*x)+ 3*exp(-x).*cos(3*x);
%% Data
x=linspace(0,4,101);
F=Fun(x);
h=x(2)-x(1);
xCentral=x(2:end-1);
dFCenteral=(F(3:end)-F(1:end-2))/(2*h);
xForward=x(1:end-1);
dFForward=(F(2:end)-F(1:end-1))/h;
xBackward=x(2:end);
dFBackward=(F(2:end)-F(1:end-1))/h;
%% Comparison
figure
hold on
plot(xCentral,abs(dFCenteral-dFun(xCentral)),'r')
plot(xForward,abs(dFForward-dFun(xForward)),'k');
plot(xBackward,abs(dFBackward-dFun(xBackward)),'g');
legend('Central','Forward','Backward')
ということで中心差分,前進・後退差分の3つの解析解とのエラーを調べてみましたがこんなに違うんですねぇ
時系列データをリアルタイムで処理しない限り中心差分を使わない手はないということです。
diffを使った簡単中心差分クッキング
上記のプログラムの手法だと2つもデータ長が短くなって主にplot等の面で不便です。
以下のように2つのdiffの和として表せば多少スッキリするかな?どうかな?
速度Vを加速度Accに変換しています。(サンプルタイムは1秒としている)
start_val = 0;
end_val = 0;
Acc = ( diff([start_val;V])+diff([V;end_val]) )/2;
いうて5分かかった。。。