Curiosity - Mot-clé - Matlab2024-01-27T00:01:40+01:00urn:md5:167b0ddfbb8af8fbf0a6e94ec75719b5DotclearPython (vs Matlab)urn:md5:25b28c66a022ce056a57ad78055a219e2014-05-15T23:13:00+00:002015-02-24T10:37:58+00:00Eric CabrolInfoMatlabPython <p><a href="http://lorenabarba.com/blog/why-i-push-for-python/" hreflang="en">Why I push for Python</a></p>
<p><a href="http://metarabbit.wordpress.com/2013/10/18/why-python-is-better-than-matlab-for-scientific-software/" hreflang="en">Why Python is Better than Matlab for Scientific Software</a></p>
<p><a href="http://cyrille.rossant.net/why-using-python-for-scientific-computing/" hreflang="en">Why use Python for scientific computing ?</a></p>
<p><a href="http://www.pyzo.org/python_vs_matlab.html" hreflang="en">Python vs Matlab</a></p>
<p><a href="http://www.stat.washington.edu/~hoytak/blog/whypython.html" hreflang="en">10 Reasons Python Rocks for Research (And a Few Reasons it Doesn’t)</a></p>
<p><a href="http://stevetjoa.com/305/" hreflang="en">I used Matlab. Now I use Python</a></p>
<p><a href="http://phillipmfeldman.org/Python/Advantages_of_Python_Over_Matlab.html" hreflang="en">Eight Advantages of Python Over Matlab</a></p>Synchronisation de métronomesurn:md5:5058f9497931655e02978cadf1f613552008-11-03T15:49:00+00:002015-12-15T10:49:24+00:00Eric CabrolIntelloMatlabscience amusantesimulation <p>Tous les SciGeeks ont déjà vu <a href="http://www.youtube.com/watch?v=W1TMZASCR-I" hreflang="en">cette vidéo</a> illustrant la synchronisation de métronomes posés sur une planche libre de rouler "sans" frottement sur une table. En mécanicien sûr de sa science, en la voyant je me suis contenté de marmonner un truc du genre "suffit d'écrire le principe fondamental de la dynamique, je suis certain qu'on doit rapidement comprendre pourquoi" avec l'air satisfait de celui qui sait au moins où chercher la réponse, à défaut de savoir la trouver dans les plus brefs délais.
C'est sans doute l'instinct de préservation de mon temps libre qui m'a retenu de m'y pencher plus avant, me cantonnant à y réflechir quelques minutes avant de m'endormir, à des moments où j'étais certain de n'avoir sous la main ni stylo ni licence Matlab susceptible de révéler mon incompétence. <br />
D'autres n'ont pas eu cette faiblesse, puisque c'est même <a href="http://blogs.mathworks.com/seth/2008/09/30/challenge-metronome-synchronization/" hreflang="en">devenu</a> un challenge sur l'un des blogs de la communauté Mathworks. Les meilleures contributions se trouvent <a href="http://blogs.mathworks.com/seth/2008/10/16/metronome-challenge-winners/" hreflang="en">ici</a>.</p>Matlab, l'esperanto du calcul scientifiqueurn:md5:8f591703fbcb970293d8682a28853e292008-07-28T17:48:00+00:002019-09-08T09:42:54+00:00Eric CabrolIntelloMatlabsimulation <p>La société Mathworks organise régulièrement des mini-séminaires de présentation des fonctionnalités de leurs outils (Matlab, Simulink et l'ensemble des toolboxes associées), à chaque fois autour d'une thématique donnée. L'accès au séminaire est gratuit (Mathworks récupère amha largement son investissement en faisant un peu de pub pour la dernière release, tout en collectant des infos sur ses clients), ça dure une demi-journée, et j'aime bien cet espèce d'oecuménisme qui regroupe gens des télécoms, de la finance, du transport, de l'énergie, autour d'un même totem. <br />
A l'occasion du dernier ("Techniques de mathématiques avancées avec Matlab"), on a eu droit à une présentation intitulée "Dynamiques ondulatoires non linéaires et cours boursiers", sujet pas peu à la mode. Des cours d'action ou des indices boursiers sont passés à la moulinette d'outils d'analyse fréquentielle et/ou temporelle (Fourier, ondelettes ...) afin d'extraire des estimateurs permettant de prévoir leur évolution ultérieure ... indépendamment de tout input externe !<br />
... !? <br />
La recette n'a pas été donnée, c'est un travail de recherche en cours au cneurseu(tm), l'article n'est pas encore publié, mais ça sonnait quand même bizarrement. Quand on essaie de construire des estimateurs de ce type, par exemple des filtres de Kalman, en général on s'appuie sur un vecteur d'entrées (de "commandes"), représentant l'ensemble des externalités connues (supposées déterministes - on rajoute du bruit ensuite). Là ça ressemble à du filtrage particulaire, mais pour un processus qui est tout sauf markovien.</p>Plopurn:md5:f43bf3bcd9cff0ca1e7a91208141da7e2006-12-11T18:11:00+00:002015-11-21T15:52:25+00:00Eric CabrolIntellobouchonChampagneMatlabscience amusante <p>Je viens de découvrir le <a href="http://www.procrastin.fr/blog/index.php?2005/12/26/68-champagne" hreflang="fr">blog de procrastin</a>. Ce garçon me plait bien, il s'intéresse lui aussi au <a href="http://www.procrastin.fr/blog/index.php?2005/11/11/53-un-spaghetto-des-spaghetti" hreflang="fr">processus de rupture des spaghetti</a>, et nous apprend que
des chercheurs s'interrogent sur la vitesse de <a href="http://www.procrastin.fr/blog/index.php?2005/08/02/21-pedaler-dans-le-porridge" hreflang="fr">nage dans un sirop</a>.
Cependant son billet consacré au bouchon de champagne, et plus précisément à son <a href="http://www.procrastin.fr/blog/index.php?2005/12/26/68-champagne" hreflang="fr">interaction avec le globe oculaire humain</a>, me laisse sur ma <del>faim</del> soif. Il y affirme en effet que, sous l'effet de la pression de 6 bars qui règne dans la bouteille, le bouchon est éjecté à 13 m/s, et met de fait moins de 5 centièmes pour atteindre l'oeil du fêtard impatient.
<br />
<br />
En supposant qu'il s'agit d'une pression absolue, cela signifie que le bouchon est soumis à 5 bars de pression relative. Le diamètre de l'intérieur d'un col de bouteille étant d'environ 25mm, la surface en contact avec le gaz est de 5 cm^2. Puisque 1 bar ~ 10 N/cm^2, le bouchon est donc soumis à un effort de 250 N.<br />
Jusque là, rien de bien compliqué. J'ai ensuite trouvé pour le liège une densité de 150 kg/m^3. Il s'agit j'imagine de la densité du liège non compressé, or la partie du liège située dans le col de la bouteille est fortement comprimée. Le diamètre initial du bouchon est à peu près celui du champignon qui en forme la tête (aux effets de <a href="http://fr.wikipedia.org/wiki/Coefficient_de_Poisson" hreflang="fr">Poisson</a> près). Je n'ai pas de bouteille sous la main, disons pour faire simple que le diamètre initial du bouchon est de l'ordre d'une quarantaine de millimètres, et sa hauteur d'environ 50. On arrive alors à une masse d'une dizaine de grammes.
<br />
<br />
Même les non-mécaniciens de mes lecteurs se souviennent peut-être du principe fondamental de la dynamique qu'ils ont normalement dû apprendre au lycée :<strong> F = m.a</strong>, où <strong>F</strong> est la résultante des forces appliquées sur un solide, <strong>m</strong> sa masse, et <strong>a</strong> l'accélération résultante.
En négligeant, dans les premiers centièmes de seconde qui suivent le décollage, l'effet de la trainée aérodynamique, la seule force qui s'exerce sur le bouchon est celle due à la pression en CO2 au sein de la bouteille (et la gravité, aussi, mais elle est négligeable).<br />
250 Newtons appliqués sur une masse de 10 grammes lui communiquent une accélération de 25000 m/s^2, soit 2500g ! Vous comprenez mieux pourquoi le pauvre <em>g</em> dû à la gravité a été supposé négligeable ...<br />
Au bout de deux millièmes de seconde, le bouchon a atteint la vitesse de 50 m/s (v=a.t), et parcouru 5 cm (x=a.t^2/2). La vitesse d'éjection pourrait-elle n'être que de 13 m/s comme l'affirme Procrastin ? Il faudrait pour cela que l'effet de propulsion dû au gaz cesse au bout d'un demi-millième de seconde. Le bouchon n'aurait alors parcouru qu'une distance de l'ordre de 3 mm (temps réduit d'un facteur 4, donc distance d'un facteur 16) : il me semble très peu probable que l'effet propulsif disparaisse au bout d'un trajet aussi court. <br />
<br />
Revenons donc à mon hypothèse d'une force propulsive (évidemment non constante en réalité mais, hein, bon, on est sur un blog ici, pas à la Nasa) qui pousse notre bouchon jusqu'à ce qu'il ait parcouru une distance comparable à sa longueur, lui communiquant donc une vitesse d'environ 50 m/s. On entre alors dans une deuxième phase de vol, où la gravité et surtout la trainée aérodynamique sont les seules forces à agir sur le bouchon. L'effort aérodynamique résistant est de la forme <strong>F_aero = 1/2 rho S Cx v^2</strong>
où <strong>rho</strong> est la masse volumique de l'air (1.2 kg/m^3 à 20°, le calcul est faussé si vous sabrez le champagne en plein air, surtout fin décembre), <strong>S</strong> la surface (frontale), <strong>v</strong> la vitesse, et <strong>Cx</strong> ... le Cx. Comme pour les voitures. Non, pas la Citroen Cx, <a href="http://pboursin.club.fr/pdgaero.htm" hreflang="fr">le Cx</a> que vantaient, fut un temps, les constructeurs.<br />
Bon, évidemment, les maisons de champagne ne communiquent pas vraiment sur ce genre de données, il va falloir faire avec ce qu'on a. C'est-à-dire ... pas grand chose. Le premier obstacle, c'est d'intégrer un truc en v^2. Ayant la flemme de me forcer à résoudre ce truc (si tant est que j'y arrive encore), j'ai trouvé beaucoup plus ludique de faire un petit modèle Simulink :
<br />
<img src="http://eric.cabrol.free.fr/dotclear/images/bouchon_simulink.gif" alt="" />
<br />
<br />
Avec un Cx de 0.7, j'arrive à une hauteur (dans le cas d'un tir purement vertical) de 25.40m.<br />
Avec un Cx de 0.5, h = 31.5m.<br />
Avec un Cx de 1, h = 20m.<br />
<br />
Ca me semble assez optimiste. il va falloir passer aux TP ...<br />
<br />
<img src="http://www.larmandier.com/commun/images/vins_grand-cramant_c.jpg" style="border: 1px solid;" alt="larmandier" />
<br />
<em>(Billet garanti sans chaptalisation, écrit avec le soutien -involontaire-de la maison <a href="http://www.larmandier.com/index.php?lang=fr" hreflang="fr">Larmandier-Bernier</a>)</em><br />
<br />
<br />
<br />
<strong>Billets connexes</strong> : <br />
<br />
- <a href="http://eric.cabrol.free.fr/dotclear/index.php/2009/01/06/790-vitesse-d-un-bouchon-de-champagne-2" hreflang="fr">vitesse d'un bouchon de champagne, la suite</a> </p>Optimisation de trajectoire (2)urn:md5:a2c9e53a27d5ac4605bef7e6eafa7c4a2006-05-30T11:14:00+00:002015-11-20T13:05:37+00:00Eric CabrolIntelloMatlaboptimisationscience amusantetrajectoire <p>Victoire ! Un premier jet bien simplifié qui semble fonctionner, sous Matlab.<br />
<br />
<img src="http://eric.cabrol.free.fr/dotclear/images/tech/v_ini_15.gif" alt="trajectoire sur cercle" /><br />
<br />
En bleu le vibreur intérieur, en vert la ligne "médiane" de la piste, en rouge la trajectoire calculée ...<br />
Il a fallu commencer par du simple, d'où le choix d'un quart de cercle. <br />
Principe :</p>
<ul>
<li>discrétisation du tracé </li>
<li>choix des variables du problème d'optimisation : coordonnée orthoradiale (par rapport à la ligne médiane) et norme de la vitesse en chaque point</li>
<li>minimisation sous contraintes de la fonction objectif : temps pour parcourir le tracé = somme des temps nécessaires au parcours de chacun des segments = somme des d<span style="font-size:0.7em">i</span>/v<span style="font-size:0.7em">i</span>, où d<span style="font-size:0.7em">i</span> est la longueur du i-ème segment, et v<span style="font-size:0.7em">i</span> la vitesse sur ce même segment</li>
</ul>
<p>
Formulation des contraintes : </p>
<ul>
<li>la distance entre le point courant et la ligne médiane doit être inférieure à la demi-largeur de la piste</li>
<li>l'accélération latérale v^2/r, où r est le rayon de courbure instantané, doit être inférieure à une borne supérieure a_max</li>
<li>la variation de vitesse entre deux points successifs est limitée par la puissance P du moteur. On peut montrer que v<span style="font-size:0.7em">i+1</span>^2-v<span style="font-size:0.7em">i</span>^2 < 2.P.d<span style="font-size:0.7em">i</span>/(m.v<span style="font-size:0.7em">i</span>), où m est la masse du véhicule. La puissance disponible est une fonction du régime, donc, sur un rapport donné (oui, je sais ...), de la vitesse.</li>
<li>contraintes initiales : position et vitesse (sans spécification de direction ... pour l'instant ?)</li>
</ul>
<p>
Paramètres : </p>
<ul>
<li>rayon du cercle médian (30 m)</li>
<li>accélération latérale maximale a_max (10 m/s^-2)</li>
<li>"démultiplication"(vitesse = 15 m/s au régime de 4500 tr/min)</li>
<li>largeur de la piste (10m)</li>
<li>position et vitesse initiales</li>
<li>courbe régime-puissance</li>
</ul>
<p>
Fonctions nécessaires :</p>
<ul>
<li>calcul du rayon de courbure d'un cercle inscrit en trois points pour la détermination de l'accélération latérale</li>
<li>création d'une fonction puissance=f(vitesse) : on part de la donnée de paires [régime;puissance], puis on approxime par des splines.</li>
</ul>
<p>
Outils : </p>
<ul>
<li>Matlab, et notamment <a href="http://www.mathworks.com/access/helpdesk/help/toolbox/optim/ug/fmincon.html" hreflang="en">fmincon</a></li>
</ul>
<p><br />
<strong>A faire :</strong></p>
<ul>
<li>connection de bouts de tracé : ligne droite - arc de cercle pour intégrer la notion de freinage dans les contraintes (décélération limite ...), puis arc de cercle - ligne droite - arc de cercle "opposé" pour voir si c'est capable de gérer les changements de courbure de la trajectoire. A terme l'idée est évidemment de parvenir à optimiser la trajectoire sur un tour complet, ce qui permet de s'affranchir de la spécification d'une direction initiale. Enfin, plus ou moins ...</li>
<li>intégration d'un modèle de comportement dynamique plus élaboré (...)</li>
<li>gérer les discontinuités dues aux changements de vitesse <em>(houla</em> ...). Parce que bon, faire un tour complet sur le même rapport c'est surement très rigolo, mais moyennement efficace. Le problème c'est que je n'ai pour l'instant aucune idée de la manière d'en tenir compte ... Et je me demande même si un changement de stratégie complet (genre en passant à un réseau de neurones) ne serait pas le plus indiqué. Time will tell.</li>
</ul>Stratégie de programmation d'ascenseururn:md5:74cbc70bb3607fbe18fa0e2c24b851502006-04-26T18:27:00+00:002015-11-20T12:45:42+00:00Eric CabrolIntelloascenseurMatlabscience amusantesimulation<p>Quand un bout de code me conforte dans mes intuitions ...</p>
<p>J'avais <a href="http://eric.cabrol.free.fr/dotclear/index.php/2006/02/23/107-programmation-d-ascenseurs-et-economies-d-energie" hreflang="fr">déjà écrit</a> que je ne comprenais pas la stratégie employée par les ascenseurs de mon immeuble, qui se replacent systématiquement (au bout d'un certain temps) aux "extrémités" de la plage d'étages qu'ils sont censés couvrir. Ca ne me semblait pas permettre de minimiser les temps d'attente, et encore moins de minimiser les déplacements et donc la consommation d'énergie.</p> <p>Or donc voilà, Matlab me prouve que j'avais raison. C'est codé comme un cochon, c'est simplifié avec un seul ascenseur, mais ça semble marcher comme je le souhaite, et les tendances sont là : lorsque le temps de latence est faible (c'est-à-dire lorsque l'ascenseur revient souvent vers sa position par défaut) "ma" stratégie permet un gain de temps d'attente moyen de l'ordre de 10%, et une réduction de près de 15% des déplacements effectués par l'ascenseur.<br />
<br />
<a href="http://eric.cabrol.free.fr/dotclear/images/tech/ascenseur_sensi_latence.gif">Résultats obtenus en faisant varier le temps de latence, pour une position par défaut au 17è étage.</a><br />
<a href="http://eric.cabrol.free.fr/dotclear/images/tech/ascenseur_influence_pos_def.gif">Résultats obtenus en faisant varier le temps de latence, pour une position par défaut au 8è étage.</a>
</p>
<p>Voici le code :</p>
<pre>nb_et = 17; % nb d'etages
nb_hab_et = 10; % nb d'habitants par étage
latence = 120; % temps de latence avant raz
sec_et = 3; % vitesse ascenseur : nb de secondes par etage
tps_ouvr = 8; % temps de transfert (ouverture - entree - fermeture)
%
pos_def = 8; % position par défaut de l'ascenseur
%
%
for n=1:50
%
% Génération des temps aléatoires
%
temps=sort(abs(floor(randn(nb_hab_et,nb_et)*3600+7200)));
k=0;
raz=0; % compteur raz
pos=pos_def; % initialisation à la position par défaut
cumul_dep=0; % compteur déplacements
tmp=0; % var temporaire
missed=0; % booléen
hab = nb_hab_et*ones(nb_et,1); % vecteur compteur d'habitants par étage
attente = zeros(nb_et*nb_hab_et,1); % initialisation vecteur attente par habitant
%
while max(hab)>0 % Tant qu'il reste du monde
t=min(min(temps)); % t prochain appel
if t==99999
break
end
if (t-tmp)>latence
cumul_dep=cumul_dep+abs(pos-pos_def);
pos=pos_def;
raz=raz+1;
end
[i,j]=find(temps==min(min(temps))); % déterminer etage correspondant
if length(j)>1 % Si deux min identiques ...
[a,b]=max(j); % on prend l'étage le plus haut
i=i(b);
j=j(b);
end
cumul_dep=cumul_dep+abs(pos-j); % compte déplacements
if missed==0
k=k+1;
else
missed=0;
end
attente(k)=attente(k)+abs(pos-j)*sec_et; % calcul tps attente pour hab k
tmp=t+attente(k)+tps_ouvr; % temps dép + ouv portes
hab(j)=hab(j)-1; % decremente le nb d'hab à l'étage j
temps(i,j)=99999; % "supprime" ce t du tableau
pos=j; % ascenseur chargé
%
t=min(min(temps)); % recherche prochain appel
[i,j]=find(temps==min(min(temps))); % etage ...
if length(j)>1
[a,b]=max(j);
i=i(b);
j=j(b);
end
% Si l'ascenseur n'est pas encore passé
if j < pos & t > tmp & t < tmp+(pos-j)*sec_et
k=k+1;
attente(k)=attente(k)+tmp+(pos-j)*sec_et-t;
tmp=t+tps_ouvr;
hab(j)=hab(j)-1;
temps(i,j)=99999;
end
% Si l'ascenseur est déjà passé mais encore en mouvement
if j < pos & t > tmp+(pos-j)*sec_et & t < tmp+pos*sec_et
k=k+1; % L'attente de l'hab k est augmentée du
attente(k)=attente(k)+tmp+pos*sec_et+tps_ouvr-t;% temps correspondant à la descente
missed=1;
end
% On descend
cumul_dep=cumul_dep+pos;
pos=0;
tmp=tmp+pos*sec_et+tps_ouvr;
end
attente_moy(n)=mean(attente);
deplacement_total(n)=cumul_dep;
end
disp(sprintf('Attente moyenne = %4.2f',mean(attente_moy)));
disp(std(attente_moy));
disp(sprintf('Moyenne du cumul des déplacements = %4.2f',mean(deplacement_total)));
disp(std(deplacement_total));
</pre>