質問: h*feval(f,x(k)+k3); y(k)=y(k-1)+(k1+2*k2+2*k3+k4).*dx/6; end cosを関数として入力した場合、入力引数が不足しています。 ある関数を入力すれば、その関数によってルンゲクッタ法を再現できるようにしたいのですが、うまく作ることができません。よろしくお願いします。
回答: 関数自体を入力引数とする場合には、関数ハンドルとして入力するのがオススメです。 https://jp.mathworks.com/help/matlab/matlab_prog/creating-a-function-handle.html 例えば 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