Solving An IVP on Matlab with ODE 45 with different tolerances

  • Thread starter Thread starter ver_mathstats
  • Start date Start date
  • Tags Tags
    Ivp Matlab Ode
Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
2 replies · 2K views
ver_mathstats
Messages
258
Reaction score
21
Homework Statement
Integration of a problem using Matlab ode45 and matlab ode23, we need to see it for a variety of different error tolerances. The numbers are below, I've included a picture to keep it neater.
Relevant Equations
Matlab ODE45
Screen Shot 2022-12-05 at 1.18.19 PM.png


My code is as follows: but when I use the function in my command window exactsol(t) and input a tolerance but there is an error in LINE 19 saying unrecognized ivpfun, could someone help me fix it as I am unsure of how to proceed from here.

Matlab:
function y = exactsol(t)
y = zeros (2,1);
y(1) = exp(-0.1*t) + exp(-200*t);
y(2) = exp(-200*t);
clear;
clf
global no_fcn;
T0 = [0 100];
y0 = [2, 1];
tol = 1;
fprintf ('*** \t ode45 \t ***\n');
fprintf ('tol\t error\t steps\t ave step \t fcn eval\t time \n');
for i=1:12
    no_fcn = 0;
    tol = tol/10;
    tolerance(i) = tol;
    options=odeset('AbsTol', tol);
    ts = cputime;
    [t,y]=ode45(@ivpfun, T0, y0, options);
    time(i) = cputime - ts;
    fcn_eval(i) = no_fcn;
    error (i) = norm(y(end,:) - exactsol(t(end)));
    h = t(2:end) - t(1:end-1);
    if (i == 7)
        plot (t(1:end -1), h)
        ylabel ('stepsize');
        xlabel ('t');
        title ('ode45, tol = 1e-7');
        print ’ode45.ps’
    end
    steps(i) = length(h);
    ave_step(i) = sum(h)/steps(i);
    fprintf ('% .0e\t%.2e\t% 5d\t% .2e\t% 5d \t %.1e\n', tolerance(i), error(i), steps(i), ave_step(i), fcn_eval(i), time(i));
end
tol = 1;
fprintf ('*** \t ode23s \t ***\n');
fprintf ('tol\t error\t steps\t ave step \t fcn eval\t time \n');
for i=1:12
    no_fcn = 0;
    tol = tol/10;
    tolerance(i) = tol;
    options=odeset('AbsTol', tol);
    ts = cputime;
    [t,y]=ode23s(@ivpfun, T0, y0, options);
    time(i) = cputime - ts;
    fcn_eval(i) = no_fcn;
    error (i) = norm( y(end ,:)'- exactsol( t(end) ) );
    h = t(2:end) - t(1:end -1);
    if (i == 7)
        plot (t(1:end -1), h)
        ylabel ('stepsize');
        xlabel ('t');
        title ('ode23a, tol = 1e-7');
        print ’ode23.ps’
    end
    steps(i) = length(h);
    ave_step(i) = sum(h)/steps(i);
    fprintf ('% .0e\t%.2e\t% 5d\t% .2e\t% 5d \t %.1e\n', tolerance(i), error(i),steps(i), ave_step(i), fcn_eval(i), time(i));
end
 
Physics news on Phys.org
pasmith said:
You haven't defined ivpfun. Read the documentation for examples of how to define a function.
Yes sorry I was looking at that afterwards, I think I'm just struggling with now where to define it. function dydt = ivpfun(t,y) would be my function right? Sorry I am using my professors guide as an example so that's why I am a little confused.