You are on page 1of 3

function

%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%
%

[t, y] = rk4(f, t0, y0, h, nmax, resul, mod)

Methode de Runge Kutta d'ordre 4 pour les systemes


d'equations differentielles de la forme y' = f(t,y)

Prealable:
Vous devez creer un fichier .m contenant la fonction f(t,y).
Voir par exemple le fichier eqdif.m.
Exemples d'appel:
[t,y] = rk4('eqdif', 0.0, [1 1], 1.0e-1, 10, 'resul.dat', 5)
Arguments
Entree:
1) f: Le nom entre apostrophes (' ') du fichier .m contenant la fonction
f(t,y). Exemple: 'eqdif' (correspondant a un fichier eqdif.m).
2) t0: Vous devez fournir le temps de depart.
3) y0: Vous devez fournir la(les) condition(s) initiale(s). y0 doit
etre un vecteur ligne, par exemple [1 2]. La dimension de y0
donne automatiquement la dimension du systeme.
4) h: Vous devez fournir le pas de temps.
5) nmax: Vous devez fournir le nombre maximal de pas de temps.
6) resul: Si vous voulez les resultats dans un fichier, vous devez
fournir le nom entre apostrophes (' ') de ce fichier.
Exemple: 'resul.dat' qui creera un fichier nomme resul.dat.
7) mod: Si vous avez fourni un fichier de resultats, vous pouvez
choisir le pas des iterations qui seront affichees dans ce fichier.
Exemple: si vous inscrivez 5, seulement les iterations qui
sont des multiples de 5 seront affichees dans le
fichier de resultats.
Si rien n'est ecrit, mod = 1.
Retour:
1) t est un vecteur contenant les temps ti.
2) y est une matrice contenant la solution obtenue.
La colonne i de y correspond a la solution de l'equation i.

nbeq = size(y0,2);
y0 = y0';
k1 = zeros(nbeq,1);
k2 = zeros(nbeq,1);
k3 = zeros(nbeq,1);
k4 = zeros(nbeq,1);
y = zeros(1,nbeq);
n = 1;
t(1) = t0;
y(1,:) = y0';
warning off
while(n <= nmax),
k1 = h * feval(f,t(n),y0);
k2 = h * feval(f,t(n)+h/2,y0+k1/2);
k3 = h * feval(f,t(n)+h/2,y0+k2/2);
k4 = h * feval(f,t(n)+h,y0+k3);
if
(any(~isfinite(k1)))|(any(~isfinite(k2)))|(any(~isfinite(k3)))|(any(~isfinite(
k4))),

disp('la fonction n''est pas definie en certains points');


return;
end
y0 = y0 + (1/6) * (k1+2*(k2+k3) + k4);
y(n+1,:) = y0';
t(n+1) = t(n) + h;
n = n+1;
end
warning on
if (nargin > 5),
if (nargin < 7),
mod = 1;
end
eqdout(f, resul, t, y,
end

h, nmax, 'de Runge-Kutta d''ordre 4',mod);

function eqdout(f, resul, t, y,

h, nmax, methode, mod)

[k1,k2] = size(y);
l = length(methode);
ligne = [];
fid = fopen(resul, 'w');
ff = [f '.m'];
fct = fopen(ff, 'r');
fit = fread(fct, 'char');
fclose(fct);
ftt = find(fit == 10);
gtt = fit(ftt(1)+ 1: length(fit));
fprintf(fid, '
Methode %s pour les systemes\r\n', methode);
for i=1:l,
ligne = [ligne '-'];
end
fprintf(fid, '
--------%s------------------\r\n\r\n', ligne);
fprintf(fid, 'Fonctions du systeme : \r\n');
fprintf(fid, '--------------------\r\n');
fwrite(fid, gtt);
fprintf(fid, '%s\r\n\r\n', ' ');
fprintf(fid, 'Arguments initiaux :\r\n');
fprintf(fid, '------------------\r\n');
fprintf(fid, 'Pas de temps
: h = % 4.3f\r\n', h);
fprintf(fid, 'Nombre maximal de pas de temps : nmax = %6.0f\r\n', nmax);
fprintf(fid, 'Temps de depart
: t_0 = % 4.3f\r\n', t(1));
if (k2 > 1),
pluriel = 's';
else
pluriel = '';
end
fprintf(fid, 'Condition%s initiale%s : y_0 = % 17.10E\r\n',pluriel,
pluriel, y(1,1));
fprintf(fid, '
% 17.10E\r\n', y(1,2:k2));
fprintf(fid, '\r\n\r\n');
if (k2 == 1),
fprintf(fid, '
j
t_j
y_j\r\n\r\n');
elseif (k2 == 2)
fprintf(fid, '
j
t_j
y(i,j) ou j=1,2\r\n\r\n');

else
fprintf(fid, '
j
t_j
y(i,j) ou
j=1,...,%1.0f\r\n\r\n', k2);
end
for n=0:k1-1,
if (rem(n,mod) == 0),
if (k2 == 1),
fprintf(fid, '%5.0f % 8.3f % E\r\n', n, t(n+1), y(n+1,1));
elseif (k2 == 2)
fprintf(fid, '%5.0f % 8.3f % E % E\r\n', n, t(n+1), y(n+1,1),
y(n+1,2));
elseif (k2 == 3)
fprintf(fid, '%5.0f % 8.3f % E % E % E\r\n', n, t(n+1), y(n+1,1),
y(n+1,2), y(n+1,3));
else
r = rem(k2,3);
p = fix(k2/3);
fprintf(fid, '%5.0f % 8.3f % E % E % E\r\n', n, t(n+1), y(n+1,1),
y(n+1,2), y(n+1,3));
for k=2:p,
fprintf(fid, '%s % E % E % E\r\n', blanks(14), y(n+1,3*(k-1)+1),
y(n+1,3*(k-1)+2), y(n+1,3*(k-1)+3));
end
if (r == 1),
fprintf(fid, '%s % E\r\n', blanks(14), y(n+1,k2));
elseif (r == 2)
fprintf(fid, '%s % E % E\r\n', blanks(14), y(n+1,k2-1),
y(n+1,k2));
end
end
end
end
fclose(fid)

You might also like