Méthode de RK4

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)