ルンゲクッタ法の入力引数の不足について。
12 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
yamamoto yosuke
le 24 Juil 2020
Commenté : yamamoto yosuke
le 30 Juil 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を関数として入力した場合、入力引数が不足しています。
ある関数を入力すれば、その関数によってルンゲクッタ法を再現できるようにしたいのですが、うまく作ることができません。よろしくお願いします。
0 commentaires
Réponse acceptée
michio
le 30 Juil 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 commentaires
michio
le 30 Juil 2020
よかったです!
もともと提示いただいたルンゲクッタの各ステップで、h がかけられていた部分が気になりました。私が記載したコードでは削除していますので、正しい計算になっているかどうかご確認くださいませ。よろしくお願いします。
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur グラフィックス オブジェクトの識別 dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!