A voir également:
- Optimiser la vitesse d'un programme matlab
- Optimiser son pc - Accueil - Utilitaires
- Vitesse processeur - Guide
- Augmenter vitesse pc windows 10 - Guide
- Test vitesse pc - Guide
- Test vitesse ssd - Guide
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
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.
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...
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
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.
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.
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
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
8 juil. 2009 à 08:25
Première passe de simplification :
deuxième passe, on regroupe les termes calculé plusieurs fois, et exeptionnellement je dévellope un terme, car il supprime une multiplication:
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.
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...).
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; endAprè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...).
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
Merci encore