Numerically solve the ODE: y\' = 10 - y^2 using ode 45. Use a start time of 0, e
ID: 3110492 • Letter: N
Question
Numerically solve the ODE: y' = 10 - y^2 using ode 45. Use a start time of 0, end time of 1, and an initial condition of 0. Using a while loop, write a function that can solve an ODE using Modified Euler's method. This function will work similarly to ode45, but the step size will have to be specified as an input. function [tout, yout] = modifiedeuler (odefunc, tspan, y0, h) Add an if statement to your modifiedeuler function so that it doesn't overshoot the end time (i.e. change h in the final step to exactly reach the end time). Adjust you modifiedeuler function so that it has adaptive t me stepping. h time f(t, f) at any point exceeds 0.5, the value for h should be halved. Solve the ODE from Q1 using your final modifiedeuler function with a step size of 0.3. Plot the solution from ode45 and modifiedeuler in the same figure. Comment on the accuracy of your numerical approximation, and discuss whether the requirements from Q3 and Q4 were met (i.e. does it finish at exactly 1 s, and does the step size adapt).Explanation / Answer
function dydt = ode1_eqn(t,y)
dydt = 10 - y*y
------------------------------------------------------------------------
Save the above script as "ode1_eqn.m"
Define tspan = [0 1]; % which defines the start and end times
y0 = 0; % initial condition of 0
% call ode45 matlab function
[t,y] = ode45(@ode1_eqn,tspan,y0,stepsize);
2) Using while loop, write a function to solve ODE using Modified Euler's Method
function [tout, yout] = modifiedeuler(odefunc, tspan, y0)
%odefunc, y' = 10 - y*y
% tspan = [0 1]
% y0 = 0
% stepsize
x1 = tspan(2); x0 = tspan(1);
% calaulating the value of h
h = ( x1 - x0)/stepsize
%loop for calculating values
while k <= n
X(1,1) = x0; Y (1,1) = y0;
X( 1, k+1) = X(1,k) + h;
y_t = Y(1,k) + h* feval( odefunc , X(1,k) , Y(1,k));% Euler's formula
Y(1 ,k+1) = Y(1,k) + h/2* (feval( df , X(1,k) , Y(1,k)) + feval( df , X(1,k) + h , y_t ) ) ;
%improving results obtained by modified Eular's formula
while abs( Y(1,k+1) - y_t ) > h
y_t = Y(1,k) + h*feval( df , X(1,k) , Y(1,k+1));
Y( 1 ,k+1) = Y(1,k) + h/2* (feval( df , X(1,k) , Y(1,k)) + feval( df , X(1,k) + h , y_t ) );
end
k = k + 1;
end
tout = X;
yout = Y;
------------------------------------------------------------------------------------------------------
% Now call above function from Matlab terminal
[tout,yout] = modifiedeuler(ode1_eqn, tspan, y0, stepsize)
3.
function [tout, yout] = modifiedeuler(odefunc, tspan, y0)
%odefunc, y' = 10 - y*y
% tspan = [0 1]
% y0 = 0
% stepsize
x1 = tspan(2); x0 = tspan(1);
% calaulating the value of h
h = ( x1 - x0)/stepsize
%loop for calculating values
while k <= n
X(1,1) = x0; Y (1,1) = y0;
X( 1, k+1) = X(1,k) + h;
if(X(1,k+1) > x1)
X(1,k+1) = x1;
end
y_t = Y(1,k) + h* feval( odefunc , X(1,k) , Y(1,k));% Euler's formula
Y(1 ,k+1) = Y(1,k) + h/2* (feval( df , X(1,k) , Y(1,k)) + feval( df , X(1,k) + h , y_t ) ) ;
%improving results obtained by modified Eular's formula
while abs( Y(1,k+1) - y_t ) > h
y_t = Y(1,k) + h*feval( df , X(1,k) , Y(1,k+1));
Y( 1 ,k+1) = Y(1,k) + h/2* (feval( df , X(1,k) , Y(1,k)) + feval( df , X(1,k) + h , y_t ) );
end
k = k + 1;
end
tout = X;
yout = Y;
------------------------------------------------------------------------------------------------------
4.
function [tout, yout] = modifiedeuler(odefunc, tspan, y0)
%odefunc, y' = 10 - y*y
% tspan = [0 1]
% y0 = 0
% stepsize
x1 = tspan(2); x0 = tspan(1);
% calaulating the value of h
h = ( x1 - x0)/stepsize
%loop for calculating values
while k <= n
X(1,1) = x0; Y (1,1) = y0;
X( 1, k+1) = X(1,k) + h;
y_t = Y(1,k) + h* feval( odefunc , X(1,k) , Y(1,k));% Euler's formula
Y(1 ,k+1) = Y(1,k) + h/2* (feval( df , X(1,k) , Y(1,k)) + feval( df , X(1,k) + h , y_t ) ) ;
%improving results obtained by modified Eular's formula
while abs( Y(1,k+1) - y_t ) > h
y_t = Y(1,k) + h*feval( df , X(1,k) , Y(1,k+1));
Y( 1 ,k+1) = Y(1,k) + h/2* (feval( df , X(1,k) , Y(1,k)) + feval( df , X(1,k) + h , y_t ) );
end
k = k + 1;
end
if(h * Y(1,k+1) > 0.5)
h = h/2;
end
tout = X;
yout = Y;
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.