Unrecognized function or variable 'ode4'.

36 ビュー (過去 30 日間)
Khang Nguyen
Khang Nguyen 2022 年 10 月 11 日
コメント済み: Torsten 2022 年 10 月 11 日
I am trying to use ode4 to validate with the Runge-Kutta method, but keep getiing this error when I call ode4 "Unrecognized function or variable 'ode4'."
h=0.1; % step size
x = 0:h:60;
%y(1) = [-0.5;0.3;0.2];
y(1) = -0.5;
F_xy = @(t) -3*cos(t/2) + 4*sin(t/2) + 1;
for i=1:(length(x)-1) % calculation loop
k_1 = F_xy(x(i));
k_2 = F_xy(x(i)+ 0.5*h*k_1);
k_3 = F_xy((x(i)+0.5*h*k_2));
k_4 = F_xy((x(i)+k_3*h));
y(i+1) = y(i) + (1/6)*(k_1+2*k_2+2*k_3+k_4)*h; % main equation
end
% validate using a decent ODE integrator
y0 = -0.5;
yx = ode4(F_xy, 0,h,60, y0)
plot(x,y,'o-', x, yx, '--')

採用された回答

Walter Roberson
Walter Roberson 2022 年 10 月 11 日
編集済み: Walter Roberson 2022 年 10 月 11 日
  2 件のコメント
Khang Nguyen
Khang Nguyen 2022 年 10 月 11 日
編集済み: Khang Nguyen 2022 年 10 月 11 日
I still get the same error.
h=0.1; % step size
x = 0:h:60;
F_xy = @(t) -3*cos(t/2) + 4*sin(t/2) + 1;
y0 = -0.5;
L = length(x)
tspan = linspace(0,60,L)
yx = ode4(F_xy, tspan, y0)
Walter Roberson
Walter Roberson 2022 年 10 月 11 日
Did you download the .zip file from that Question, and unzip it and place the directory on your MATLAB path ?

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

その他の回答 (1 件)

Torsten
Torsten 2022 年 10 月 11 日
編集済み: Torsten 2022 年 10 月 11 日
Look below at how k_1,...,k_4 must be computed in the case that your ODE function only depends on t, not y.
The classical Runge-Kutta boils down to the usual Simpson's rule.
h=0.1; % step size
x = 0:h:60;
%y(1) = [-0.5;0.3;0.2];
y(1) = -0.5;
F_xy = @(t) -3*cos(t/2) + 4*sin(t/2) + 1;
for i=1:(length(x)-1) % calculation loop
k_1 = F_xy(x(i));
k_2 = F_xy(x(i)+0.5*h);
k_3 = F_xy(x(i)+0.5*h);
k_4 = F_xy(x(i)+h);
y(i+1) = y(i) + (1/6)*(k_1+2*k_2+2*k_3+k_4)*h; % main equation
end
% validate using a decent ODE integrator
y0 = -0.5;
yx = ode4(@(t,y)F_xy(t), 0,h,60, y0);
plot(x,y,'o-', x, yx, '--')
function yout = ode4(F,t0,h,tfinal,y0)
% ODE4 Classical Runge-Kutta ODE solver.
% yout = ODE4(F,t0,h,tfinal,y0) uses the classical
% Runge-Kutta method with fixed step size h on the interval
% t0 <= t <= tfinal
% to solve
% dy/dt = F(t,y)
% with y(t0) = y0.
% Copyright 2014 - 2015 The MathWorks, Inc.
y = y0;
yout = y;
for t = t0 : h : tfinal-h
s1 = F(t,y);
s2 = F(t+h/2, y+h*s1/2);
s3 = F(t+h/2, y+h*s2/2);
s4 = F(t+h, y+h*s3);
y = y + h*(s1 + 2*s2 + 2*s3 + s4)/6;
yout = [yout; y]; %#ok<AGROW>
end
end
  3 件のコメント
Walter Roberson
Walter Roberson 2022 年 10 月 11 日
The error between what two values? You cannot calculate the error unless you have an analytic solution.
h=0.1; % step size
x = 0:h:60;
y(1) = -0.5;
F_xy = @(t) -3*cos(t/2) + 4*sin(t/2) + 1;
syms t C
intF = int(F_xy(t), t)
intF = 
eqn = subs(intF, t, 0) + C == y(1)
eqn = 
sol = solve(eqn)
sol = 
intF = subs(intF + C, C, sol)
intF = 
... that should be the analytic solution.
Torsten
Torsten 2022 年 10 月 11 日
If you compare your code and ode4, you'll see that they are identical. So there should be no difference in the results.

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

カテゴリ

Help Center および File ExchangeOrdinary Differential Equations についてさらに検索

タグ

製品

Community Treasure Hunt

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

Start Hunting!

Translated by