Vous êtes sur la page 1sur 2

//Date : 27-09-2018

//Fait par : ZAOUI


// Objet : R?�solution num?�rique de l'?�quation de transport en 1D
// U_t + a U_x = 0 sur t>0 x dans [-pi, pi]
//Condition initiale : U_o(x) = sin(x)
//Conditions aux limites : type p?�riodique.

//
//
//

clear all; clc; clf();


funcprot(0);

a = 1; // vitesse de transport
Nb_pt = 150; // Nombre de noeuds
CFL = 0.5; // condition de Courant–Friedrichs–Lewy

// discr?�tisation de l'espace physique (ici l'intervale [-pi, pi]).


// Cette discr?�tisation est li?�e ? la nature des conditions aux limites qu'on a.
axe_x = linspace(-%pi, %pi, Nb_pt+1);

h = axe_x(2) - axe_x(1); // = dx
k = CFL*h/a; // = dt
lambda = k/h;

// Application du Sch?�ma utilis?�


Schema = "Centre"; // "Avant" "Arriere" "Centre"

// D?�fintion et (D?�claration) de la condition initiale


function y = cond_init(x)
y = sin(x) ;
endfunction

// Initialisation : on appelle la fonction <<cond_init>>


cond_int = cond_init(axe_x);

// Tracer la condition initiale


plot2d(axe_x, cond_int,[-3],leg="Condtion initiale" ,rect=[-%pi,-1.5,%pi,1.5])
//pause

// ?� t = to (= 0); U(to, x_m) = U_o(x_m) m= 1 ---> Nb_pt


sol_app = cond_int;

// ?� t = to, la solution exacte (discr?�te) = la solution approch?�e


sol_exact = cond_int;

//It?�rations sur le temps

N_iter = 2*(Nb_pt/(a*lambda)); // (Si on veut) parcourir une p?�riode ou plus


for iter = 1:N_iter;
//iter = iter +1;

select Schema,
case "Avant" then
//============== Avant ===============
sol_app(1:Nb_pt) = (1 + a*lambda)*sol_app(1:Nb_pt) - a*lambda*[sol_app(2:Nb_pt),
sol_app(1)];

case "Arriere" then


//============== Arri?�re ===============
sol_app(1:Nb_pt) = (1 - a*lambda)*sol_app(1:Nb_pt) + a*lambda*[sol_app(Nb_pt),
sol_app(1:Nb_pt-1)];

case "Centre" then


//============== Centr?� ===============
sol_app(1:Nb_pt) = sol_app(1:Nb_pt)-0.5*a*lambda*([sol_app(2:Nb_pt),
sol_app(1)]...
- [sol_app(Nb_pt), sol_app(1:Nb_pt-1)]);
else
error("Aucun schema n est choisi ")
end

// D?�calage 'Transport' de la solution exacte

if(modulo(iter,2)==0) then
sol_exact(1:Nb_pt) = [sol_exact(Nb_pt), sol_exact(1:Nb_pt-1)];

clf()
//plot2d(axe_x', [cond_int' sol_app'],[5 4],leg="Condition initial @ Solution
approch?�" ,rect=[-%pi,-1.5,%pi,1.5])
plot2d(axe_x', [cond_int', sol_exact', sol_app'],[-3 -5 -4],...
leg="Condition initial @ Solution exacte @ Solution approch?�"
,rect=[-%pi,-1.5,%pi,1.5])
xpause(5*10^5)
//pause
end

end

Vous aimerez peut-être aussi