Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

ossyaritoori
電機・ロボット・制御・画像その他
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away