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

14 visualizaciones (últimos 30 días)
yamamoto yosuke
yamamoto yosuke el 24 de Jul. de 2020
Comentada: yamamoto yosuke el 30 de Jul. de 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を関数として入力した場合、入力引数が不足しています。
ある関数を入力すれば、その関数によってルンゲクッタ法を再現できるようにしたいのですが、うまく作ることができません。よろしくお願いします。

Respuesta aceptada

michio
michio el 30 de Jul. de 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 comentarios
michio
michio el 30 de Jul. de 2020
よかったです!
もともと提示いただいたルンゲクッタの各ステップで、h がかけられていた部分が気になりました。私が記載したコードでは削除していますので、正しい計算になっているかどうかご確認くださいませ。よろしくお願いします。
yamamoto yosuke
yamamoto yosuke el 30 de Jul. de 2020
そうですね、hについては、これから考えてみます。

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre ループと条件付きステートメント en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!