Upload
joel-metogbe-zinsalo
View
216
Download
0
Embed Size (px)
Citation preview
7/21/2019 Mthode de RK4
1/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 offwhile(n
7/21/2019 Mthode de RK4
2/3
disp('la fonction n''est pas definie en certains points');return;
endy0 = y0 + (1/6) * (k1+2*(k2+k3) + k4);y(n+1,:) = y0';t(n+1) = t(n) + h;n = n+1;
endwarning on
if(nargin > 5),if(nargin < 7),
mod = 1;endeqdout(f, resul, t, y, h, nmax, 'de Runge-Kutta d''ordre 4',mod);
end
functioneqdout(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);
fori=1:l,ligne = [ligne '-'];
endfprintf(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';elsepluriel = '';
endfprintf(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');
7/21/2019 Mthode de RK4
3/3
elsefprintf(fid, ' j t_j y(i,j) ou
j=1,...,%1.0f\r\n\r\n', k2);endforn=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));
fork=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));endif(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
endend
fclose(fid)