{--------------------------------------------} {UE10. 2006. UNSA. { Modele proie predateur (travaux de S. Rinaldi} {--------------------------------------------} Program Proipred; Uses Crt, graph, Graph2D; Const lim = 30; var X, Y, k, k0, b, b0, a, a0, e, m, r, d, t, dt, phi : real; {------------------------------------------------} {Procedure d'initialisation} {------------------------------------------------} Procedure initiale; begin a0 := 4 * Pi; b0 := 0.3; e := 1.0; m := 2 * Pi; k0 := 1.0; r := 2 * Pi; X := 0.5; Y := 0.5; T := 0.0; dt := 0.01; phi:= 0.5; end; {------------------------------------------------} {Procedure d'integration meth. de Euler } { A titre d'exercice, ecrire une procedure RK4 } {------------------------------------------------} Procedure Euler; begin {les parametres variant dans le temps} b := b0 * (1 + 0.2 * sin(2 *pi * t)); a := a0 * (1 + 0.2 * sin(2 * Pi *(t -phi))); k := k0 * (1 + 0.4 * sin(2 * Pi * t)); {calculs des proies et predateurs} X := X + X*(r * (1 - (X/k)) - (a * Y / (b + X)) ) * dt; Y := Y + Y * (( e * a * X) / (b + x) -m) * dt; end; {----------------------------------------------} { trace du portrait de phase } {----------------------------------------------} Procedure phase; begin initiale; Fenetre (- 0.05, 1.1, -0.05, 1.1); Cloture(50, 250, 250, 450); Axes; Gradue(0.2, 0.2); DeplaceEn(X,Y); repeat t:= t+dt; Euler; {Selon les parametres en entree, le modele peut aboutir a des valeurs aberrantes telles que des effectifs negatifs et meme des debordements (overflow). D'ou les tests suivants (attention a la difference entre le ET et le OU logique} IF( ( X>0) and (Y >0) ) then traceVers(X,Y); until ( (t>Lim) or (X<=0) or (Y<=0) ); end; {----------------------------------------------} { evolution des proies } {----------------------------------------------} Procedure X_fonction_temps; BEGIN initiale; Fenetre (- 0.05, 20, -0.05, 1.1); Cloture(50, 500, 120, 220); Axes; Gradue(5, 0.2); DeplaceEn(t,X); repeat t := t+dt; Euler; IF( ( X>0) and (Y>0)) then TraceVers(t,X); until ((t>Lim) OR (X<=0) OR (Y<=0) ); end; {----------------------------------------------} { evolution des predateurs } {----------------------------------------------} Procedure Y_fonction_temps; begin initiale; Fenetre (- 0.05, 20, -0.05, 1.1); Cloture(50, 500, 10, 210); Axes; Gradue(5, 0.2); DeplaceEn(t,X); repeat t := t+dt; Euler; IF( ( X>0) and (Y>0)) then TraceVers(t,Y); until ((t>Lim) OR (X<=0) OR (Y<=0) ); end; {----------------------------------------------} { PRINCIPAL } {----------------------------------------------} BEGIN EcranGraphique; Phase; X_Fonction_temps; Y_fonction_temps; repeat until keypressed; EcranTexte; END. {--------------------------------}