
giovedì 9 dicembre 2010
Approssimare Funzione
In inglese si dice "To Fit", gli italiani, che non hanno di meglio da fare, lo chiamano "Fittare" che assomiglia più ad una pratica masochista che ad un algoritmo matematico. In pratica si tratta di APPROSSIMARE una serie di punti con una funzione che meglio si adegua ai punti stessi. Ci sono vari algoritmi che approssimano funzioni a punti, dipende dalle funzioni e dai punti ovviamente. In generale se penso che i miei punti siano ben rappresentati da una legge di potenza uso una Approssimazione Polimomiale, se sono difronte ad un fenomeno periodico uso le serie di Fourier, se ho una distribuzione normale di punti Gauss...e basta così perché queste sono quelle che vanno per la maggiore. Non intendo descrivere la matematica che sta dietro gli algoritmi e neanche gli algoritmi perché non ho tempo e le trovate spiegate in rete ovunque a partire da Wikipedia, ma, nei miei deliri con Matlab, un giorno mi sono messo in testa di creare uno script che fa questo lavoro, ossia uno script che approssima una serie di punti con una funzione e che dà, nel caso dell'approssimazione polinomiale i coefficienti c0, c1,...,cn, nel caso dell'approssimazione in serie di Fourier coefficenti an e bn. In input lo script richiede il file dati che può essere un semplice file di testo con due colonne di dati la prima con la "x" e la seconda con la "y". Allego il file compilato e lo script completo...Buon divetimento...

mercoledì 7 luglio 2010
Collimato o divergente??
La settimana scorsa il capo, spiegandomi il funzionamento di un coronografo mi disse: "Questo deve essere un fascio collimato con la divergenza del sole...". La cosa mi ha buttato in confusione in quato per me collimato e divergente è come destra e sinistra, alto e basso ecc...
Un fascio collimato è un fascio di radiazione i cui raggi sono paralleli tra di loro ad esempio un laser è collimato anche se ha una divergenza intrinseca che fa sì che lo spot ad una certa distanza si "apra". Un fascio collimato lo si può ottenere da un fascio non collimato con un sistema ottico detto collimatore. Il più ovvio è quello in figura
Metto l'oggetto sul fuoco di una lente e questa proietta i raggi a infinito. Prima della lente il fascio è divergente, dopo la lente il fascio è collimato.
Ora questo è un semplice sistema ottico che porta a infinito un oggetto puntiforme, ma il sole è tutt'altro che pintiforme...allora provo a simulare una sorgente estesa (senza curarmi di usare angoli e dimensioni tipici del sole):
Cosa ho fatto? Ho semplicemente crato vari punti luce su una sui bordi un disco. Ora, dopo la lente c'è un fascio che sembra divergente ma in realtà ogni punto del fascio è perfettamente collimato come si vede dalla figura sotto dove traccio un solo punto del bordo...forse era questo che intendeva il prof!
E' chiaro che se porto ad infinito una sorgente estesa, porto ad infinito le sue dimensioni. Queste dimensioni sono viste dal collimatore con un angolo che è la divergenza dell'oggetto. Ad esempio se guardo una cosa da vicino mi sembra più grande che se la guardo da lontano (una banalità) e quindi l'angolo che sottende l'oggetto e ha vertice nel mio occhio è più grande se l'oggetto è vicino. Nel nostro caso si tratta dell'angolo ACB che ha vertice in C.
Ora come posso fare se voglio portare a infinito un oggetto esteso che sottenda un angolo pari alle dimensioni angolari del sole? Questa cosa potrebbe essermi utile nel caso dovessi progettare un simulatore di sole...
Le dimensioni angolari del sole a terra ossia 1 AU sono W=33'. Mettiamo che io volgia usare il collimatore che ho usato nel precedente esempio che ha una focale f=50 mm. Ora considerando il triangolo ACB sapendo che l'angolo in C è W e che l'altezza del triangolo (distanza tra C e il centro del segmento AB) è f, mi viene naturale dire che le dimensioni d della sorgente dovranno essere:
d= f * tan(W)
Un fascio collimato è un fascio di radiazione i cui raggi sono paralleli tra di loro ad esempio un laser è collimato anche se ha una divergenza intrinseca che fa sì che lo spot ad una certa distanza si "apra". Un fascio collimato lo si può ottenere da un fascio non collimato con un sistema ottico detto collimatore. Il più ovvio è quello in figura
Ora questo è un semplice sistema ottico che porta a infinito un oggetto puntiforme, ma il sole è tutt'altro che pintiforme...allora provo a simulare una sorgente estesa (senza curarmi di usare angoli e dimensioni tipici del sole):
E' chiaro che se porto ad infinito una sorgente estesa, porto ad infinito le sue dimensioni. Queste dimensioni sono viste dal collimatore con un angolo che è la divergenza dell'oggetto. Ad esempio se guardo una cosa da vicino mi sembra più grande che se la guardo da lontano (una banalità) e quindi l'angolo che sottende l'oggetto e ha vertice nel mio occhio è più grande se l'oggetto è vicino. Nel nostro caso si tratta dell'angolo ACB che ha vertice in C.
Le dimensioni angolari del sole a terra ossia 1 AU sono W=33'. Mettiamo che io volgia usare il collimatore che ho usato nel precedente esempio che ha una focale f=50 mm. Ora considerando il triangolo ACB sapendo che l'angolo in C è W e che l'altezza del triangolo (distanza tra C e il centro del segmento AB) è f, mi viene naturale dire che le dimensioni d della sorgente dovranno essere:
d= f * tan(W)
d = 0,48 mm ossia per simulare il sole in quel sistema ottico dovrei avere una sorgente estesa con un dimetro di circa mezzo millimetro!


Come si vede nelle figure ho dovuto ingrandire immagine e oggetto per poter vedere l'effetto degli esempi precedenti. Ora quindi cosa ho imparato: se voglio simulare una sogente estesa a dimensione fissa (come il sole) mi conviene allungare la focale se voglio utilizzare oggetti più grandi, ad esempio con una lente di focale 2000 mm avrei una sorgente di quasi due centimetri che è più agevole da fabbricare e installare.
Veniamo al piano immagine. Ora facciamo che dopo avere creato il sole artificiale lo voglio analizzare con un coronografo. Il coronografo fa una eclissi totale di sole è sostanzialmente un tescopio con un tappo davanti che blocca la luce del sole e mi permette di vedere la corona ossia la parte esterna del sole.
Per simulare una situazione reale devo fare in modo che l'apertura frontale del coronografo sia illiminata uniformemente da tutto il bordo del collimatore.
Fisso la pipilla di entrata ad esempio P=100 mm fisso anche la distanza a cui pongo il coronografo ad esempio L=5000 mm, le dimensioni della sorgente (il sole) sono 19.2 mm, qual è la variabile a questo punto?? Penso le dimensioni del collimatore, vediamo
il sistema è quello qua sopra, per il momento traccio i raggi da un punto del bordo del "sole", vedo la "footprint"(quello che vedrei su uno schermo posto nel piano immagine) di zemax qua sotto,

il cechio nero è il bordo della apertura di entrata del coronografo, il disco blu l'immagine dei raggi che partono da un punto sul bordo del "sole", vedo che nella pate alta l'aertura di ingresso non è illuminata, non mi intresso del fatto che nella parte inferiore i raggi siano fuori. Il secondo disegno fa vedere di profilo quello che succede ossia il raggio più esterno del punto sul bordo (quello più in alto dei 3) cade dentro l'apertura. Il punto e che io voglio che cada sul bordo dell'apertura e per fare questo devo allargare il fascio (l'inclinazione è legata alle dimensioni del sole e alla distanza che sono fissati), per allargare il fascio devo allrgare il diametro del collimatore! Ma di quanto? Riprendo il caso precedente con dimensioni non proporzionate ma chiare:
Si vede che lo schermo non è illuminato di una quantità AB. Ora per portare B su A ed avere una illuminazione uniforme devo ingrandire il diametro del colimatore di 2AB che si vede è
Veniamo al piano immagine. Ora facciamo che dopo avere creato il sole artificiale lo voglio analizzare con un coronografo. Il coronografo fa una eclissi totale di sole è sostanzialmente un tescopio con un tappo davanti che blocca la luce del sole e mi permette di vedere la corona ossia la parte esterna del sole.
Per simulare una situazione reale devo fare in modo che l'apertura frontale del coronografo sia illiminata uniformemente da tutto il bordo del collimatore.
Fisso la pipilla di entrata ad esempio P=100 mm fisso anche la distanza a cui pongo il coronografo ad esempio L=5000 mm, le dimensioni della sorgente (il sole) sono 19.2 mm, qual è la variabile a questo punto?? Penso le dimensioni del collimatore, vediamo
AB = L*tan(W/2)
Con L = CA distanza tra il collimatore e l'apertura. Ora si vede che il disco verde riempie tutto il cerchio che rappresenta il bordo dell'apertura. Se ripeto questo ragionamento per tutti i punti del bordo del "sole" avrò tutta l'apertura illuminata dal "sole" come succede nella realtà col sole vero!!!!

Etichette:
coronografo,
Divergenza,
simulatore sole,
sole,
Zemax
martedì 18 maggio 2010
GUI con Matlab
Ultimamente mi trastullo a creare GUI con Matlab. La GUI (Graphical User Interface) serve per creare l'interfaccia grafica di un programmino e poi renderlo un eseguibile "stand alone" ossia un programmino che si può usare liberamente, al di fuori dell'ambiente in cui è stato creato.
Ci sono dei passi da fare:
1) Disegno l'interfaccia grafica
digitare il comando
>> guide
così facendo si lancia un programma grafico nel quale si aggiungono bottoni, grafici, menù a tendina ecc... e si crea insomma in "real time" l'interfaccia grafica per l'utente.

Questo programmino si usa in maniera intuitiva scegliendo sul menù di sinistra gli elementi da introdurre e disegnandoli quindi sul pannello.
Quello che sto facendo è un programmino che seleziona una funzione, ne fa il grafico e inoltre disegna l'argomento dell'integrale di Fourier di quella funzione con la frequenza desiderata.
2) Do un nome ad ogni elemento
Una volta disegnata l'interfaccia bisogna dare dei nomi"tag" agli elementi e degli argomenti.
La finestra "inspector" serve a dare un nome alle cose ed anche ad abbellirle, per esempio si possono selezionare il font, il colore, la dimensione del testo ecc... Noi ci concentriamo sulle righe:
le funzioni le trovate clikkando sul fasto f(x) dell'editor. Per fare partire il vostro programma dovete copiare lo script che genera il grafico nella funzione callback relativa al tasto che fa partire tutto. Ad esempio nel mio script, dopo avere selezionato la funzione e la frequenza si schiaccia il tasto go! quindi ho scritto la parte di codice che fa i calcoli nella funzione go_pushbutton_callback
Ci sono dei passi da fare:
1) Disegno l'interfaccia grafica
digitare il comando
>> guide
così facendo si lancia un programma grafico nel quale si aggiungono bottoni, grafici, menù a tendina ecc... e si crea insomma in "real time" l'interfaccia grafica per l'utente.
Questo programmino si usa in maniera intuitiva scegliendo sul menù di sinistra gli elementi da introdurre e disegnandoli quindi sul pannello.
Quello che sto facendo è un programmino che seleziona una funzione, ne fa il grafico e inoltre disegna l'argomento dell'integrale di Fourier di quella funzione con la frequenza desiderata.
2) Do un nome ad ogni elemento
Una volta disegnata l'interfaccia bisogna dare dei nomi"tag" agli elementi e degli argomenti.
Per fare ciò si usa fa un doppio click sull'elemento. Ad esempio introduco un elemento, faccio doppio click e mi appare la finestra qui sotto
"tag" è il nome dell'oggetto che dopo verrà richiamato dallo script principale ad esempio, la casella di testo per inserire la frequenza l'ho chiamata "freq" e avanti così
"String" serve a definire il contenuto in testo scritto dell'oggetto, ad esempio nel menù a tendina ho aggiunto il nome delle funzioni
3) creo lo script
Ora basta salvare il disegno che verrà salvato come un file .fig. Nel fare questa operazione il Matlab costruisce e ci mostra lo script direttamente sull'editor.
ORA COSA DOBBIAMO FARE??
Semplice, scrivere il programmino che vogliamo.
MA DOVE?
nella funzione "Callback" del tasto Go! infatto, per ogni elemento
Fatto questo lanciate lo script e guardate se funziona.
Se volete giocare con lo script e il file fig, scaricateli, metteteli nella directory c:/documenti/MATLAB o dove volete e buon divertimento, mi raccomando sono entrambi necessari per potere lanciare lo script, inoltre, cosa carina, quando modificate il .fig che ne so per aggiungere un bottone, lo script nell'editor si aggiorna in automatico senza danneggiare o perdere le righe che avete aggiunto voi.
Alla fine di tutto potete compilare lo script e renderlo un programma a se stante staccato da Matlab, la procedura è la seguente:
1) esportare dal programma "guida" il file. Verrà salvato con il nome: nomefile_export.m
2) dalla workspace digitare
>>mbuild -setup
3) rispondere y alla prima dom
anda

4) selezionare uno dei compilatori proposti con il numero il primo da me va bene
4) rispondere y alla seconda domanda. Se tutto va bene e il programma risponde done... scrivere
5) >>mcc -m nomefile_export.m -o nomeeseguibile
aspettare un po' e nella stessa cartella dove avete salvato il file troverete l'eseguibile.
Bon ora sono sicuro che non me lo dimenticherò più comunque in questo sito trovate tutto:
Etichette:
eseguibile,
fourier,
grafica,
GUI,
Matlab
Iscriviti a:
Post (Atom)