ルンゲクッタ法の入力引数の不足について。

6 views (last 30 days)
yamamoto yosuke
yamamoto yosuke on 24 Jul 2020
Commented: yamamoto yosuke on 30 Jul 2020
function xy = rk4(fun,x0,xe,h,y0)%関数、初期値、終端値、分割数、y初期値
x = linspace(x0,xe,h);%%h個の点、間隔は(xe-x0)/h
f = @fun(x);
y = zeros(1,h);
dx = (xe-x0)/h;
y(1) = y0;
Y=feval(f,x);
for k=2:h
k1 = h*Y(k);
k2 = h*feval(f,x(k)+k1./2);
k3 = h*feval(f,x(k)+k2./2); %%(Y(k)+k2.*dx./2)./(x(k)+dx./2);
k4 = h*feval(f,x(k)+k3);
y(k)=y(k-1)+(k1+2*k2+2*k3+k4).*dx/6;
end
cosを関数として入力した場合、入力引数が不足しています。
ある関数を入力すれば、その関数によってルンゲクッタ法を再現できるようにしたいのですが、うまく作ることができません。よろしくお願いします。

Accepted Answer

michio
michio on 30 Jul 2020
関数自体を入力引数とする場合には、関数ハンドルとして入力するのがオススメです。
例えば
xy = rk4(@cos, x0, xe, h, y0)
という風に対象となる関数の頭に @ を付けて入力します。
その場合、rk4 の関数内では fun(x) と fun という名前の関数として使用できます。(以下の「変更したところ」を確認ください)
function xy = rk4(fun,x0,xe,h,y0)%関数、初期値、終端値、分割数、y初期値
x = linspace(x0,xe,h);%%h個の点、間隔は(xe-x0)/h
f = fun(x); % 変更したところ
y = zeros(1,h);
dx = (xe-x0)/h;
y(1) = y0;
Y=feval(f,x);
for k=2:h
k1 = h*Y(k);
k2 = h*feval(f,x(k)+k1./2);
k3 = h*feval(f,x(k)+k2./2); %%(Y(k)+k2.*dx./2)./(x(k)+dx./2);
k4 = h*feval(f,x(k)+k3);
y(k)=y(k-1)+(k1+2*k2+2*k3+k4).*dx/6;
end
  5 Comments
michio
michio on 30 Jul 2020
よかったです!
もともと提示いただいたルンゲクッタの各ステップで、h がかけられていた部分が気になりました。私が記載したコードでは削除していますので、正しい計算になっているかどうかご確認くださいませ。よろしくお願いします。
yamamoto yosuke
yamamoto yosuke on 30 Jul 2020
そうですね、hについては、これから考えてみます。

Sign in to comment.

More Answers (0)

Categories

Find more on ループと条件付きステートメント in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!