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

9 ビュー (過去 30 日間)
yamamoto yosuke
yamamoto yosuke 2020 年 7 月 24 日
コメント済み: yamamoto yosuke 2020 年 7 月 30 日
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を関数として入力した場合、入力引数が不足しています。
ある関数を入力すれば、その関数によってルンゲクッタ法を再現できるようにしたいのですが、うまく作ることができません。よろしくお願いします。

採用された回答

michio
michio 2020 年 7 月 30 日
関数自体を入力引数とする場合には、関数ハンドルとして入力するのがオススメです。
例えば
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 件のコメント
michio
michio 2020 年 7 月 30 日
よかったです!
もともと提示いただいたルンゲクッタの各ステップで、h がかけられていた部分が気になりました。私が記載したコードでは削除していますので、正しい計算になっているかどうかご確認くださいませ。よろしくお願いします。
yamamoto yosuke
yamamoto yosuke 2020 年 7 月 30 日
そうですね、hについては、これから考えてみます。

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File Exchangeループと条件付きステートメント についてさらに検索

Community Treasure Hunt

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

Start Hunting!