Bonjour, j'ai essayé de lire les différentes questions ou aides pour optimiser une boucle for par un calcul matriciel, mais je ne comprends pas trop comment faire dans mon cas.

Voilà, j'ai une cavité dans laquelle on a appliqué un champ B sinusoidal. Dans ma cavité, j'envois de la lumière qui doit faire différents allers retours. La lumière ne voit donc pas le même champ à chaque aller retour. Je cherche à établir une matrice représentant l'action de la cavité sur la lumière à un temps t. Cette matrice est une matrice 2*2 donnée par la relation théorique suivante :

FP=SOMME(T*[R*M²]^n*PRODUIT(Lame_B(k)) où n va de 0 à l'infini et k de 0 à n

et où lame_B(k)=[exp(i*A/2) 0 ; 0 exp(i*A/2)] où A=Bo²(1+K*sin(w(t-k*L/c))

Je dois ensuite montrer l'évolution de cette matrice dans le temps.


Voici mon code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
62
63
64
65
66
67
F=3000;
Gamma2=1E-4;
Bo=1E-4;
frequence=1000;
Teta_B=0;
 
%%%Valeurs des constantes
R = 1-pi/F;     %Coefficient de reflexion en intensité des miroirs
T = 1-R;        %Transmission des miroirs
 
L = 2.2;         %Longueur de la cavité
c = 3E8;         %Vitesse de la lumière
ISL=c/(2*L);    %ISL de la cavité
To=F/(2*pi*ISL);%Durée de vie des photons
 
 
%% Anisotropie de phase de la lame equivalente aux miroirs
deltaeq = sqrt(Gamma2)*pi/F;
 
 
%%%Matrices de Jones sur 1 passage dues à la birefringence des miroirs
M = Lame(deltaeq);
 
%%%Matrices de rotation
Teta=pi/4;
R1=Rotation(Teta); %%% Rotation = Matrice diagonale 2*2
R2=Rotation(-Teta);
 
%%%Profondeur de modulation
K=1E-2;         
 
%%%Constantes liées à la fréquence
w=2*pi*frequence;
Periode=1/frequence;
N_points=20;
D=Periode/N_points;
 
%%Determination de la matrice totale de la cavité et de Iext
n=0; 
for t_B = 0: D : Periode
 
n=n+1;
L_B=Lame_B(Bo^2*(1+K*sin(-w*t_B))^2);
FP=T*M*L_B;
 
    %%%%%%%%%%%%%%%%%%%%
    %%%%% Itérations sur le nombre d'allers retour pour determiner Iext à
    %%%%% la sortie de la cavité à un temps t
 
    for k=1:70000
 
        L_B=Lame_B(Bo^2*(1+K*sin(w*(-t_B-2*k*L/c)))^2)*Lame_B(Bo^2*(1+K*sin(w*(-t_B-(2*k-1)*L/c)))^2)*L_B;
        FP=FP+T*R^k*M^(2*k+1)*L_B;
 
    end
 
    %%%%%%%%%%%%%%%%%%%%%%
 
%%%Mise en matrice des différents paramètres
t_Bm(n)=t_B;
Iext_B(n)=(abs([0 1]*R2*FP*R1*[1;0]))^2;
It_B(n)= (abs([1 0]*R2*FP*R1*[1;0]))^2;
B(n)=Bo*(1+K*sin(-w*t_B));
Bcar(n)= (Bo*(1+K*sin(-w*t_B)))^2;
 
 
end
Ce code s'établit avec F= 3000 ce qui ne demande que 7000 itérations de k ce qui prend déjà 15s. Le problème est que j'ai un F expérimental de 100000, ce qui demande 400000 itérations avant que FP reste constante. Là le programme prend 2500 secondes. Comment faire pour réduire ce temps?