Vous êtes sur la page 1sur 2

function U = euler_expl( U0, t0, tmax, D,N)

// a : fonction a(t) dans l'équation Un+1 = (1 + D * a(tn)) * Un


// U0 : vecteur de valeurs initiales U(t0)
// t0 : temps initial
// tmax : temps maximal pour la solution
// D : pas de subdivision uniforme

// Calcul du nombre d'itérations


//N = floor((tmax - t0) / D);

// Initialisation des vecteurs temps et solution


t = linspace(t0, tmax, N+1);
U = zeros(2,N+1);
const = (U0(1)^2)+(U0(2)^2)

// Assigner les valeurs initiales


U(:,1) = U0;
I = [0,-1;1,0]

// Boucle principale de calcul du schéma d'Euler


for j = 1:N
//const = (U(1,j)^2)+(U(2,j)^2) considèration du module comme constant si cette ligne n'est pas
prise en compte car on le sait par la question 1
const = (U(1,j)^2)+(U0(2,j)^2)
U(:,j+1) = ( U(:,j) + D * (-I)*((const)*U(:,j)));
end

// Retourner les temps et la solution


//result = [t, U];
//disp(result);
endfunction

// Exemple d'utilisation

U0 = [0; 10]; // Vecteur de valeurs initiales U(t0)


t0 = 0; // Temps initial
tmax = 0.5; // Temps maximal pour la solution
T2 = tmax - t0
D = 0.00005; // on ne peut pas mettre de pas plus petit car apres sa fait linspace argument #3 : an
integer value expected je crois c car le N2 devient trop grand mais jsp
N2 = T2/D

/*
u_0 = 0 + 10*%i;
T = 0.5;
N = 1000
delta_t = T/N;
tol = 1e-5;
*/
// Appel de la fonction du schéma d'Euler
euler_num = euler_expl(U0, t0, tmax, D, N2);
euler_numeric = euler_num(1,:) + euler_num(2,:)*%i
// Fonction pour calculer la solution analytique
function u_analytic = solve_analytic(u_0, t)
u_analytic = u_0 * exp(-%i * abs(u_0)^2 * t);
endfunction

// Calculer la solution analytique pour les mêmes instants


t_value = t0:D:tmax;
u_analytic2 = zeros(1, length(t_value));
for j = 1:length(t_value)
u_analytic2(j) = solve_analytic(U0(1) +U0(2)*%i, t_value(j));
end

// Comparer les solutions numérique et analytique


clf();
plot(t_value, imag(euler_numeric ), 'r'); // Plot la solution numérique en rouge
plot(t_value, imag(u_analytic2), 'b'); // Plot la solution analytique en bleu
plot(t_value, real(euler_numeric ), 'g'); // Plot la partie réelle de la solution numérique en rouge
plot(t_value, real(u_analytic2), 'magenta'); // Plot la partie réelle de la solution analytique en bleu
plot(t_value, abs(euler_numeric ), 'cyan'); // Plot le module de la solution numérique en rouge ps on le
voit mal car superposé au la valeur analytic il faut ne plot que les module pour vraiment voir la
différence minime entre eux
plot(t_value, abs(u_analytic2), 'yellow'); // Plot le module de la solution analytique en bleu

xlabel('Temps (t)');
ylabel('u(t) Analytique vs Numérique');
legend('imag Numérique', 'imag Analytique', 'real Numérique', 'real Analytique','abs Numérique','abs
Analytique');
title('Comparaison entre la solution numérique et analytique');

Vous aimerez peut-être aussi