Uso Di Scilab

download Uso Di Scilab

of 67

Transcript of Uso Di Scilab

  • 7/26/2019 Uso Di Scilab

    1/67

    1

    Sergio Frasca

    Uso di

    per il Laboratorio di Meccanica

    Versione 14/06/2013

  • 7/26/2019 Uso Di Scilab

    2/67

    2

    SommarioIntroduzione ..................................................................................................................................................................... 4

    Istallazione ........................................................................................................................................................................ 5

    Comandi di base .............................................................................................................................................................. 7Creazione e assegnazione di variabili ............................................................................................................... 9

    Operazioni sulle variabili .................................................................................................................................... 10

    Istruzioni di controllo ........................................................................................................................................... 12

    Grafica .......................................................................................................................................................................... 13

    Gestione input/output .......................................................................................................................................... 15

    Script ............................................................................................................................................................................ 16

    Funzioni e librerie .................................................................................................................................................. 17

    Altre .............................................................................................................................................................................. 18

    Operazioni con Excel (o fogli elettronici). ............................................................................................... 18

    File di startup ....................................................................................................................................................... 19

    Applicazioni per il Laboratorio di Meccanica .................................................................................................. 20

    Simulazione di dati ................................................................................................................................................. 20

    Lancio di dadi (o monete) .............................................................................................................................. 20

    Estrazione di un campione da una distribuzione................................................................................. 21

    Simulazione di misure con errori ............................................................................................................... 22

    Montecarlo per la valutazione dellincertezza in modo semplificato .......................................... 24

    Lettura di dati da file ............................................................................................................................................. 27

    Fit ................................................................................................................................................................................... 31

    Derivata col fit .......................................................................................................................................................... 37

    Elaborazione di dati: lo smoothing ................................................................................................................. 39

    Analisi statistica dei dati ...................................................................................................................................... 40

    Istogramma .......................................................................................................................................................... 40

    Percentili ................................................................................................................................................................ 42

    Coefficiente di correlazione e scatter-plot .............................................................................................. 43

    Test del chi quadro ............................................................................................................................................ 45

    Valutazione dellincertezza col metodo di Montecarlo .......................................................................... 46

    Function di servizio ............................................................................................................................................... 51

    Esperienze.................................................................................................................................................................. 52

    Molla ........................................................................................................................................................................ 52

  • 7/26/2019 Uso Di Scilab

    3/67

    3

    Fluidi ........................................................................................................................................................................ 54

    Pendolo fisico....................................................................................................................................................... 55

    Volano ..................................................................................................................................................................... 55

    Uso avanzato .................................................................................................................................................................. 56

    Alcuni comandi ........................................................................................................................................................ 56

    Ancora sulle funzioni ............................................................................................................................................. 57

    Funzioni con argomenti variabili ................................................................................................................ 57

    Funzioni definite dinamicamente ............................................................................................................... 58

    Efficienza ............................................................................................................................................................... 58

    GUI ................................................................................................................................................................................. 60

    Strutture, list, mlist, cell array, etc................................................................................................................... 62

    Appendici ........................................................................................................................................................................ 64

    Consigli pratici ......................................................................................................................................................... 64

    Differenze con Matlab ........................................................................................................................................... 65

    Esercizi ........................................................................................................................................................................ 66

    Altri utili documenti .............................................................................................................................................. 67

  • 7/26/2019 Uso Di Scilab

    4/67

    4

    Introduzione

    Scilab un pacchetto di programmi gratuiti per il calcolo numerico sviluppati dallo INRIA e

    dallo ENPC in Francia, e poi da Scilab Consortium in seno alla Fondazione Digiteo. Oggi Scilab sviluppato da Scilab Enterprises.

    Scilab stato ampiamente impiegato in alcuni progetti industriali e di ricerca, e molticontributi sono stati fatti dagli utenti. Il linguaggio di programmazione, di alto livello (adifferenza del C), interpretato. La sintassi simile a quella di MATLAB ma i due programmi, iloro applicativi ed i plug-in non sono completamente compatibili, anche se esiste unconvertitore nel pacchetto di Scilab, che opera, con qualche problema, le conversioni Matlab Scilab.

    Scilab include anche un pacchetto chiamato Xcos, per la simulazione e la costruzione dimodelli di sistemi dinamici, includendo sia sotto-sistemi continui che discreti.

    Altri pacchetti applicativi esterni, gli ATOMS, possono essere installati.

    Scilab disponibile gratuitamente per vari sistemi operativi, tra cui Windows, Mac OS X eLinux e pu scaricarsi gratuitamente dal sitohttp://www.scilab.org/.

    MATLAB, a cui si ispira Scilab, un ambiente per il calcolo numerico e l'analisi statistica checomprende anche l'omonimo linguaggio di programmazione creato dalla MathWorks.MATLAB consente di manipolare matrici, visualizzare funzioni e dati, implementare algoritmi,creare interfacce utente, e interfacciarsi con altri programmi. Nonostante sia specializzato nelcalcolo numerico, un toolbox opzionale interfaccia MATLAB con il motore di calcolo simbolicodi Maple. MATLAB usato da milioni di persone nell'industria e nelle universit per via deisuoi numerosi tool a supporto dei pi disparati campi di studio applicati e funziona su diversisistemi operativi, tra cui Windows, Mac OS, GNU/Linux e Unix. Vedihttp://www.mathworks.it/.

    In questa guida si suppone che lo studente abbia una conoscenza elementare dellaprogrammazione (come acquisita, per esempio, nel corso di Laboratorio di calcolo).

    Queste brevi note hanno lunico scopo di fornire rapidamente le nozioni di Scilab necessarieper il corso di Laboratorio di Meccanica. Se, come auspicabile, si volesse andare oltre nellaconoscenza di questo strumento di programmazione, si pu trovare in rete moltadocumentazione di guida e tutorial, come indicato nellultimo capitolo. In particolare perqualsiasi uso evoluto di Scilab fondamentale un testo come introscilab.pdf (lo si trovaconGoogle o nel sito di Scilab) o simili.

    http://www.scilab.org/http://www.scilab.org/http://www.scilab.org/http://www.mathworks.it/http://www.mathworks.it/http://www.mathworks.it/http://www.scilab.org/
  • 7/26/2019 Uso Di Scilab

    5/67

    5

    Istallazione

    Una volta scaricato il pacchetto relativo al proprio sistema operativo da

    http://www.scilab.org/, seguire le semplici istruzioni interattive.

  • 7/26/2019 Uso Di Scilab

    6/67

    6

    Sul sito sono presenti anche vari file di aiuto.

    Tra gli altri siti con risorse utili, vedihttp://www.openeering.com/.

    A corredo di questo corso, sono state scritte alcune funzioni e script che sono raccolte nel filePer_LM_Scilab.zip e descritte in questo manuale.

    Per un comodo utilizzo, una volta installato Scilab, lo spazio di lavoro1pu essere strutturatoopportunamente, con una cartella LM con le funzioni della raccolta di Per_LM_Scilab.zip. Vaquindi caricata la libreria (col comando lib) ed comodo creare un file di startupche vieneautomaticamente eseguito ogni volta che si fa partire Scilab.

    Per maggiori dettagli, vedere lAppendice Consigli pratici.

    1In Windows, tipicamente la cartella Documenti\Scilab.

    http://www.openeering.com/http://www.openeering.com/http://www.openeering.com/http://www.openeering.com/
  • 7/26/2019 Uso Di Scilab

    7/67

    7

    Comandi di base

    Aprendo Scilab appare un ambiente di lavoro (working environment) molto simile a quello

    di Matlab.

    Ambiente di lavoro di Scilab

    Questo, che pu essere configurato in vari modi, composto di varie sotto-finestre e cio:

    Il Terminale di Scilab, dove si danno i comandi

    LEsplorazione file che mostra la cartella in cui si sta lavorando

    Il Navigatore delle variabili che mostra le variabili in uso e permette di modificarle

    La Cronologia dei comandi che mostra gli ultimi comandi dati (anche in sessioniprecedenti)

    disponibile una breve presentazione (per la versione 5.4.0) su Youtube2inhttp://www.youtube.com/embed/_gkmDUmZSZI .

    I comandi sono eseguiti in genere riga per riga, come nei linguaggi interpretati. Il risultatoviene visualizzato immediatamente, a meno che il comando non venga terminato con unpunto e virgola ( ; ).

    2Su Youtube c un intero canale dedicato a Scilab; vedihttp://www.youtube.com/user/ScilabChannel

    http://www.youtube.com/user/ScilabChannelhttp://www.youtube.com/user/ScilabChannelhttp://www.youtube.com/user/ScilabChannelhttp://www.youtube.com/user/ScilabChannel
  • 7/26/2019 Uso Di Scilab

    8/67

    8

    Uno o pi comandi possono essere scritti in un file di testo, costituendo cos un programma(pi correttamente, uno script). A questo scopo comodo usare leditor di Scilab, chiamatoSciNotes; per aprirlo si pu usare il comando editoro lo si pu far partire dallicona della barra

    delle applicazioni, o anche dal menu Applicazioni. I file di script hanno normalmente

    estensione.sce

    . Con SciNotes si possono editare pi file contemporaneamente.I comandi di uno script vengono eseguiti col comando

    exec nomescript

    alternativamente possono essere messi in esecuzione direttamente dalleditor SciNotes, peresempio dal menu a discesa _Esegui e poi scegliendo Salva ed esegui.

    Ecco la finestra delleditor:

    ________________________________________

    Non qui riportata una descrizione dettagliata dei comandi (che pu trovarsi nellhelp o neimanuali). Si mostreranno alcuni esempi che si consiglia di ripetere sul proprio terminaleScilab.Gli esempi sono in file .sce, scaricabili dal sito del corso. Altri esempi di uso praticopossono ricavarsi nei programmi riportati nei prossimi capitoli.

  • 7/26/2019 Uso Di Scilab

    9/67

    9

    Creazione e assegnazione di variabili

    Le variabili hanno nomi che possono avere qualsiasi lunghezza, ma solo i primi 24 caratterisono considerati da Scilab; essi possono essere composti da lettere, maiuscole e minuscole,numeri e i simboli %, _, #, $, ! e ? , ma con la condizione che il primo carattere non sia unnumero. Una variabile pu contenere numeri reali, numeri complessi, numeri interi (a 8, 16 e32 bit) o stringhe di caratteri. Una variabile pu contenere insiemi di questi valori (array).

    Ecco alcuni esempi di variabili (file assegnazione.sce). A differenza del C le variabili sonocreate al momento dellassegnazione:

    a=34+12 // calcola 34+12 e assegna il valore a aB=3*2.43; // calcola l'espressione e l'assegna a Bc='ciao' // assegna la stringa di carattert ciao a cd=1:10 // crea l'array d con i valori da 1 a 10

    d2=1:0.1:10; // crea l'array d2 con i valori da 1 a 10 a passi di 0.1e=[1 3 5.2 7 2.34] // crea l'array e con i valori indicatie0=e+%i // crea l'array complesso sommando l'array e a ie1=e0' // crea l'array e1 come trasposto coniugato di ee2=e0.' // crea l'array e1 come trasposto di eb=ones(2,3) // crea la matrice b, composta di 1, di 2 righe e 3 colonnebb=testmatrix('magi',4) // crea una matrice "quadrato magico" di 4x4 elementi

    Note:

    %piindica pi greco, %eindica la base dei logaritmi naturali, %ilunit immaginaria; %te %Tindicano il valore booleano vero, %fe %Fil valore booleano falso, %inf o Inf infinito.

    Gli array (o vettori) sono matrici con una sola riga o una sola colonna.

    Gli elementi di un array o di una matrice sono indicati racchiusi tra parentesi quadre, separatida spazi o virgole; il punto e virgola separa le varie righe.

    ones(m,n) una funzione che crea una matrice di 1 di m righe ed n colonne. Analogamentezeros(m,n)crea una matrice di zeri.

    Se si scrive un comando senza assegnazione a una variabile (il nome della variabile e il segnodi uguale), viene creata di default la variabile ans.

  • 7/26/2019 Uso Di Scilab

    10/67

    10

    Operazioni sulle variabili

    Le operazioni sulle variabili sono sempre operazioni matriciali, quindi possono essere fatte sesono coerenti; per esempio la somma di due matrici pu farsi se le due matrici hanno lostesso numero di righe e colonne, il prodotto se il numero di colonne della prima pari alnumero di righe della seconda). Fa eccezione il caso in cui una delle matrici ha una sola riga euna sola colonna, cio una variabile semplice: in tal caso loperazione si intende fatta tra ilnumero e tutti gli elementi della matrice.

    Oltre alle operazioni +, -, *, /, ^, ci sono anche le .*, ./ e .^ che operano elemento per elemento.

    Operazioni pi complesse vengono realizzate tramite funzioni. Queste funzioni possono

    essere fornite direttamente dal sistema, come cos, sin, exp,, sia dallutente che le

    costruisce per i propri scopi. Esse possono in genere operare su matrici e produrre matrici(ma ovviamente anche su singoli numeri, che sono un caso particolare).

    Ecco uno script in cui sono eseguite alcune operazioni esemplificative (si consiglia vivamentedi mandarlo in esecuzione):

    // operazioni

    A=10B=1:4C=[1 0 2.5 -2]D=rand(2,4) // matrice con numeri a caso tra 0 e 1

    E=rand(4,4) // matrice casuale quadrata

    a=A+Bb=B+C

    // c=B*C // ERRORE ! operazione incoerentec1=B*C'c2=B.*C

    //d1=B/C' // ERRORE ! operazione incoerente//d2=B./C // ERRORE ! divisione per zerod3=B/C

    e1=B^A//e2=B^C // ERRORE !e3=B.^Ce4=A^B

    //f=1/0 // dovrebbe dare %inf che infinito, ma d erroref=%inff1=f+100f2=f/100f3=1/ff4=f/f2 // si ha NaN che significa "not a number"

    g1=D*D'g2=D'*Dg3=D*Eg4=g2.*Eg5=E^2

  • 7/26/2019 Uso Di Scilab

    11/67

    11

    g5=E^2.5

    x=0:0.1:5;y=cos(x*2*%pi);

  • 7/26/2019 Uso Di Scilab

    12/67

    12

    Istruzioni di controllo

    Le istruzioni di controllo di Scilab sono simili a quelle del C, ma con delle differenzesintattiche.

    Listruzione di controllo condizionale, come in C, ma con una sintassi un po diversa.

    if then

    else.

    end

    In Scilab I loop sono molto meno usati che in C. Ci poich operare direttamente su vettori e matrici molto pi veloce. Come in C, il loop tipico viene eseguito tramite il for, ma con una diversa sintessi:

    for i = 1 : n

    end

    Il select simile al switch del C

    select case

    case

    case

    else

    end

    Un loop in cui non sono noti a priori il numero di cicli, pu essere realizzato, similmente al C, con

    unistruzione while.

    while

    end

    Infine listruzione breakinterrompe un loop, mentre listruzione continueinterrompe il

    ciclo, passando al ciclo successivo (se c).Il returninterrompe una function. Listruzione

    pause interrompe lesecuzione dei comandi e d il controllo alla tastiera; molto utile in fasedi debugging.

  • 7/26/2019 Uso Di Scilab

    13/67

    13

    Grafica

    Il comando base per la grafica 2D plot(e la sua variante plot2d):

    // grafica2d

    x=0:0.01:4;y=exp(-(x));y1=cos(x*3*%pi);y2=sin(x*3*%pi);

    figure;plot(y);figure;plot(x,y)set(gca(),"grid",[1 1])title("spostamento in funzione del tempo")xlabel('t'),ylabel('s')

    figure;plot2d('nl',x,y),title('logy'),set(gca(),"grid",[1 1])figure;plot2d('ln',x+0.01,y),title('logx'),set(gca(),"grid",[1 1])figure;plot2d('ll',x+0.01,y),title('loglog'),set(gca(),"grid",[1 1])

    figure;plot(x,y1)set(gca(),"grid",[1 1]) // crea una grigliaset(gca(),"auto_clear","off") // permette di mettere pi grafici su una finestraplot(x,y1,'r.')plot(x,y2,'g')set(gca(),'zoom_box',[min(x),-1.2,max(x),1.2]) // cambia la finestra visibile

    Notare la modifica della finestra grafica eseguita tramite la modifica delle propriet degli

    oggetti.gca()

    d un handle (un manico) per modificare le propriet delloggettoaxes

    (assi); vengono modificate le propriet grid (gestisce la griglia), auto_clear (gestisce lacancellazione del plot) e zoom_box (gestisce la finestra di zoom).

    Per cambiare lo zoom sulla figura, si pu anche usare zoom_rect() (vedi i dettagli con lhelp).

    Se si d semplicemente il comando gca(), vengono visualizzate tutte le propriet delloggettoaxes. Per conoscere il valore di una propriet occorre usare il comando get: per esempio, perconoscere il valore della propriet zoom_box, si usa il comandoval=get(gca(),'zoom_box') .

    La gestione delle propriet degli assi (e delle figure) pu farsi direttamente dalla figura,tramite il menu Modifica. Alternativamente si pu far partire leditore grafico col comandoged (ged(action, fignum)).

    Ci sono altre funzioni per la grafica 2D:

    plot2d2 fa un plot a gradini

    plot2d3 fa un plot con barre verticali

    plot2d4 fa un plot con frecce

    polarplot plot in coordinate polari errbar plot con barre di errore

  • 7/26/2019 Uso Di Scilab

    14/67

    14

    Per la grafica 3D presentiamo luso dei comandi contoure surf:

    // grafica3D

    function f=campana(x1, x2) // una funzione utentef= exp(-x1^2 - x2^2);endfunction

    nlevels=6;x=-4:0.1:4;

    figure;contour(x,x,campana,nlevels)set(gca(),"grid",[1 1])

    n=length(x)for i = 1:n

    y(i)=x(i);

    z(i,:)=campana(x,y(i));end

    figure;surf(x,y,z)

    figure;surf(x,y,log(z)),title('logz')figure;contour(x,x,z,nlevels),set(gca(),"grid",[1 1])figure;contour(x,x,log(z),nlevels),set(gca(),"grid",[1 1])

  • 7/26/2019 Uso Di Scilab

    15/67

    15

    Gestione input/output

    Qui vengono mostrati dei semplici esempi di input/output su file di testo e su schermo. Icomandi essenziali sono analoghi a quelli del C, con qualche differenza funzionale. Ecco quelli

    che abbiamo qui usato:

    mopen e mclose per lapertura e chiusura dei file msprintf per scrivere dati formattati su una stringa disp per mandare a schermo una stringa mfprintf per scrivere dati formattati su un file mfscanf per leggere dati formattati da un file

    // inpoutput

    N=10;k=1:N;n=6;tabn=k*6;

    for i = 1:Ndisp(msprintf('%d x %d = %d\n',n,k(i),tabn(i))) // output sul display

    end

    fid=mopen('tabellina.dat','wt'); // apre un file testo per scriveremfprintf(fid,'Tabellina del %d \n\n',n)for i = 1:N

    mfprintf(fid,'%d x %d = %d\n',n,k(i),tabn(i))endmclose(fid)

    fid1=mopen('dati.dat','wt'); // apre un file testo per scriverefor i = 1:2*N

    mfprintf(fid1,'%d %f %e \n',i,rand(1,2))endmclose(fid1)

    fid2=mopen('dati.dat','r'); // apre un file per leggere, vengono creati nuovi arrayii=zeros(N,1);aa=ii;bb=ii;for i = 1:N

    [nn,ii(i),aa(i),bb(i)]=mfscanf(fid2,'%d %f %f ');endmclose(fid2)

  • 7/26/2019 Uso Di Scilab

    16/67

    16

    Script

    Pi comandi possono essere raccolti in un file (detto script)), normalmente con estensione.sce . Per creare uno script occorre un qualsiasi editor (come, per esempio, il notepad), oppureleditor interno di Scilab, SciNotes, che si pu far partire dal men File della finestra principale

    o col comando editor. Per mandare in esecuzione questi comandi si pu dare il comando

    exec nomescript

    oppure farlo partire dal men _Esegui di SciNotes.

    In uno script (o in una funzione) la doppia sbarra // inizia un commento nella riga. Se si vuolecontinuare un comando su pi righe, basta interrompere ciascuna riga con tre punti successivi().

  • 7/26/2019 Uso Di Scilab

    17/67

    17

    Funzioni e librerie

    Una funzione un insieme di comandi racchiusi dai due comandi functioned

    endfunction. La forma la seguente:

    function [out1, ..., outm] = nomefunzione(input1, ..., inputn)

    comandi

    endfunction

    Gli input1, ..., inputnsono gli argomenti di ingresso dati alla funzione e out1,

    ..., outmgli argomenti di uscita, prodotti dalla funzione. Essa pu essere richiamata dalla

    linea di comando o da uno script o da unaltra funzione.

    Una funzione viene normalmente salvata in un file di testo (come uno script), normalmentecon estensione .sci, e pu essere eseguita anche pi volte con diversi argomenti di input.

    Per poter usare una funzione questa va caricata in memoria, cosa che viene fatto con il

    comando exec nomefunzione, o, pi comodamente, direttamente da SciNotes, dal men

    _Esegui col comando Salva e esegui.

    Un modo pi comodo per gestire pi funzioni costruire una libreria. Per far ci occorreraccogliere in una stessa cartella (per esempio base) tutte e sole le funzioni di cui vogliamocostruire una libreria e quindi dare il comando

    genlib('baselib','C:\Users\SergioF\Documents\Scilab\base\')

    in questo caso si creata una libreria di nome baselib, contenente le funzioni che abbiamomesso nella cartella C:\Users\SergioF\Documents\Scilab\base\3. In questa cartellacompariranno la forma binaria delle nostre funzioni, pi altri file di controllo.

    Quando vogliamo utilizzare la libreria la carichiamo con

    baselib=lib('C:\Users\SergioF\Documents\Scilab\base')

    e quindi possiamo usarne le funzioni. Come vedremo in seguito, le librerie di nostro interessepossono essere caricate automaticamente allo startup di Scilab.

    ATTENZIONE ! In Scilab (a differenza di Matlab e altri linguaggi di programmazione)lambiente esterno non comunica con linterno della funzione solo tramite gli argomenti diinput, ma lambiente della funzione vede le variabili esterne (ma non viceversa).

    3Ovviamente va messo il vero indirizzo della cartella che si sta utilizzando.

  • 7/26/2019 Uso Di Scilab

    18/67

    18

    Altre

    Operazioni con Excel (o fogli elettronici).

    Scilab ha dei comandi che permettono di leggere e scrivere dati in file Excel di tipo xls.

    Per la lettura, il comando

    [fd,SST,Sheetnames,Sheetpos] = xls_open('Test1.xls')

    apre un file Excel di nome Test1.xls e ne acquisisce la struttura. Col comando

    [Value1,TextInd1] = xls_read(fd,Sheetpos(1));

    vengono letti i dati nel primo foglio, creando la matrice Value1. I dati numerici vengono postipari a NaN.

    Per quanto riguarda la scrittura, essendo M una matrice numerica,

    csvWrite(M,'test.csv')

    crea un file in formato comma separated variables, cio variabili separate da virgole, dinome test.csv, che pu essere importato allinterno di un foglio Excel.

    Una guida su tutte le funzioni disponibili riguardo ai fogli elettronici si ottiene con il comando

    help.Spreadshhet

  • 7/26/2019 Uso Di Scilab

    19/67

    19

    File di startup

    Quando viene fatto partire Scilab, vengono eseguiti i comandi che si trovano nei file

    SCIHOME/.scilab ,SCIHOME/scilab.ini , e SCI/ scilab.star, dove SCIHOME il nome

    simbolico della cartella di partenza e SCI di quella di istallazione di Scilab. (Per vedere a cosacorrisponde ciascun nome simbolico, battere al prompt di Scilab il nome simbolico.).

    comodo mettere in uno di questi file (si consiglia scilab.ini), dei comandi che per esempioportano alla cartella di lavoro normalmente usata e istallano la/le librerie duso, se ce ne sono.Per esempio le due righe:

    cd C:\Users\SergioF\Documents\Scilab // si posiziona sulla cartella di lavoro

    baselib=lib('C:\Users\SergioF\Documents\Scilab\base') // istalla la libreria

    nella cartella base

  • 7/26/2019 Uso Di Scilab

    20/67

    20

    Applicazioni per il Laboratorio di Meccanica

    Le function e gli script Scilab qui presentati sono utili per svolgere alcuni esercizi e alcune

    esperienze di laboratorio. Possono inoltre costituire esempi di programmazione in linguaggioScilab. Tutti sono scaricabili dal sito del corso.

    Gli studenti sono incoraggiati a modificarli e/o a svilupparne altri.

    Simulazione di dati

    Lancio di dadi (o monete)

    Per la simulazione usiamo la funzione rand, generatore di numeri casuali distribuitiuniformemente tra 0 e 1.

    // dadiec simulatore di dadi e monete

    n=50;

    u0=rand(1,n,"uniform"); // uniforme da 0 a 1

    d=ceil(u0*6); // uscite dadi

    figure;plot(d,'.'); title("Lancio di dadi - prove ripetute")figure;histplot(0.5:6.5,d ,normalization=%f);title("Lancio di dadi - istogramma")

    d_med_sper=mean(d);d_med_teor=mean(1:6);d_devst_sper=stdev(d);d_devst_teor=sqrt(sum(((1:6)-d_med_teor).^2)/6);disp(msprintf('Lancio di %d dadi',n))disp(msprintf('media sperimentale %f (teorica %f)',d_med_sper,d_med_teor))disp(msprintf('dev.st. sperimentale %f (teorica %f)',d_devst_sper,d_devst_teor))disp('')

    m=round(u0)*2-1; // uscite monetafigure;plot(m,'.'); title("Lancio moneta - prove ripetute")

    figure;histplot(2,m ,normalization=%f);title("Lancio moneta - istogramma")figure;plot(cumsum(m)); title("Lancio moneta - camminata casuale")

    m_med_sper=mean(m);m_med_teor=mean([-1 1]);m_devst_sper=stdev(m);m_devst_teor=sqrt(sum(([-1 1]-m_med_teor).^2)/2);disp(msprintf('Lancio di %d monete',n))disp(msprintf('media sperimentale %f (teorica %f)',m_med_sper,m_med_teor))disp(msprintf('dev.st. sperimentale %f (teorica %f)',m_devst_sper,m_devst_teor))disp('')

  • 7/26/2019 Uso Di Scilab

    21/67

    21

    Per il lancio della moneta si associa 1 a testa e -1 a croce. Notare la passeggiata casualeeseguita facendo un passo in avanti e a destra per ogni testa e un passo indietro e a destra perogni croce.

    Estrazione di un campione da una distribuzione

    Per generare campioni estratti da una popolazione con una certa distribuzione di probabilitsi usa la function grand. In genere, per generare una matrice A di campioni casuali didimensione m*n, si usa il comando

    A=grand(m,n,sigla_distribuzione,par1,par2,)

    Per una descrizione completa di questa funzione si rimanda allhelp (Visualizzatoredellaiuto).

    Presentiamo un semplice script in cui si generano array di dati estratti da varie distribuzioni. Idati vengono poi analizzati facendone un istogramma e calcolandone la media e la deviazionestandard.

    // stat_intro : introduzione alla statistica

    n=1000;

    low=4;high=6;u=grand(1,n,"unf",low,high); // uniformefigure;histplot(10,u,normalization=%f);title('uniforme')

    mu=10;sig=2;g=grand(1,n,"nor",mu,sig); // normalefigure;histplot(20,g,normalization=%f);title('normale')

    N=20;p=0.2;b=grand(1,n,"bin",N,p); // binomiale

    figure;histplot(0:N,b,normalization=%f);title('binomiale')

    mu=10;p=grand(1,n,"poi",mu); // poissonianafigure;histplot(0:30,p,normalization=%f);title('poissoniana')

    media(1)=mean(u);media(2)=mean(g);media(3)=mean(b);media(4)=mean(p);

    devst(1)=stdev(u);devst(2)=stdev(g);devst(3)=stdev(b);

  • 7/26/2019 Uso Di Scilab

    22/67

    22

    devst(4)=stdev(p);

    fprintf(6,'distr. uniforme media = %f devst = %f',media(1),devst(1));fprintf(6,'distr. normale media = %f devst = %f',media(2),devst(2));fprintf(6,'distr. binomiale media = %f devst = %f',media(4),devst(3));fprintf(6,'distr. poissoniana media = %f devst = %f',media(4),devst(4));

    Simulazione di misure con errori

    La function LM_misuresimula misure fisiche di una certa grandezza, con errori di vario tipo.In input abbiamo il valore vero e le caratteristiche dei vari errori, in uscita, array contenenti lemisure e le varie componenti di errore; possibile anche impostare un trend.

    function [mis, el, es, ec, tr, dist]=LM_misure(valv, errlet, errsist, errcas, trend,pr_dist, amp_dist)// LM_MISURE simulazione misure//// [mis el es ec tr dist]=LM_misure(valv,errlet,errsist,errcas,trend,pr_dist,amp_dist)//// valv valore vero (array; se 2 elementi, primo valv, secondo numero// di misure)// errlet errore di lettura (p. es. 0.001)// errsist errore sistematico (di taratura) [b a]: b*vv+a// errcas deviazione standard del rumore casuale// trend trend (aumento del valore per misura)// pr_dist probabilit dei disturbi occasionali// amp_dist ampiezza media disturbi occasionali

    mis=[];el=[];es=[];ec=[];tr=[];dist=[];

    mode(0);ieee(1);

    if max(size(valv))==2 thenvalv= mtlb_e(valv,1)*ones(mtlb_e(valv,2),1);

    end;

    n = max(size(valv));tr= (0:n-1)'*trend;es=(valv+tr).*errsist(1)+errsist(2);ec= errcas*rand(n,1,"normal");i = find(rand(n,1)

  • 7/26/2019 Uso Di Scilab

    23/67

    23

    interattivamente), vengono prodotti dei grafici con le misure, gli errori e i loro istogrammi eviene creato un file con tutti i dati, che pu essere aperto con qualsiasi editor di testi(attenzione per, perch contiene molte colonne e quindi ci possono essere problemi diallineamento).

    // I_LM_misuremode(0);ieee(1);

    answ = x_mdialog('Parametri di misure ripetute',["Numero misure";"Valore vero";"Errore dilettura";"Errore sistematico (alfa)";"Errore sistematico (beta)";"Errorecasuale";"Trend";"Probabilit disturbi";"Ampiezzadisturbi"],["60";"10";"0.1";"0.2";"0.01";"0.4";"0.0";"0.04";"3"]);

    Nmis = evstr(answ(1));valv = evstr(answ(2));errlet = evstr(answ(3));esalf = evstr(answ(4));esbet = evstr(answ(5));

    errcas = evstr(answ(6));trend = evstr(answ(7));pr_dist = evstr(answ(8));amp_dist = evstr(answ(9));

    [mis,el,es,ec,tr,dist] =LM_misure([valv,Nmis],errlet,[esbet,esalf],errcas,trend,pr_dist,amp_dist);

    figure;plot(mis),set(gca(),"auto_clear","off"),plot(mis,"r."),set(gca(),"grid",[1,1])title("Misure ripetute"),xlabel("Numero d''ordine")figure;plot(el),set(gca(),"auto_clear","off"),plot(es,"r"),plot(ec,"k"),set(gca(),"grid",[1,1])plot(el,"."),plot(es,"r."),plot(ec,"k.")title("Errori"),xlabel("Numero d''ordine"),legend("Errori di lettura","Errore sistematico","Errori casuali");

    figure;plot(tr),set(gca(),"auto_clear","off"),plot(dist,"k"),set(gca(),"grid",[1,1])plot(tr,"."),plot(dist,"k.")title("Disturbi e trend"),xlabel("Numero d''ordine"),legend("Trend","Disturbi");

    mea = mean(mis,"m");sd = stdev(mis);messagebox([msprintf("media = %f",mea),msprintf("st.dev. = %f",sd)],"Statistica Misure")

    figure;histplot(100,mis,normalization=%f),title("Istogramma delle misure")figure;histplot(round(sqrt(Nmis)),el,normalization=%f)title("Istogramma errori di lettura")figure;histplot(round(sqrt(Nmis)),ec,normalization=%f)title("Istogramma errori casuali")

    figure;histplot(round(sqrt(Nmis)),es,normalization=%f)title("Istogramma errori sistematici")

    timstr = snag_timestr(now());fid = mopen("misure_"+timstr+".dat","wt");mfprintf(fid," Simulazione di misure \r\n\r\n");mfprintf(fid," Errore di lettura %f \r\n",errlet);mfprintf(fid," Errore casuale %f \r\n",errcas);mfprintf(fid," Errore sistematico alfa e beta %f %f \r\n",esalf,esbet);mfprintf(fid," Trend %f \r\n",trend);mfprintf(fid," Disturbo (prob,amp) %f %f\r\n",pr_dist,amp_dist);mfprintf(fid,"\r\n N misura err.lett. err.cas. err.sist. trenddisturbo \r\n");

    if errlet > 0 then

    ndig = ceil(log10(1/errlet));else

    ndig = 6;

  • 7/26/2019 Uso Di Scilab

    24/67

    24

    end;format = msprintf("%%4d %%12.%df %%10f %%10f %%10f %%10f %%10f \r\n",ndig);

    for i = 1:Nmismfprintf(fid,format,i,mis(i),el(i),ec(i),es(i),tr(i),dist(i));

    end;

    mfprintf(fid,"\r\n media %f %f %f %f %f %f\r\n",mean(mis,"m"),mean(el,"m"),mean(ec,"m"),mean(es,"m"),mean(tr,"m"),mean(dist,"m"));mfprintf(fid," dev.st. %f %f %f %f %f %f\r\n",stdev(mis),stdev(el),stdev(ec),stdev(es),stdev(tr),stdev(dist));

    mclose(fid)

    Montecarlo per la valutazione dellincertezza in modo semplificato

    Talvolta si valuta lincertezza (sulla singola misura) di una misura ripetuta tre volteprendendo la semidifferenza tra la massima e la minima. Quale la validit di questaprocedura ? Per valutarlo stato realizzato un montecarlo che valuta lincertezza con la stima(non distorta) della deviazione standard e con il metodo della semidifferenza tra massima eminima. I dati simulati sono distribuiti secondo una normale standardizzata, quindilincertezza aspettata, assimilata alla deviazione standard 1.

    Ecco il semplice programma in Scilab:

    // monte_sign3 montecarlo per la valutazione dell'incertezza in modosemplificato// per 3 misure

    nval=3;N=10000;me=zeros(1,N);sd=me;sd1=sd;

    for i = 1:Nr=grand(1,nval,'nor',0,1); // nval numeri casuali con dist. norm. standardme(i)=mean(r);sd(i)=stdev(r);sd1(i)=(max(r)-min(r))/2;

    end

    mean(me)stdev(me)figure,histplot(100,me),title('Distribuzione della media'),gridon

    mean(sd)stdev(sd)figure,histplot(100,sd),gridontitle('Distribuzione della stima della deviazione standard')mean(sd1)stdev(sd1)figure,histplot(100,sd1),gridon

  • 7/26/2019 Uso Di Scilab

    25/67

    25

    title('Distribuzione della stima dellincertezza semplificata')

    Ed ecco i risultati:

    In teoria Stima della dev.st. Metodo semplificatoIncertezza valutata 1 0.886 0.846 sullincertezza - 0.463 0.444

    Ed ecco gli istogrammi dei dati ottenuti:

    Possiamo ora domandarci come vanno i due metodi di valutazione dellincertezza se inveceche operare su 3 misure lo si fa su un altro numero N. Ecco il programma:

    // monte_sign montecarlo per la valutazione dell'incertezza in modosemplificato// al variare del numero di misure

    N=2000;sd=zeros(1,N);sd1=sd;msd=zeros(1,9);msd1=msd;

    for j = 1:9for i = 1:N

    r=grand(1,j+1,'nor',0,1); // j+1 numeri casuali con distribuzionenormale standardizzata

    sd(i)=stdev(r);sd1(i)=(max(r)-min(r))/2;

    endmsd(j)=mean(sd);msd1(j)=mean(sd1);

    end

    figure,plot(2:10,msd),holdon,plot(2:10,msd,'.')

  • 7/26/2019 Uso Di Scilab

    26/67

    26

    plot(2:10,msd1,'r'),plot(2:10,msd1,'r.'),gridonplot(ones(1,10),'g'),xlabel('Numero di misure')ylabel('Incertezza stimata')title('Blu sigma, Rosso (max-min)/2, Verde valore teorico')

    e i risultati:

    Si noti che la stima dellincertezza fatta con la semi-differenza tra la massima e la minimamisura abbastanza ragionevole nel caso in cui N uguale a 3 o a 4 (simile o migliore allastima della deviazione standard, mentre per N>4 d risultati in eccesso. Per N-2 una stimaragionevole dellincertezza prendere semplicemente la differenza tra la massima e laminima misura (il valore aspettato circa 1.13).

  • 7/26/2019 Uso Di Scilab

    27/67

    27

    Lettura di dati da file

    Presentiamo due function per leggere dati da file.

    leggi_xyinc per leggere dati da un file testo. Il formato in cui i dati sono scritti nel file,per ogni riga,

    x incertezza_di_x y incertezza_di_y

    ATTENZIONE ! usare il punto o la virgola come separatore decimale a seconda dello

    standard del computer in uso.

    Suggerimento: settare il proprio computer in modo da usare come separatore decimale il

    punto (uso standard internazionale).

    Possono essere inserite righe di commento, inizianti per %. Le righe vuote sono ignorate. Idati devono essere scritti usando il punto come separatore decimale (non la virgola !).Lafunzione pu essere in due modi:

    o col nome (col path se in unaltra cartella) del file da leggere

    [x,dx,y,dy]=leggi_xyinc(nomefile);

    o senza argomento dingresso(sar richiesto interattivamente il file(

    [x,dx,y,dy]=leggi_xyinc();

    I dati saranno nei quattro vettori x,dx,y,dydi lunghezza il numero delle righe di dati.

    function [x, dx, y, dy]=leggi_xyinc(fil)

    [nout,nin]=argn();

    // indica quanti sono gli argomenti di uscita e di ingressoif nin < 1 then

    [fnam,pnam]=uigetfile('*',' ',"Quale file aprire ?");fil=pnam+filesep()+fnam;

    endfid=mopen(fil,'r');

    err=0;i=0;while err == 0

    line=mgetl(fid,1);err=meof(fid); disp(line)

    if length(line) > 0 thenif part(line,1) ~= '%' then

    i=i+1;

  • 7/26/2019 Uso Di Scilab

    28/67

    28

    a=msscanf(line,' %g %g %g %g');x(i)=a(1);dx(i)=a(2);y(i)=a(3);dy(i)=a(4);

    end

    endend

    mclose(fid);

    endfunction

    I dati cos conservati possono essere visualizzati con la function plot_unc:

    function plot_unc(x, uncx, y, uncy)

    // Grafica dati con incertezze// x,uncx,y,uncy dati e incertezze// se c' un solo argomento, viene inteso come il nome del file con i dati// se non ci sono argomenti, cerca il file

    [nout,nin]=argn();

    if nin == 1 then[x,uncx,y,uncy]=leggi_xyinc(x);

    end

    if nin == 0 then[x,uncx,y,uncy]=leggi_xyinc();

    end

    figuren=length(x);for i = 1:n

    plot([x(i)-uncx(i),x(i)-uncx(i),x(i)+uncx(i),x(i)+uncx(i),x(i)-uncx(i)],...[y(i)-uncy(i),y(i)+uncy(i),y(i)+uncy(i),y(i)-uncy(i),y(i)-uncy(i)],'r')plot([x(i),x(i)],[y(i)-uncy(i),y(i)+uncy(i)]);plot([x(i)-uncx(i),x(i)+uncx(i)],[y(i),y(i)]);

    endplot(x,y,'.')set(gca(),"grid",[1 1])endfunction

    producendo un grafico come (vedi file dati_con_inc.dat):

  • 7/26/2019 Uso Di Scilab

    29/67

    29

    leggi_pasco per leggere dati da un file prodotto dal sistema Pasco, usato per alcuneesperienze. I dati in questo file sono spesso scritti usando la virgola come separatoredecimale (dipende dal settaggio del computer), quindi si dovuto realizzare una ulteriorefunction (readascii_comma) che cambia le virgole in punti.

    La funzione pu essere in due modi:o col nome (col path se in unaltra cartella) del file da leggere

    [t,s,dt,n]=leggi_pasco(nomefile);

    o senza argomento dingresso(sar richiesto interattivamente il file)

    [t,s,dt,n]=leggi_pasco(nomefile);

    I dati saranno nei vettore t (i tempi di acquisizione) e s(misura, p.es. distanza o peso); dt

    indica il tempo di campionamento (non sempre esattamente, come si pu controllarevedendo i dati in t) e n il numero di misure (dimensione di t e s).

    function [t, s, dt, n]=leggi_pasco(fil)

    [nout,nin]=argn();if nin < 1 then

    [fnam,pnam]=uigetfile('*',' ',"Quale file aprire ?");fil=pnam+"\"+fnam;

    enddisp(fil)A=readascii_comma(fil,2,2);

    t=A(:,1);

  • 7/26/2019 Uso Di Scilab

    30/67

    30

    s=A(:,2);n=length(t);dt=(t(n)-t(1))/(n-1);

    endfunction

    function a=readascii_comma(fil, ncomments, ncol)//READASCII_comma reads an ASCII file to a vector, with comma-to-dotconversion//// a=readascii(file,ncomments,ncol)//// ncomments is the number of lines containing comments (skipped anddisplayed)// ncol is the number of the columns of the output array// (must be a sub-multiple of the total number of the data)

    [fid,message]=mopen(fil,'r');

    if fid == -1disp(message);end

    for i = 1:ncommentsline=mgetl(fid,1);disp(line);

    end

    c=mgetl(fid);c=strsubst(c,',','.');a=msscanf(-1,c,' %g %g');

    mclose(fid);

    endfunction

  • 7/26/2019 Uso Di Scilab

    31/67

    31

    Fit

    Sono qui raccolti alcune function Scilab per fare fit di dati sperimentali.

    La function gen_lin_fitpermette di fare fit polinomiali, armonici o generici, col metodo dellamassima verosimiglianza (minimo chi quadro).

    Nel caso dei polinomi, va fornito il grado come parametro.

    Nel caso della combinazione lineare di funzioni sinusoidali, vanno fornite come parametri lefrequenze.

    Nel caso generale il parametro la matrice nxM dei valori delle M funzioni base per gli n punti

    di ascissa.

    Se la variabile ipl maggiore di zero, vengono prodotti anche i grafici.

    function [a, covarout, F, res, chiq, ndof, err, errel]=gen_lin_fit(x, y, unc,ic,par, ipl)

    // GEN_LIN_FIT general linear fit//// [a,covarout,F,res,chiq,ndof,err,errel]=gen_lin_fit(x,y,unc,ic,par,ipl)//// x abscissa value (length n) or gd// y ordinate value (length n) or nothing// unc y uncertainty (length n; if single number, all equal)// ic type of linear fit:

    // 0 -> general; par the matrix [n,M]// 1 -> polynomial; par the order// 2 -> sinusoidal; par the frequencies// ipl = 1 -> plot//// a fit parameters (length M)// covarout covariance matrix// F base functions// res residuals// chiq chi-square value// ndof degrees of freedom// err mean square error// errel mean square relative error

    // Modalit mostramode(0);// Mostra un avviso per una eccezione in virgola mobileieee(1);// Inizializzazione delle variabili in uscita (non trovate nelle variabili

    in ingresso)a=[];covarout=[];F=[];res=[];chiq=[];ndof=[];err=[];errel=[];

    n = max(size(x));

  • 7/26/2019 Uso Di Scilab

    32/67

    32

    if max(size(unc))==1 thenconst = unc;unc(1:n) = const;

    end;

    [nout,nin]=argn();if nin < 6 thenipl= 0;

    end;

    x=x(:);y=y(:);unc=unc(:);

    select iccase 0 then

    A =par;[n,M] = size(A);

    case 1 thenM =par+1;for i = 0:

    par

    A(1:length(x.^(par-i)),i+1) = x.^(par-i);end;

    case 2 thennfr = max(size(par));M = nfr*2;ii = 0;for i = 1:nfr

    ifpar(i) > 0 thenA(1:n,ii+1)=cos(((2*%pi)*par(i))*x);A(:,ii+2) = sin(((2*%pi)*par(i))*x);ii = ii+2;

    elseA(1:n,ii+1)=cos(((2*%pi)*par(i))*x);ii = ii+1;M = M-1;

    end;end;

    end;

    F= A;for i = 1:M

    A(:,i) = A(:,i) ./unc;end;y1 = y./unc;

    B = A'*A;

    b = A'*y1;

    covarout= inv(B);a= covarout*b;

    chiq= sum((y1-A*a).^2);ndof= n-M;

    y2 = F*a;res= y2-y;

    for i = 1:nf = F(i,:);

    err(1,i) = (f*covarout)*f';end;

  • 7/26/2019 Uso Di Scilab

    33/67

    33

    err= sqrt(err);err= sqrt(sum(err.^2)/n);errel= err/sqrt(sum(y.^2)/n);

    if ipl> 0 thenfigure; plot(F), set(gca(),"grid",[1,1]), title("base functions")

    figure; plot(x,y,"."), set(gca(),"auto_clear","off"), plot(x,y2,"r"),set(gca(),"grid",[1,1]), title("fit")figure; plot(x,res,"."), set(gca(),"grid",[1,1]), title("residuals")

    end;endfunction

    La funzione data_polyfitpermette di fare il fit polinomiale in modo interattivo: mostra ilgrafico dei dati disponibili, quindi richiede di scegliere i pezzi da analizzare e, se non vienespecificato prima, quale deve essere il grado del polinomio. Per ilcalcolo del fit, usa gen_lin_fit.

    Sono prodotti alcuni grafici e i risultati dettagliati sono contenuti in un array di strutture (unasola struttura se si sceglie un solo pezzo).

    function data=data_polyfit(x, y, unc)// DATA_POLYFIT analyzes x-y data//// data=data_polyfit(x,y,unc)//// x,y input data// unc uncertainty on y data (costant)//// data(i).iclog iclog// data(i).x the x of the selection

    // data(i).y the y// data(i).a the polynomial coefficients (starting from higher power)// data(i).aunc uncertainty on the polynomial coefficients// data(i).F base functions// data(i).res the residuals// data(i).err the mean square error// data(i).errel the relative error// data(i).chiq chi square// data(i).ndof number of degrees of freedom

    // Inizializzazione delle variabili in uscita (non trovate nelle variabili in ingresso)// Modalit mostramode(0);// Mostra un avviso per una eccezione in virgola mobileieee(1);

    //[iin,iout]=argn();iclog=0;x1 = x;y1 = y;out=struct();

    [xx,ii] = sel_absc(x,y);

    [i1,i2] = size(ii);

    for i = 1:i1out.iclog = iclog;out.x = x1(ii(i,1):ii(i,2));out.y = y1(ii(i,1):ii(i,2));x2 = x(ii(i,1):ii(i,2));y2 = y(ii(i,1):ii(i,2));fig = mtlb(figure); plot(x2,y2,"."), set(gca(),"grid",[1,1]);

  • 7/26/2019 Uso Di Scilab

    34/67

    34

    result=x_dialog('grado del polinomio ?','2');par=eval(result);mtlb_close(fig);

    [a,covarout,F,res,chiq,ndof,err,errel] = gen_lin_fit(x2,y2,unc,1,par,0);

    polyfit_res_plot(x2,y2,a,res)out.a = a;for j = 1:length(a)

    out.aunc(j) = sqrt(covarout(j,j));end;out.covar = covarout;out.F = F;out.unc = unc;out.meanres = mean(res,"m");out.stdres = stdev(res);out.res = res;out.err = err;out.errel = errel;out.chiq = chiq;out.ndof = ndof;

    data(i)=out;end;endfunction

    Questa funzione molto comoda per lavorare con i dati della strumentazione Pasco. Ecco unesempio:

    - leggere i dati di esempio nel file esem_pasco.txt col comando[t,s,dt,n]=leggi_pasco();

    - dare il comando data = data_polyfit(t,s,0.001);

    Compare una finestra con i dati graficati, su cui si pu scegliere un segmento (col mouse); unafatta la scelta (pi di una volta, se si vuole), appare il grafico con la (le) parti scelte evidenziatein rosso:

  • 7/26/2019 Uso Di Scilab

    35/67

    35

    Quindi, per ogni segmento scelto viene chiesto il grado del polinomio con cui fare il fit:

    e infine appare una finestra con i dati scelti con sovrapposto il fit e i residui (la differenza trail fit e i dati):

  • 7/26/2019 Uso Di Scilab

    36/67

    36

    In uscita viene prodotta un array di mlist (in pratica, strutture), una per ogni segmentoscelto. Ciascuna contiene i dati e i risultati del relativo fit, e cio, per il k-esimo segmento,

    data(k).x e data(k).y contengono ascisse e ordinate dei punti selezionati nel segmento

    data(k).a contiene i coefficienti del polinomio del polinomio interpolante, a partire daquello della potenza pi alta

    data(k).aunccontiene le incertezze per i vari coefficienti

    data(k).covarla matrice di covarianza per i coefficienti

    data(k).F le funzioni base del fit (in questo caso, semplicemente le potenze di x)

    data(k).res i residui del fit

    Ci sono poi, ma spesso non sono interessanti,

    data(k).err lerrore quadratico medio

    data(k).errel lerrore quadratico medio relativo

    data(k).chiq il chi quadro

    data(k).ndof il numero di gradi di libert

  • 7/26/2019 Uso Di Scilab

    37/67

    37

    Derivata col fit

    A volte occorre stimare la derivata di dati campionati (non necessariamente in modouniforme). Per far ci esistono vari algoritmi, pi o meno raffinati.

    La tecnica che proponiamo si basa sullesecuzione del fit polinomiale dei dati campionati(eseguito con data_polyfit) e sulla derivazione algebrica del polinomio trovato. Nella funzioneche segue si pu scegliere lordine della derivata che si vuole (che non ha senso sia maggioredel grado del polinomio del fit).

    function data=derifit(x, y, unc, ord)// derivata col fit//// x,y input data// unc uncertainty on y data (costant)

    // ord order of derivative (def 1)//// data(i).iclog iclog// data(i).x the x of the selection// data(i).y the y// data(i).a the polynomial coefficients (starting from higher power)// data(i).aunc uncertainty on the polynomial coefficients// data(i).F base functions// data(i).res the residuals// data(i).err the mean square error// data(i).errel the relative error// data(i).chiq chi square// data(i).ndof number of degrees of freedom

    //// data(i).dord order of derivative// data(i).dy derivative of y// data(i).da coefficients of the derivative

    [lhs,rhs]=argn();if rhs < 4 then

    ord=1;end

    str=msprintf('Derivata di ordine %d',ord);

    data= data_polyfit(x,y,unc);

    [n,nn]=size(data);

    for i = 1:ndata(i).dord=ord;a=data(i).a;x=data(i).x;for j = 1:ord

    a=polyder(a);enddata(i).da=a;dy=calcpoly(x,a);data(i).dy=dy;figure;plot(x,dy),holdon,gridon,plot(x,dy,'r.'),title(str)

    end

    endfunction

  • 7/26/2019 Uso Di Scilab

    38/67

    38

    Si noti che alla struttura data sono stati aggiunti tre elementi:

    data(k).dord ordine della derivata

    data(k).dy valori della derivata data(k).da coefficienti della derivata

    Alla fine viene visualizzato il plot della derivata.

    Ecco le due piccole funzioni di servizio che calcolano la derivata di un polinomio e i valori diun polinomio:

    function dpol=polyder(pol)// Calcola la derivata di un polinomio//

    // pol coefficienti del polinomio (dalla potenza pi slta alla 0-esima)//// dpol coefficienti della derivata (dalla potenza pi slta alla 0-esima)

    N=length(pol)-1;dpol=pol(1:N)*0;if N == 0 then

    dpol=0;endfor i = 1:N

    dpol(i)=(N-i+1)*pol(i);endendfunction

    function y=calcpoly(x,pol)// Calcola un polinomio nei punti x//// pol coefficienti del polinomio (dalla potenza pi slta alla 0-esima)

    N=length(pol)-1;y=pol(N+1)*(x*0+1);for i = N:-1:1

    y=y+x*pol(i);x=x.*x;

    end

    endfunction

  • 7/26/2019 Uso Di Scilab

    39/67

    39

    Elaborazione di dati: lo smoothing

    Lo smoothing (smussamento) dei dati campionati spesso usato per ridurre lerrore dicampionamento (o di lettura) e lerrore casuale. un particolare tipo di filtraggio e consistenel fare opportune medie pesate nellintorno di ciascun campione. La function easy_smoothesegue lo smoothing di dati campionati; gli argomenti sono x (i dati da smussare) e n, lalunghezza della finestra di smoothing (un numero piccolo, per esempio 2).

    function y=easy_smooth(x, n)// EASY_SMOOTH data smoothing//// x input data// n smoothing depth (positive integer)//// y smoothed data

    y=[];mode(0);ieee(1);

    if~exists("n") then

    n= 1;end;

    n= round(n);if n< 1 then

    n= 1;end;

    win=1:n+1;win(2*n+1:-1:n+2)=1:n;

    y=conv(x,win)/(n+1)^2;y=y(n+1:length(y)-n);

    endfunction

  • 7/26/2019 Uso Di Scilab

    40/67

    40

    Analisi statistica dei dati

    Le funzioni per lanalisi statistica dei dati sono molte, ma spesso non sono adeguate allanalisidelle misure fisiche. Tra quelle pi utili

    mean(x) calcola la media del vettore x

    median(x) calcola la mediana del vettore x

    stdev(x) calcola la deviazione standard (non distorta) del vettore x

    cmoments(x,ord) calcola il momento centrale di ordine ord del vettore x

    histplot(n,data,normalization=%f) disegna un istogramma; se non si ponenormalization=%f, listogramma viene normalizzato come se fosse una distribuzione diprobabilit continua.

    Realizziamo alcuni esempi di funzioni per lanalisi statistica.

    Istogramma

    La funzione histplot non molto comoda da usare ed inoltre solo grafica, cio non producein uscita i valori dellistogramma. La funzione hist_LMistogramma i dati contenuti in unamatrice. I parametri dellistogramma, contenuti in x, possono essere dati in quattro diversimodi:

    dando solo il numero di bin

    dando linizio del primo bin e la larghezza dei bin

    dando linizio del primo bin,la larghezza e il numero dei bin

    dando gli estremi dei vari bin (utile se i bin hanno larghezze differenti)

    function [h, xh, xb]=hist_LM(x, data)//// x parametri dell'istogramma:// se ha una componente, numero dei bin// se ha due componenti, inizio del primo bin e larghezza dei bin

    // se ha tre componenti, inizio del primo bin, larghezza dei bin enumero di bin// se ha pi componenti, queste indicano gli estremi dei successivi bin// data dati (in genere una matrice)//// h valori dell'istogramma// xh valori centrali dei bin dell'istogramma// xb valori dei bordi dei bin dell'istogramma

    if isstruct(data) thendata=data.y;

    enddata=data(:);

    lx=length(x);

    select lx

  • 7/26/2019 Uso Di Scilab

    41/67

    41

    case 1 thenm=floor(x);dm=x-m;xmin=min(data);xmax=max(data);dx=(xmax-xmin)/m;

    case 2xmin=x(1);dx=x(2);m=ceil((max(data)-xmin)/dx)+1;xmax=xmin+m*dx;

    case 3xmin=x(1);dx=x(2);m=x(3);xmax=xmin+m*dx;

    end

    if lx m);k(kk)=m;kk=find(k=x(i) & data< x(i+1));h(i)=length(k);

    endk=find(data>= x(i+1));h(m)=h(m)+k;k=find(data< x(1));h(1)=h(1)+k;

    end

    figure

    for i = 1:mplot([x(i),x(i)],[0,h(i)]);plot([x(i),x(i+1)],[h(i),h(i)]);plot([x(i+1),x(i+1)],[h(i),0]);

    endplot([x(m+1),x(m+1)],[h(1),0]);xb=x;

    endfunction

  • 7/26/2019 Uso Di Scilab

    42/67

    42

    Percentili

    Per un certo campione (o insieme di dati) spesso utile conoscere quale il valore al di sottodel quale c una certa percentuale dei dati. questo in un certo senso una generalizzazione

    della mediana (che il valore al di sotto del quale il 50 % dei dati).

    Ecco una funzione che esegue questo calcolo:

    function y=percentile(x,p)// Calcola i percentili di un campione//// x dati// p percentuale (da 0 a 100; anche array)

    x=gsort(x);

    y=p*0;N=length(x(:));

    for i = 1:length(p)ii=round(N*p(i)/100+0.5);if ii < 1 then

    ii=1;endif ii > N then

    ii=N;end

    y(i)=x(ii);end

    endfunction

  • 7/26/2019 Uso Di Scilab

    43/67

    43

    Coefficiente di correlazione e scatter-plot

    Supponiamo di avere n misure di una grandezza x e altrettante di una misura y, contenute neidue array xey.

    Possiamo farne lo scatter-plot e calcolarne il coefficiente di correlazione.

    Abbiamo simulato 20 valori di x e y. Eccone lo scatter-plot:

    Per calcolare il coefficiente di correlazione e valutarne la significativit abbiamo realizzato laseguente function:

    function [ro, sd0]=corr_coeff(x, y,N)// Coefficiente di correlazione con incertezza tra x e y//// N dimensione del montecarlo (def = 1000)// ro coefficiente di correlazione// sd0 deviazione standard dell'auto-simulazione

    [n1,n2]=argn()if n2 == 2 then

    N=1000;

  • 7/26/2019 Uso Di Scilab

    44/67

    44

    endn=length(x);sx=stdev(x);sy=stdev(y);ro=corr(x,y,1)/(sx*sy);ro1=zeros(1,N);

    for i = 1:Nii=rand_perm(n);ro1(i)=corr(x(ii),y,1)/(sx*sy);

    end

    figure,histplot(100,ro1,normalization=%t)sd0=stdev(ro1);

    endfunction

    Essa calcola prima il coefficiente di correlazione tra x ed y (la function corrdi Scilab calcola

    la covarianza) e in seguito lo calcola N volte avendo permutato casualmente gli elementi di x:ci permette di valutare la significativit del valore di ro, poich si suppone che la

    permutazione casuale abbia distrutto la correlazione. inc0 la deviazione standard dei

    valori del coefficiente di correlazione con i dati permutati.

    Con i dati usati per lo scatter-plot troviamo ro=0.741 e sd0=0.218 e la distribuzione dei ro peri dati permutati

  • 7/26/2019 Uso Di Scilab

    45/67

    45

    Test del chi quadro

    Se sono dati i valori teorici, i valori sperimentali, le incertezze su questi, il numero di gradi dilibert da sottrarre al numero di misure e la significativit voluta per il test, la seguente

    funzione valuta il test del chi quadro, producendo la variabile logica test (vera se il test superato); vengono anche prodotti il valore del chi quadro calcolato e il valore del chi quadrolimite.

    function [test, chiq, chiqlim]=test_chiq(yteor, ysp, unc,mdof, sig)// Test del chi quadro//// yteor valori teorici// ysp valori sperimentali// unc incertezze (=0 -> sqrt(yteor))// mdof numero di gradi di libert da sottrarre

    // sig significativit del test (p.es. 0.05)

    if length(unc) == 1 thenunc=sqrt(yteor);

    enddof=length(yteor)-mdof;chiq=sum(((ysp(:)-yteor(:)).^2)./unc(:).^2);

    X=cdfchi("X",dof,1-sig,sig);if chiq< X then

    test=%T;else

    test=%F;end

    endfunction

  • 7/26/2019 Uso Di Scilab

    46/67

    46

    Valutazione dellincertezzacol metodo di Montecarlo

    Quando una misura indiretta dipende da molte misure dirette in modo complesso, purisultare non conveniente valutare lincertezza della misura col metodo delle derivate parziali.

    questo per esempio il caso della misura di g con il pendolo fisico.

    In casi di questo genere comodo valutare lincertezza della misura con il metodo diMontecarlo. In pratica, se la nostra misura indiretta dipende da n misure dirette, laricalcoliamo un gran numero di volte, in ognuna delle quali mettiamo come valori dellemisure dirette un valore casuale scelto sulla base della misura fatta e della sua incertezza: sela misura diretta era dominata dallerrore di lettura, per questa prendiamo un valoredistribuito uniformemente nellintervallo di misura, se invece la misura diretta era dominatadallerrore casuale, per questa prendiamo un valore distribuito gaussianamente con valoreaspettato la nostra misura e deviazione standard la sua incertezza. Studiamo quindi lastatistica dei risultati ottenuti.

    Ecco la funzione:

    function [unc, yhist, yphist]=lm_uncert(funinp, arginp)// lm_uncert computes uncertainty for a given function//// [unc yhist yphist]=lm_uncert(funinp,arginp)//// funinp name of the function (it must be created and "executed")// (see for example the exfun_lm_uncert)

    // arginp arguments of the function with [value uncertainty type]// (see for example the driver_exfun_lm_uncert)////// typ = 0 gauss (statistical error)// typ = 1 uniform (resolution error)// typ = 2 exponential// typ = 3 user-defined distribution (the user should provide the function usernd)//// unc.y value// unc.yy mean value// unc.ymedian median// unc.dy total uncertainty// unc.sig1 unc, equalized to 1 gaussian sigma in prob (0.15865 and 0.84135)// unc.py(k) partial mean value

    // unc.pdy(k) partial uncertainties

    funinp='y='+funinp+'(';N=100000;NP=10000;sigm=0.15865;sigp=0.84135;

    indeq=strindex(arginp,'=');indap=strindex(arginp,'[');indcl=strindex(arginp,']');indpv=strindex(arginp,';');nvar=length(indeq);nomevar=list(nvar);

    valvar=list(nvar);ini=1;

    for i = 1:nvar

  • 7/26/2019 Uso Di Scilab

    47/67

    47

    nomevar(i)=part(arginp,ini:indeq(i)-1);valvar(i)=part(arginp,indap(i)+1:indcl(i)-1);ini=indpv(i)+1;

    end

    strcom=funinp;str1=strcom;

    r=zeros(nvar,N);y=zeros(1,N);

    for i = 1:nvarvars(i)=nomevar(i);execstr('aa=['+valvar(i)+'];');val(i)=aa(1);uncer(i)=aa(2);typ(i)=aa(3);select typ(i)

    case 0 thenr(i,:)=val(i)+grand(1,N,'nor',0,uncer(i));

    case 1 thenr(i,:)=val(i)+(grand(1,N,'unf',-uncer(i),uncer(i)));

    case 2 thenr(i,:)=val(i)+grand(1,N,'exp',uncer(i));

    // case 3 then// r(i,:)=val(i)+usernd(N)*uncer(i);

    endif i == 1

    strcom=strcom+msprintf('r(%d,:)',i);str1=str1+msprintf('val(%d)',i);

    elsestrcom=strcom+msprintf(',r(%d,:)',i);str1=str1+msprintf(',val(%d)',i);

    endend

    strcom=strcom+');';str1=str1+');';kk=strindex(str1,',');kk0=strindex(str1,');');kk=[kk kk0];

    execstr(strcom);

    unc.yy=mean(y);unc.dy=stdev(y);[yhistx]=hist_LM(200,y,0);dx=x(2)-x(1);yhist=yhist/(N*dx);aaa=percentile(y,[sigm 0.5 sigp]*100);unc.ymedian=median(y);

    unc.sig1=[aaa(1)-aaa(2) aaa(3)-aaa(2)];figure,plot2d2(x,yhist),gridonfigure,plot2d2('nl',x,yhist),gridonaaa=gca();poly1= aaa.children(1).children(1);poly1.thickness = 2;

    execstr(str1);unc.y=y;

    bi=length(funinp);y=zeros(1,NP);yphist=list();figure;holdon

    for i = 1:nvarselect typ(i)

    case 0 then

  • 7/26/2019 Uso Di Scilab

    48/67

    48

    r=val(i)+grand(1,NP,'nor',0,uncer(i));case 1 then

    r=val(i)+(grand(1,NP,'unf',-uncer(i),uncer(i)))case 2 then

    r=val(i)+grand(1,NP,'exp',uncer(i));endstr2=part(str1,1:bi)+'r'+part(str1,(kk(i):length(str1)));//disp(str2)

    bi=kk(i);//disp(str2)execstr(str2);unc.py(i)=mean(y);unc.pdy(i)=stdev(y);yhist1=hist_LM(x,y,0)/(NP*dx);col=rotcol(i);plot2d2('nl',x(1:length(x)-1),yhist1+0.5),gridon // ATTENZIONE WORKAROUNDaaa=gca();poly1= aaa.children(1).children(1);polyl.foreground=col;

    // yhist1=gd(yhist1);// yhist1=edit_gd(yhist1,'ini',x(1),'dx',x(2)-x(1));

    yphist(i)=yhist1;endtitle('Dispertion due to single variables')

    unc.vars=vars;unc.varsval=val;unc.varsunc=uncer;unc.varstyp=typ;

    mprintf('\n')mprintf(' Output value: %f \n',unc.y)mprintf(' mean value: %f \n',unc.yy)mprintf(' median: %f \n',unc.ymedian)mprintf(' symmetrical uncertainty: %f \n',unc.dy)mprintf('asymmetrical uncertainties: %f %f\n',unc.sig1)if unc.y ~= 0

    mprintf(' relative uncertainty: %f \n\n',unc.dy/abs(unc.y))

    end

    mprintf(' Partial uncertainties \n\n')mprintf(' variable value type unc. relunc part.unc. weight\n')

    for i = 1:nvarselect typ(i)

    case 1 thenstr='uniform';

    // un=uncer(i)/sqrt(3);else

    str='normal ';// un=uncer(i);

    endun=uncer(i);

    relun=un/abs(val(i));weig=unc.pdy(i)/(relun*unc.y);mprintf(' %7s %f %s %f %f %f

    %f\n',vars(i),val(i),str,un,relun,unc.pdy(i),weig)endendfunction

    Ed ecco la funzione di input e il driver di esempio:

    function [g, I,M0, x0, r]=exfun_lm_uncert(Ix,Mb, lb,b,M1, r1, r2, h, T0)// pend_nobloc da usare per lm_uncert

    x0=lb-(lb/2-b)-h/2;I=Ix+(Mb.*lb.^2)/12+Mb.*b.^2+(M1/12).*(3*(r1.^2+r2.^2)+h.^2)+M1.*x0.^2;M0=Mb+M1;r=(Mb.*b+M1.*x0)./(M1+Mb);//disp(size(I));disp(size(M0));disp(size(T0));disp(size(r))

  • 7/26/2019 Uso Di Scilab

    49/67

    49

    g=4*%pi.^2.*I./(T0.^2..*M0.*r);

    endfunction

    // driver_exfun_lm_uncert

    arginp='...Ix=[42.1 2.6 0];...Mb=[27.23 0.01 1];...lb=[38.10 0.01 1];...b=[16.50 0.01 1];...M1=[75.51 0.01 1];...r1=[0.79/2 0.01 1];...r2=[2.53/2 0.01 1];...h=[2.025 0.010 1];...T0=[1.1545 0.0002 0];'

    funinp='y=exfun_lm_uncert('funinp='exfun_lm_uncert'

    [unc,yhist,yphist]=lm_uncert(funinp,arginp);

    execstr(arginp);

    [g,I,M0,x0,r]=exfun_lm_uncert(Ix(1),Mb(1),lb(1),b(1),M1(1),r1(1),r2(1),h(1),T0(1))

    Ed ecco I risultati:

    Output value: 977.346230

    mean value: 977.346515

    median: 977.346561

    symmetrical uncertainty: 0.389589

    asymmetrical uncertainties: 0.391204 -0.392572

    relative uncertainty: 0.000399

    Partial uncertainties

    variable value type unc. relunc part.unc. weight

    Ix 42.100000 normal 2.600000 0.061758 0.025056 0.000415

    Mb 27.230000 uniform 0.010000 0.000367 0.008527 0.023757

    lb 38.100000 uniform 0.010000 0.000262 0.085872 0.334757

    b 16.500000 uniform 0.010000 0.000606 0.152624 0.257667M1 75.510000 uniform 0.010000 0.000132 0.003012 0.023272

    r1 0.395000 uniform 0.010000 0.025316 0.000836 0.000034

    r2 1.265000 uniform 0.010000 0.007905 0.002677 0.000347

    h 2.025000 uniform 0.010000 0.004938 0.074504 0.015437

    T0 1.154500 normal 0.000200 0.000173 0.338662 2.000239

  • 7/26/2019 Uso Di Scilab

    50/67

    50

  • 7/26/2019 Uso Di Scilab

    51/67

    51

    Function di servizio

    Altre funzioni usate negli esempi:

    y=polyval(p,x) equivale alla polyval di Matlab, calcola i valori di un polinomiop coefficienti del polinomio (dal grado pi alto)x array dei valori in cui calcolare il polinomio.

    [xx,ii] = sel_absc(x,y) seleziona interattivamente parti di dati; x e y sono i due arraycontenenti i dati per le ascisse e le ordinate.

    polyfit_res_plot(x,y,a,res) usato in congiunzione con gen_lin_fit per graficare I risultati

    i=indexofarr(arr,val) trova lindice di un array di valori pi vicino ad un dato valore.

    m=nfreq(x) calcola la frequenza dei valori nel vettore x; se in x ci sono n diversi valori,eventualmente pi volte ripetuti, la matrice m ha n righe e 2 colonne, nella prima dellequali ci sono i vari valori, nellordine in cui si sono presentati la prima volta, e nellaseconda quante volte ciascun valore presente.

    p=rand_perm(n) produce una permutazione dei primi n numeri naturali.

    xout=invfun(yin,x,y) inverte una funzione monotona crescente.

    dpol=polyder(pol) calcola la derivata di un polinomio

    y=calcpoly(x,pol) calcola i valori di un polinomio (col metodo di Horner)

    Funzioni utili:

    gridon() pone una griglia nella figura corrente; equivalente al grid on di Matlab. holdon() permette di aggiungere dati da plottare in una figura.

    holdoff() non permette di aggiungere dati da plottare in una figura, cancella i precedenti.

  • 7/26/2019 Uso Di Scilab

    52/67

    52

    Esperienze

    Sono qui riportate alcune procedure delluso di Scilab e dellefunzioni sviluppate per questocorso, come ausilio allo svolgimento di alcune prove di laboratorio.

    Per la descrizione delle prove di laboratorio, si fa riferimento alle dispense del corso.

    Molla

    Vediamo come graficare le misure per il caso di T2vs Me L vs M. Innanzitutto vannofatte le misure e messe in un file testo del tipo leggibile con leggi_xyinc.sce, quindi si realizza

    uno script del tipo:// analisi_molla

    [DM,uncDM,DL,uncDL]=leggi_xyinc('DLvsDM.dat');

    plot_unc(DM,uncDM,DL,uncDL);xlabel('Delta M (g)'),ylabel('Delta L (cm)')[a1,covarout1,F1,res1,chiq1,ndof1,err1,errel1] = gen_lin_fit(DM,DL,uncDL,1,1,0)x1=0:max(DM)+20;y1=a1(1)*x1+a1(2);plot(x1,y1,'r')

    [M,uncM,T,uncT]=leggi_xyinc('TvsM.dat');

    plot_unc(M,uncM,T.^2,2*uncT.*T);xlabel('M (g)'),ylabel('T^2 (s^2)')a=get("current_axes");b=a.data_bounds;mpmax=50;limx=-mpmax*1.5;b(1,1)=limx;b(1,2)=0;a.data_bounds=b;[a2,covarout2,F2,res2,chiq2,ndof2,err2,errel2] = gen_lin_fit(M,T.^2,2*uncT.*T,1,1,0)x2=limx:max(M)+20;y2=a2(1)*x2+a2(2);plot(x2,y2,'r')

    ksp=4*%pi^2/a2(1);gsp=ksp*a1(1);

    mpsp=a2(2)/a2(1);

    mprintf('k = %f g = %f mp = %f',ksp,gsp,mpsp)

    Usando i dati di simulati che sono nei file DLvsDM.dateTvsM.dat (con parametri diversi

    da quelli della vera esperienza), troviamo

  • 7/26/2019 Uso Di Scilab

    53/67

    53

    e i valori (senza considerare lincertezza)

    k = 20100.418217 g = 983.762410 m_parass = 39.834967

  • 7/26/2019 Uso Di Scilab

    54/67

    54

    Fluidi

    Nellesperienza dei fluidi si devono identificare i regimi laminare e vorticoso nel moto diacqua in alcuni tubicini.

    Le misure sperimentali sono le misure della massa dellacqua uscita dai tubicini. Da queste siricava laltezza dellacqua nel serbatoio(tubo verticale) e quindi la pressione allingresso deitubicini, la velocit del flusso dellacqua nei tubicini e da questa il Numero di Reynolds.

    Quindi, essendo S la sezione del tubo verticale, h0 il livello iniziale dellacqua,s la sezione deltubicino orizzontale, d la sua lunghezza e avendo preso 1 g/cm3la densit dellacqua,eta=0.009 poise la sua viscosit a 25 e laccelerazione di gravit g=980.35 cm/s2, possiamoprocedere come segue4:

    costanti:porre le costanti S, s, h0, d, eta e g ai valori corretti (in CGS) massa:leggere i dati del file pasco con listruzione [t,m,dt,n]=leggi_pasco(); i

    dati si possono graficare configure;plot(t,m),holdon,plot(t,m,r.),gridon

    pressione:calcolare laltezza del pelo dellacqua come h=h0-m/S;e da questa la

    differenza di pressione tra ingresso e uscita del tubicino come P=h*g;

    velocit:usare derifit per calcolare la derivata di m (avendo fatto un fit del quarto ordine)con data=derifit(t,m,0.05); e quindi calcolare la velocit conv=data.dy/s;. A

    questo punto si pu graficare la velocit in funzione della pressione con figure;

    plot(P,v); numero di Reynolds:il numero di Reynolds si ricava come Re=d*v/eta; e lo si

    pu graficare in funzione della pressione

    possiamo ora scegliere un valore di pressione e calcolare le costanti A e B per ciascuntubicino.

    Se si vogliono fare grafici singoli per pi tubicini, si possono assegnare per ciascun tubicinonomi diversi per le varie misure; per esempio per il primo s1, d1, m1, h1, P1, v1, Re1, per ilsecondo s2, d2, m2, h2, P2, v2, Re2, e cos via.

    4Usiamo il sistema CGS

  • 7/26/2019 Uso Di Scilab

    55/67

    55

    Pendolo fisico

    Volano

  • 7/26/2019 Uso Di Scilab

    56/67

    56

    Uso avanzato

    Per una programmazione avanzata in Scilab si consiglia Programming in Scilab

    di Michael Baudin, che si trova in rete. Qui riportiamo alcuni comandi e spunti per un uso piavanzato di Scilab.

    Alcuni comandi

    [n1,n2]=size(A) pone in n1 il numero di righe e in n2 il numero di colonne della

    matrice A.

    length(A) indica il numero totale di elementi della matrice A.

    gsort(x) ordina (in genere in modo crescente) gli elementi di x, con lalgoritmo quick

    sort.

    evstr(s)valuta il risultato del comando Scilab presente nella stringa s; pu operare su

    array di stringhe.

    execstr(str) esegue i comandi presenti nella stringa str.

    browsevar(), browsehistory(), filebrowser() visualizza le finestre del

    browser (Navigatore) delle variabili, della Cronologia dei comandi e del file browser

    (Esplorazione file); queste finestre sono aperte in default alla partenza di Scilab e sonoagganciate (docked) alla finestra principale.Per eseguire il docking di finestresganciate, in Windows, selezionare col mouse la sbarra col ? della finestra

    sganciata e portarla nella posizione voluta della finestra principale.

    editvar(x) visualizza la finestra delleditor della variabile x; la finestra si apre

    cliccando su una variabile nel Navigatore delle variabili.

  • 7/26/2019 Uso Di Scilab

    57/67

    57

    Ancora sulle funzioni

    Funzioni con argomenti variabili

    Una funzione pu essere definita in modo flessibile, con un numero non fisso di argomenti diinput e/o di output. Allinterno della funzione, il comando [nout,ninp]=argn() pone in nout eninp il numero effettivo di argomenti di uscita e di ingresso. Nella definizione della funzione,ci si avvale delle liste varargin e varargout. Ecco un esempio:

    function varargout=var_io(varargin)[nout,ninp]=argn()mprintf('%d argomenti input, %d argomenti di output \n',ninp,nout)

    for i = 1:ninpk(i)=evstr(varargin(i));varargout(i)=cumsum(k(1:i));

    endendfunction

    Dando il comando [a b c]=var_io(1,2,3) , si ha

    3 argomenti input, 3 argomenti di outputc =

    1.

    3.6.

    b =

    1.3.

    a =

    a(1)

    1.

    a(2)

    2.

    a(3)

    3.

    Gli argomenti in ingresso a una funzione possono essere variabili non solo in numero, maanche in tipo, e si pu far s che esegua procedure diverse a seconda del tipo di un argomento.

  • 7/26/2019 Uso Di Scilab

    58/67

    58

    Funzioni definite dinamicamente

    Talora comodo definire in modo dinamico una funzione, cio definirla da programma. Perquesto si usa il comando deff, come nel seguente esempio:

    // uso_di_deff

    deff('[m1, m2]=minemax(v)',['m1=min(v)';'m2=max(v)'])

    [a1 a2]=minemax([1 -2 3 4.2 9])

    Come si vede, deff ha due stringhe per argomenti, la prima contiene lheader della funzione ela seconda il corpo, che pu essere o una stringa, o un array di stringhe.

    Efficienza

    Quando si devono fare calcoli complessi o comunque lunghi, occorre una programmazioneefficiente. Per ci innanzitutto si devono, per quanto possibile, eseguire i calcoli in formavettorializzata, e non con loop tipo for. Ecco un esempio sulla differenza di velocit tra la

    modalit vettorializzata e tramite un ciclo for:// test_veloc

    N=100000;

    tic()x1=1:N;t1=toc()

    tic()for i = 1:N

    x2(i)=i;endt2=toc()

    mprintf('t1 = %f t2 = %f rapporto = %f\n',t1,t2,t2/t1)

    Il risultato

    t1 = 0.002000 t2 = 25.402000 rapporto = 12701.000000

    cio il calcolo vettorializzato , in questo caso, oltre 10000 pi veloce delluso del for.

  • 7/26/2019 Uso Di Scilab

    59/67

    59

    Notare luso dei comandi tic e toc per far partire e fermare un cronometro e quindi valutarequantitativamente la velocit di esecuzione di un codice. Una valutazione pi completadellefficienza di un codice pu ottenersi tramite il profiling interno di Scilab.

  • 7/26/2019 Uso Di Scilab

    60/67

    60

    GUI

    Luso standard di Scilab prevede linterazione con i programmi tramite il terminale (lafinestra principale di Scilab).

    Scilab offre tuttavia varie funzioni per interagire graficamente con un programma. UnaGraphical User Interface (GUI) rende pi comodo luso di un programma.

    Per esempio, tramite luso di x_mdialog,

    answ = x_mdialog('Parametri di misure ripetute',["Numero misure";"Valore vero";"Errore dilettura";"Errore sistematico (alfa)";"Errore sistematico (beta)";"Errorecasuale";"Trend";"Probabilit disturbi";"Ampiezzadisturbi"],["60";"10";"0.1";"0.2";"0.01";"0.4";"0.0";"0.04";"3"]);

    Nmis = evstr(answ(1));

    valv = evstr(answ(2));errlet = evstr(answ(3));esalf = evstr(answ(4));esbet = evstr(answ(5));errcas = evstr(answ(6));trend = evstr(answ(7));pr_dist = evstr(answ(8));amp_dist = evstr(answ(9));

    si apre una finestra grafica che richiede alcuni parametri, offrendone i valori di default:

    Ci sono vari comandi per usare GUI, per esempio:

    messagebox visualizza un messaggio

    xmatrix permette lediting interattivo di una matrice

    uimenu crea un menu per una figura

  • 7/26/2019 Uso Di Scilab

    61/67

    61

    rubberbox permette di selezionare parte di un grafico

    uigetfile permette di scegliere interattivamente un file

    uigetcolor permette di scegliere interattivamente un colore

    Esiste anche un pacchetto esterno, guibuilder, gestito tramite ATOMS, il sistema di

    packaging di Scilab, per la costruzione di complesse interfacce grafiche. Per usarlo, vainstallato, partendo dal gestore di moduli ATOMS a cui si accede dal menu delle Applicazionidi Scilab (una volta installato, va fatto ripartire Scilab). Una volta fatto partire, compaiono duefinestre, una di comando e una su cui si costruir la nuova GUI:

  • 7/26/2019 Uso Di Scilab

    62/67

    62

    Strutture, list, mlist, cell array, etc.

    In Scilab ci sono molti differenti tipi di dati. Eccone una lista:

    I comandi type e typeof operanti su una variabile, indicano il tipo di appartenenza.

    In particolare, in Scilab sono disponibili diverse data structures (raccolte organizzate didati): le matrici (e le ipermatrici che sono simili, ma hanno pi di due dimensioni, che sarannoobsolete come tipo diverso dalle matrici prossimamente), le liste (list), le tlist (o typed list), lemlist (o matrix-oriented list), le strutture (simili a quelle del C) e i cell array. Ecco una tabellache riporta le principali propriet delle data structures di Scilab:

  • 7/26/2019 Uso Di Scilab

    63/67

    63

  • 7/26/2019 Uso Di Scilab

    64/67

    64

    Appendici

    Consigli pratici

    importante strutturare in modo comodo per le proprie necessit la cartella di lavoro base

    Per esempio, per Windows, usando la cartella Scilab creata automaticamente in Documenti,copiarci le cartelle e i file contenuti in Per_LM_Scilab.zip (cartella LM) e aggiungere una o picartelle di lavoro personali. Evitare quindi di mettere o modificare file nella cartella LM esottocartelle, in modo da fare confusione, soprattutto per le modifiche future che potrebberoesserci nei file di LM (creati per questo corso).

    poi conveniente costruire librerie delle funzioni normalmente usate con, per esempio:

    genlib('baselib','C:\Users\SergioF\Documents\Scilab\LM\base\')

    e quindi creare un file di startup in SCIHOME/scilab.ini , dove SCIHOME una cartella chedipende dal sistema e che pu essere identificata dando il comando SCIHOME da Scilab. Nelfile scilab.ini vanno messi i comandi che si vuole siano eseguiti automaticamente allaperturadi Scilab. Per esempio scilab.ini pu contenere

    cd C:\Users\SergioF\Documents\Scilab

    baselib=lib('C:\Users\SergioF\Documents\Scilab\LM\base')

    simlib=lib('C:\Users\SergioF\Documents\Scilab\LM\sim')

    che automaticamente apre Scilab nella cartella di lavoro voluta e carica le librerie.

  • 7/26/2019 Uso Di Scilab

    65/67

    65

    Differenze con Matlab

    Lo sviluppo di Scilab dichiaratamente ispirato a Matlab. Tuttavia ci sono parecchiedifferenze dal modello, alcune delle quali essenziali.

    Una differenza particolarmente notevole che lambiente interno di una funzione vede levariabili definite esternamente ad essa.

    NellHelp di Scilab, allargomento Matlab to Scilab Conversion Tips si trovano tutti i dettaglidelle differenze nelle varie funzioni. Qui diamo alcuni esempi:

    Matlab Scilab Note

    exist mtlb_exist

    eval evstrfopen mopenfgetl mgetlfscanf mtlb_fscanffclose mclosesscanf msscanf diversastrrep strsubstreshape matrixgrid on set(gca(),"grid",[1 1])hold on set(gca(),"auto_clear","off")

    nargin argn(2)str_out=str_in(v) str_out=part(str_in, v) Per le stringheinputdlg x_dialog o x_mdialogmsgbox messageboxFprintf,sprintf mfprintf,mprintf,msprintf

    C una funzione di Scilab, mfile2sci, che traduce un m-file di Matlab in una funzione (o in unoscript) di Scilab.

  • 7/26/2019 Uso Di Scilab

    66/67

    66

    Esercizi

    1. Realizzare una function in grado di leggere dati da un file contenente nella prima rigalincertezza comune per tutti i dati, e nelle altre i dati stessi, uno per ogni riga.

  • 7/26/2019 Uso Di Scilab

    67/67

    Altri utili documenti

    Due utili documenti sono introscilab.pdfeScilab_beginners.pdf, che possono scaricarsi da

    http://www.scilab.org/resources/documentation/tutorials

    Manuali in Italiano:

    http://www.docente.unicas.it/gianluca_antonelli/scilab

    http://www.dii.unisi.it/~giannibi/teaching/materiale/psc/dispensascilab.pdf

    Manuali in Inglese:

    http://forge.scilab.org/index.php/p/docintrotoscilab/downloads/ http://forge.scilab.org/index.php/p/docprogscilab/downloads/

    Altro:

    http://wiki.scilab.org/Tutorials

    Help onlinehttp://help.scilab.org/docs/5.4.0/en_US/index.html

    Scilab da Matlabhttp://wiki.scilab.org/Tutorials?action=AttachFile&do=get&target=Scilab4Matlab.pdf

    http://www.scilab.org/resources/documentation/tutorialshttp://www.scilab.org/resources/documentation/tutorialshttp://www.docente.unicas.it/gianluca_antonelli/scilabhttp://www.docente.unicas.it/gianluca_antonelli/scilabhttp://www.dii.unisi.it/~giannibi/teaching/materiale/psc/dispensascilab.pdfhttp://www.dii.unisi.it/~giannibi/teaching/materiale/psc/dispensascilab.pdfhttp://forge.scilab.org/index.php/p/docintrotoscilab/downloads/http://forge.scilab.org/index.php/p/docintrotoscilab/downloads/http://forge.scilab.org/index.php/p/docprogscilab/downloads/http://forge.scilab.org/index.php/p/docprogscilab/downloads/http://wiki.scilab.org/Tutorialshttp://wiki.scilab.org/Tutorialshttp://help.scilab.org/docs/5.4.0/en_US/index.htmlhttp://help.scilab.org/docs/5.4.0/en_US/index.htmlhttp://help.scilab.org/docs/5.4.0/en_US/index.htmlhttp://wiki.scilab.org/Tutorials?action=AttachFile&do=get&target=Scilab4Matlab.pdfhttp://wiki.scilab.org/Tutorials?action=AttachFile&do=get&target=Scilab4Matlab.pdfhttp://wiki.scilab.org/Tutorials?action=AttachFile&do=get&target=Scilab4Matlab.pdfhttp://help.scilab.org/docs/5.4.0/en_US/index.htmlhttp://wiki.scilab.org/Tutorialshttp://forge.scilab.org/index.php/p/docprogscilab/downloads/http://forge.scilab.org/index.php/p/docintrotoscilab/downloads/http://www.dii.unisi.it/~giannibi/teaching/materiale/psc/dispensascilab.pdfhttp://www.docente.unicas.it/gianluca_antonelli/scilabhttp://www.scilab.org/resources/documentation/tutorials