Search code examples
octavenumerical-methods

Solving an ODE using ode45 in Octave


I am trying to solve the following ODE using Octave, and in particular the function ode45.

dx/dt = x(1-x/2), 0<= t <= 10

with the initial condition x(0) = 0.5

But the graphs I get are not what I expect.

enter image description here

I think that the graph with red crosses represents x' vs x and not x vs t.

The code is the following:

clear all
close all
% Differential Equation: x' = x(1-x/2)
function dx = f(x,t)
   dx = x*(1-x./2);
endfunction 
% Exacte Solution: 2*e^t/(3+e^t) 
function xexac =solexac(t)
xexac =  (2*exp(t))./(3+exp(t));
endfunction
x0=0.5;   %%Initial condition
T=10;            %% maximum time T
t=[0:0.1:T];              %% we choose the times t(k) where is calculated 'y'  
sol=ode45(@f,[0,T],x0);   %% numerical solution of (E)
tt=sol.x;y=sol.y;         %% extraction of the results
clf;hold on  ;            %% plot the exact and numerical solutionss
plot(tt,y,'xr')
plot(t,solexac(t),'-b') 
xlabel('t')
ylabel('x(t)')
title('Chemostat Model')
legend("Numerical Solution","Exacte Solution ")

It would we great that any of you could help me with this code.


Solution

  • ode45 expects the ODE function to have arguments in the order (time, state), so exactly the other way around. What you effectively did was integrate t-t^2/2, and the resulting function 0.5+t^2/2-t^3/6 is what you got in the plot.