LoginSignup
2
1

More than 5 years have passed since last update.

MATLABのdiff関数って中心差分とかもサポートして良くない?

Posted at

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つの解析解とのエラーを調べてみましたがこんなに違うんですねぇ
image.png

時系列データをリアルタイムで処理しない限り中心差分を使わない手はないということです。

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分かかった。。。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1