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
AI Thread Summary
The discussion centers on an error encountered while using MATLAB's ode45 function due to an undefined function, ivpfun. The user is unsure where to define this function, which is necessary for solving the initial value problem (IVP). A suggested definition for ivpfun is provided, indicating it should be structured as "function dydt = ivpfun(t,y)". The user is following a professor's guide, leading to some confusion about the implementation. Clarifying the function definition is essential for resolving the error and successfully running the code.
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
You haven't defined ivpfun. Read the documentation for examples of how to define a function.
 
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.
 
Back
Top