Optimiser la vitesse d'un programme matlab

Fermé
Vorlane - 7 juil. 2009 à 10:33
 Vorlane - 8 juil. 2009 à 11:42
Bonjour,

Je sais que matlab n'aime pas les boucles, mais voilà, pour differents temps, je dois faire une somme de produits programmée de la façon suivante :

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 k pour determiner la matrice FP à
%%%%% la sortie de la cavité à un temps t

for k=1:7000

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

La fonction Lame_B est une matrice 2*2 de la forme suivante : (exp(i*delta/2) 0 ; 0 exp(-i*delta/2) où delta=Bo^2*(1+K*sin(w*(-t_B-2*k*L/c)))^2)

J'ai pensé au calcul matriciel, mais je ne vois pas ce que ça apporterait.

Pourriez vous m'aider? Je suis débutante sous matlab.
A voir également:

6 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
7 juil. 2009 à 12:16
Il n'est pas toujours possible de se passer des boucles. Ici par exmple, tu utilise ton itérateur k pour en puissance, du coup, je ne vois pas comment éviter la boucle.
0
Le soucis, c'est qu'ici, j'utilise des paramètres de façon à avoir un temps d'execution du programme égale à environ 0.8secondes. Le soucis, c'est que les parametre expérimentaux que j'aimerais rentrer necessitent un nombre d'iterations sur k devant aller jusqu'à 400000, ce qui represente un tps d'execution de 40min environ. Ce qui est très long pour une petite mesure...
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
7 juil. 2009 à 14:14
2400, ça fait un sacré facteur de différence.
La solution serait peut être d'interfacer avec une fonction compilée, donc plus rapide.
Il faut faire ça en C++. Je ne peut pas te donner plus de détail par contre.

Une piste, c'est aussi de mieux arranger ton calcul. Par exemple, d'une itération à l'autre L/c ne change pas, tu définis donc une nouvelle variable en dehors de la boucle Lsc =L/c sur tu utilise ensuite. ça fait un calcul de moins à réaliser.
Ensuite, il faut savoir que le plus couteux c'est les multiplication, il faut donc factoriser au maximum ton calcul pour faire le minimum de multiplication.
0
Ah si je pouvais utiliser le C! Mais non, c'est Matlab imposé ^^ Je vais déjà remplacer le L/c. Les multiplications je vois comment plus factoriser, mais je cherche encore! Merci pour ton aide en tout cas
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
8 juil. 2009 à 08:25
Première passe de simplification :
Bo2=Bo^2;
Lc=L/c;

for k=1:7000
dk=2*k;

L_B=Lame_B(Bo2*(1+K*sin(w*(-t_B-dk*Lc)))^2)*Lame_B(Bo2*(­1+K*sin(w*(-t_B-(dk-1)*Lc)))^2)*L_B;
FP=FP+T*R^k*M^(dk+1)*L_B;
end 

deuxième passe, on regroupe les termes calculé plusieurs fois, et exeptionnellement je dévellope un terme, car il supprime une multiplication:
Bo2=Bo^2;
Lc=L/c;

for k=1:7000
dkLc=2*k*Lc;
diff=-t_B-dkLc;%% j'économise une opération de différence, c'est peu, mais c'est toujours ça

L_B=Lame_B(Bo2*(1+K*sin(w*diff))^2)*Lame_B(Bo2*(­1+K*sin(w*(diff+Lc)))^2)*L_B;
FP=FP+T*R^k*M^(dk+1)*L_B;
end 

Là je pense avoir réduit au minimum le nombre d'opération simplement. Mais d'après ce que tu me dis sur Lame_B, je pense qu'il est possible de simplifier encore. D'après ce que tu me dit, Lame_B(a)*Lame_B(b)==Lame_B(a+b) ce qui te permettrait encore de simplifier ton opération.
Bo2=Bo^2;
Lc=L/c;

for k=1:7000
dkLc=2*k*Lc;
diff=-t_B-dkLc;%% j'économise une opération de différence, c'est peu, mais c'est toujours ça

L_B=Lame_B(Bo2*((1+K*sin(w*diff))^2+(­1+K*sin(w*(diff+Lc)))^2))*L_B;
FP=FP+T*R^k*M^(dk+1)*L_B;
end 
Après, peu être qu'en dévellopant et en réduisant les termes il y a encore moyen de gagner.
Néanmoins, je ne pense pas que toutes ces simplifications te ferons gagner le temps qui te manque, mais peut être tout de même un facteur 2 ou 3.
Pour gagner réellement du temps, il faut souvent passer par des analyses mathématiques (sommes de suites, série de Fourier...).
0
Merci beaucoup pour ton aide. Le temps d'execution aux parametres expérimentaux est descendu à 25min, ce qui est satisfaisant pour ma responsable de stage. Elle regardera ulterieurement si mathematiquement il est possible de réduire. Mon stage se terminant vendredi, ce temps d'execution est très bien.

Merci encore
0