Download as pdf or txt
Download as pdf or txt
You are on page 1of 2

% QUESTION 2

% myrk3.m
% 3rd order Runge-kutta method for a set of odes.
function [tvec usol]=myrk3(derivs,tspan,u0,dt)
%define start and end time
tstart=tspan(1);tend=tspan(2);
%initialize tvec vector with tstart and xsol matrix with x0'
%set time=tstart and uold = initial u0 for first step
tvec=[tstart];usol=[u0'];time=tstart;uold=u0;
%initial estimate of h is the total time/1000 (no particluar reason)
%begin time loop (while loop is preferred)
while time<tend;
if tend-time < dt
dt=tend-time;
end
k1=feval(derivs,time,uold);
k2=feval(derivs,time+1/2*dt,uold+1/2*k1.*dt);
k3=feval(derivs,time+dt,uold+2*k1.*dt-k2.*dt);

unew=uold+1/6*(k1+4*k2+k3).*dt;
time=time+dt;uold=unew; %update time and xold for next step
tvec=[tvec;time]; %update tvec
usol=[usol;unew']; %update usol
end %the while loop ends here
function [f]=nonlinfn(t,u)
f=u*exp(-t)+sin(u^2);%du/dt

% myrk4.m

% 4rd order Runge-kutta method for a set of odes.

function [tvec usol]=myrk4(derivs,tspan,u0,dt)


%define start and end time
tstart=tspan(1);tend=tspan(2);
%initialize tvec vector with tstart and xsol matrix with x0'
%set time=tstart and uold = initial u0 for first step
tvec=[tstart];usol=[u0'];time=tstart;uold=u0;
%initial estimate of h is the total time/1000

%begin time loop (while loop is preferred)


while time<tend
if tend-time < dt
dt=tend-time;
end
k1=feval(derivs,time,uold);
k2=feval(derivs,time+1/2*dt,uold+1/2*k1.*dt);
k3=feval(derivs,time+1/2*dt,uold+1/2*k2.*dt);

k4=feval(derivs,time+dt,uold+k3.*dt);
unew=uold+1/6*(k1+2*k2+2*k3+k4).*dt;
time=time+dt;uold=unew; %update time and xold for next step
tvec=[tvec;time]; %update tvec
usol=[usol,unew']; %update usol
end

You might also like