Need help using ODE45 and eulers function

37 vues (au cours des 30 derniers jours)
Chris
Chris le 5 Nov 2013
Alright so I have this ODE I solved for it using ODE45 and now its asking me to modify my script by using a eulers method script that was given to us and use eulers to solve for it now. I am lost. If its confusinf at all let me know and i can try to clarify it.
Here is my ODE file
function ex_with_2eqs
t0 = 0; tf = 40; y0 = [-1;0];
[t,Y] = ode45(@f,[t0,tf],y0,[]);
y = Y(:,1);
v = Y(:,2);
figure(1);
plot(t,y,'b+',t,v,'ro')
legend('y(t)','v(t)=y''(t)');
title('Figure 1 L4g');
grid on;
ylim([-1.5,1.5]);
figure(2);
plot(y,v); axis square; xlabel('y'); ylabel('v');
title('Figure 2 L4g phase plot');
grid on;
ylim([-1.5,1.5]);
xlim([-1,1]);
end
Here is my function file
function dydt = f(t,Y)
y = Y(1);
v = Y(2);
dydt = [ v; cos(t)-4*y^2*v-3*y ];
end
and if it matters here is my eulers file although i know i dont have to do anything with it.
f
unction [te,Ye] = euler(f,tspan,y0,N)
% Solves the IVP y' = f(t,y), y(t0) = y0 in the time interval tspan = [t0,tf]
% using Euler's method with N time steps.
% Input:
% f = name of inline function or function M-file that evaluates the ODE
% (if not an inline function, use: euler(@f,tspan,y0,N))
% For a system, the f must be given as column vector.
% tspan = [t0, tf] where t0 = initial time value and tf = final time value
% y0 = initial value of the dependent variable. If solving a system,
% initial conditions must be given as a vector.
% N = number of steps used.
% Output:
% t = vector of time values where the solution was computed
% y = vector of computed solution values.
m = length(y0);
t0 = tspan(1);
tf = tspan(2);
h = (tf-t0)/N; % evaluate the time step size
t = linspace(t0,tf,N+1); % create the vector of t values
y = zeros(m,N+1); % allocate memory for the output y
y(:,1) = y0'; % set initial condition
for n=1:N
y(:,n+1) = y(:,n) + h*f(t(n),y(:,n)); % implement Euler's method
end
t = t'; y = y'; % change t and y from row to column vectors
end

Réponses (1)

Jonathan LeSage
Jonathan LeSage le 5 Nov 2013
It looks to me that you're nearly there! I found a couple of small mistakes that seems to be holding you back.
Changes to your code:
  • Replace ode45 with you defined euler function
  • Read the documentation of your euler function. Unlike ode45 which is a variable step numerical solver, Euler's method is a fixed step solver. As such, you need to specify the number of steps you want to take, N, as the final fuction input. I would imagine 250+ steps would be sufficient for this problem.
Changes to your euler function:
  • The two outputs of the function [te,Ye] are never defined in the code. From what I can tell, the outputs should be changes to [t,y].
Hope this helps to rectify the problem!

Community Treasure Hunt

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

Start Hunting!

Translated by