-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrk4.m
61 lines (52 loc) · 1.55 KB
/
rk4.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
function [t,y] = rk4(f,t0,y0,h,nbpas)
%
% Méthode de Runge-Kutta d'ordre 4 pour les systèmes d'équations
% différentielles de la forme y'(t) = f(t,y(t)) {SD}
%
% Préalable:
% Vous devez creer un fichier .m contenant la fonction f(t,y).
% Voir par exemple le fichier eqndiff.m
%
% Exemples d'appel:
% [t,y] = rk4('eqndiff',0.0,[1 1],1.0e-1,10)
%
% Arguments en entrée:
% 1) f: Le nom entre apostrophes (' ') du fichier .m contenant la fonction
% f(t,y).
% 2) t0: le temps initial
% 3) y0: la(les) condition(s) initiale(s), sous la forme d'un vecteur ligne:
% par exemple, [1 2]. La dimension de y0 donne la dimension du système
% 4) h: le pas de temps
% 5) nbpas: le nombre maximal de pas de temps
%
% Arguments en sortie:
% 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'équation i
% on fait quelques calculs préliminaires
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
% la boucle transitoire
while(n <= nbpas),
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