Euler's Method In Matlab

I am working on a problem involves my using the Euler Method to approximate the differential equation df/dt= af(t)−b[f(t)]^2, both when b=0 and when b is not zero; and I am to compare the analytic solution to the approximate solution when b=0.

f(1) = 1000;
t(1)= 0;
a = 10;
b = 0 ;
dt = 0.01;
Nsteps = 10/dt;

for i = 2:Nsteps
    t(i) = dt + t(i-1);
    %f(i) = f(i-1)*(1 + dt*(a - b*f(i-1)));
    f(i) = f(i-1)*(1 + a*dt); 
end

plot(t,f,'r-')

hold on

fa= a*exp(a*t)

plot(t,fa,'bo')

When b=0, the solution to the differential equation is f(t)=c*exp(at). When I apply the initial condition, that f(0) = 1000, then the differential equation becomes f(t)=1000*exp(at). Now, my professor said that a differential equation has an analytic solution, no matter what time step you use, the graph of analytic solution and the approximation (Euler's Method) will coincide. So, I expected the two graphs to overlap. I attached a picture of what I got.

Why did this occur? In order to get the graphs to overlap, I changed 1000 to 10, which is a=10, just for the heck of it. When I did this, the two overlapped. I don't understand. What am I doing incorrectly?

Answers


Why should the numerical solution give the same answer as the analytical one? Looking at pixels overlapping on the screen is not a very precise way to discern anything. You should examine the error between the two (absolute and/or relative). You might also want to examine what happens when you change the step size. And you might want to play with a linear system as well. You don't need to integrate out so far to see these effects – just setting t equal 0.1 or 1 suffices. Here is some better-formatted code to work with:

t0 = 0;
dt = 0.01;
tf = 0.1;
t = t0:dt:tf;    % No need to integrate t in for loop for fixed time step
lt = length(t);
f = zeros(1,lt); % Pre-allocate f
f0 = 1000;       % Initial condition
f(1) = f0;
a = 10;
for i = 1:lt-1
    f(i+1) = f(i) + a*f(i)*dt;
    %f(i+1) = f(i) + a*dt; % Alternative linear system to try
end

% Analytic solution
fa = f0*exp(a*t);
%fa = f0+a*t; % Alternative linear system to try

figure;
plot(t,f,'r-',t,fa,'bo')

% Plot absolute error
figure;
plot(t,abs(f-fa))

% Plot relative error
figure;
plot(t,abs(f-fa)./fa)

You're also not preallocating any of your arrays which makes you code very inefficient. My code does. Read about that here.

Much more beyond this is really off-topic for this site, which is focussed on programming rather than mathematics. If you really have questions about the numerical details that aren't answered by reading your text book (or the Wikipedia page for the Euler method) then you should ask them at Math.StackExchange.


Numerical methods are not precise and there is always an error between numerical and analytical solution. As Euler's method is first order method, global truncation error is proportional to step of integration step.


Need Your Help

Including one erb file into another

ruby erb templating

I'm writing a command-line tool that will ultimately output an HTML report. The tool is written in Ruby. (I am not using Rails). I'm trying to keep the logic of the application in one set of files,...

How to create general lists / template lists in C#

c# .net xna-4.0

I have one main class with several inherited members who all overload the same Draw method of the parent class, but have different Initialize methods. Is it somehow possible to use the same list ty...