Archivio per giugno, 2013

Flood – Un gioco realizzato in MATLAB

secchioProgrammare è un’attività davvero molto stimolante. È un po’ come risolvere i cruciverba o i giochi di logica della Settimana Enigmistica, solo che hai molta più libertà e hai a disposizione strumenti talmente potenti da avere solo la fantasia come unica limitazione.

Non si può dire di saper  usare un computer, se non si conosce un linguaggio di programmazione!

È proprio da questi presupposti (abbinati all’esaurimento-esami) che nasce questo semplice giochino, realizzato con MATLAB, Flood.
L’idea non è mia, ma non credo si possa parlare di un vero e proprio ideatore di questo gioco… È un po’  come giocare con il Paint!

paint

Il gioco è molto semplice: bisogna riempire l’intera finestra di gioco con uno stesso simbolo, nel minor numero di mosse possibile, partendo dall’angolo in alto a sinistra. I simboli simili si contagiano orizzontalmente e verticalmente. È possibile modificare i simboli presenti nel gioco e il livello di difficoltà.
Una matrice generata casualmente, color, contiene i numeri a cui sono associati i simboli, e un vettore di nome path contiene tutti gli elementi che sono stati “riempiti”.

Il gioco non ha un’interfaccia grafica, per il semplice motivo che l’ho realizzato sul tablet con Octave, che ha un po’ di problemi con gli oggetti figure. Sarebbe carino realizzarne una versione grafica utilizzando una matrice di colori, ma è un gioco talmente stupido che non credo ne valga la pena! Ad ogni modo sarebbe sufficiente utilizzare la funzione imagesc applicata alla matrice color, con un’opportuna colormap.
Probabilmente è stato più divertente realizzarlo che giocarci successivamente 🙂

Download – flood.zip (pochi kB)

flood

Download – flood.zip (pochi kB)


Campo magnetico (e velocità indotta da un vortice) lungo una curva generica con MATLAB

Premessa: la lettura di questo articolo potrebbe risultare molto confusa. È talmente specifico che, molto probabilmente, servirà a una persona su un milione. In realtà servirà molto più a me per fissare certe cose che a qualcun altro…

L’induzione magnetica (e la velocità indotta da un vortice, in aerodinamica) è descritta dalla legge di Biot-Savart:

\Gamma =\frac{k}{4\pi}\oint_{C} \frac{dL\times R}{|R^3|}

Dove k è una costante moltiplicativa proporzionale all’intensità (della corrente o del vortice). Per questa legge esistono diverse soluzioni analitiche, per i casi più semplici e anche più frequenti: filo rettilineo di lunghezza infinita, solenoide, …

Potrebbe essere interessante osservare il campo magnetico anche per un filo di una forma più strana, come una spirale a passo non costante, o una forma geometrica complessa. Soluzioni analitiche per forme geometriche complesse non ne esistono ed è necessario integrare numericamente la legge di Biot-Savart.
Concettualmente è molto semplice: divido il filo in piccoli intervalli finiti di lunghezza \Delta L, per ognuno dei quali calcolo l’induzione \Delta \Gamma e infine ne faccio una sommatoria:

\Delta\Gamma=\frac{k}{4\pi}\frac{\Delta L\times R}{|R^3|}
\Gamma = \sum_i \Delta\Gamma_i

Ecco cosa fa il codice che ho scritto: si assegna un dominio di calcolo (non troppo grande, altrimenti ci impiega un’eternità!) e si fa un ciclo per ogni punto del dominio (tre cicli for su i, jk). Per ognuno di questi punti, si discretizza la curva in intervalli di ampiezza ds e si calcola l’induzione di ogni elementino sul punto del dominio in questione, sommando i vari contributi (componenti UV, W).

campo

Non è il massimo dal punto di vista dalle performance, è stata la prima cosa che mi è venuta in mente e non ho neanche pensato se fosse la migliore. Funziona e basta 😀

Un unico appunto lo vorrei fare sull’utilizzo delle meshgrid e del prodotto vettoriale. Il campo magnetico (campo di moto) è descritto da una serie di vettori tridimensionali. Questi vettori dipendono dal punto di applicazione, o meglio, ogni punto del campo ha un suo vettore di induzione, che ne descrive direzione, intensità e verso. In MATLAB, ogni cosa è una matrice e non fanno eccezione i campi vettoriali. Il problema è questo: ogni vettore ha tre componenti, ognuna delle quali è contenuta in una matrice NxNxN. Ho bisogno di tre matrici NxNxN per descrivere il campo vettoriale. Come faccio però a capire in quali punti sono applicati questi vettori?
Qui interviene la funzione meshgrid, che genera una matrice contenente le coordinate dei punti in cui voglio che siano applicati i vettori. Quindi avrò: tre matrici U, V e W contenenti le componenti lungo gli assi xyz dell’induzione e tre matrici XY e Z contenenti i punti di applicazione dei vettori. Quando si fa il calcolo del \Delta\Gamma di Biot-Savart bisogna tenere presente quanto detto: per il calcolo del vettore R dovrò considerare le matrici XYZ, dato che mi interessa il punto di applicazione del vettore.

Forse era una precisazione banale. Forse no.

Considerazioni aerodinamiche

Il codice permette di integrare la legge di Biot-Savart, che è nota nella fisica per l’induzione di un campo magnetico. In aerodinamica viene invece utilizzata per calcolare la velocità indotta da un vortice. È interessante andare a calcolare il campo di moto nella scia di un’ala utilizzando questo codice.

La Teoria del Filetto Portante di Prandtl ci spiega come sia possibile modellare il campo di moto attorno ad un’ala mediante un sistema di vortici. La schematizzazione più semplice di questo sistema di vortici è il cosiddetto vortice a staffa, di cui rubo senza pietà un’immagine da Google:

vortice_staffa

Inserendo nel codice i punti di un vortice a staffa:

L = [-1 6 0;
     -1 0 0;
      1 0 0;
      1 6 0];

Si ottiene un campo di moto di questo tipo:

linee_campo

Non è molto preciso perché è stato calcolato su un dominio di 20 punti, ma rende comunque l’idea.
Se a questo campo di moto sommiamo una corrente uniforme, otteniamo il campo di moto attorno a un’ala:

vortici1

trittico

Il confronto con un’immagine ottenuta per via sperimentale (linee di fumo) mostra la validità di questa teoria:

vortici_ala

Download dell’animazione in 3D (.avi, 4.9 MB)

Un’altra figura interessante che è possibile ottenere è quella relativa al downwash:

downwash

L’immagine è stata ottenuta utilizzando la funzione surf alla componente verticale della velocità.

Da questa figura si possono notare due cose: la prima è che il vortice parallelo all’ala (vortice aderente) produce un upwash sulla corrente incidente, la seconda è che il downwash è dovuto essenzialmente all’effetto dei vortici laterali (vortici liberi).

Tutte le figure delle linee di corrente sono state ottenute utilizzando la funzione streamtube, che prende in input le mesh, il campo di moto e tre vettori/matrici contenenti i punti da cui devono partire le linee di corrente.

Potete scaricare il codice dal seguente link, o dal file exchange di MATLAB.

Download biot_savart.zip
Download da MATLAB file exchange


Creare un video time-lapse con MATLAB

Stavo facendo una simulazione in CFD e volevo ottenere un video a partire da un migliaio di immagini. In giro ci sono decine di software per farlo, ma a prima vista non ho trovato nulla di estremamente rapido, gratuito e che non richiedesse installazione. Allora ho pensato: “Io ho MATLAB!“. Bene, perché non usarlo per questo scopo? Detto fatto. Dopo un’oretta di codice per capire come utilizzare la classe VideoWriter mi è uscito questo simpatico codice che permette di:

  1. Selezionare le immagini (in qualsiasi formato)
  2. Selezionare un file di output .avi
  3. Impostare il framerate, la qualità (JPEG) e un fattore di scala per ridimensionare le immagini
  4. Esportare il video

Il tutto con una simpatica interfaccia grafica 😀

*** Download time-lapse.zip ***

screenshot

Ho scritto il codice in inglese per poterlo caricare sul file exchange di MATLAB.

*** Download time-lapse.zip ***

Giusto per curiosità, ecco il video che ho ottenuto con lo script: http://www.youtube.com/watch?v=xYUQxIDwDOQ