====== Matlab/Octave ====== [[wp>Matlab]] è un programma matematico di calcolo numerico, con un linguaggio di programmazione proprietario. Marlab e' sviluppato e commercializzato da [[wp> MathWorks]]. [[wp>GNU_Octave]] e' un tool per il calcolo numerico con un interprete compatibile con il linguaggio Matlab. Octave e' parte del progetto open source [[wp>GNU]]. Documentazione in rete: * [[http://www.gnu.org/software/octave/doc/interpreter/index.html | Octave Reference]] * [[http://www.df.unipi.it/~ferrante/Tecnologie_fisiche/matlab.pdf | Manuale Matlab ]] * [[http://en.wikibooks.org/wiki/MATLAB_Programming/Differences_between_Octave_and_MATLAB | Compatibilita' Octave /Matlab]] * [[http://www.fis.unipr.it/home/roberto.alfieri/didattica/matdid/prog/octave/tutorial/| Altri manuali di Octave e Matlab ]] Installazione: L'Università di Parma ha acquistato la licenza TAH (Total Academic Headcount) di MathWorks, che consente l'installazione di Matlab (inclusi Simulink e una cinquantina circa di toolbox aggiuntivi) per personale e studenti dell'Ateneo. La licenza e' per il solo uso didattico. [[ https://si.unipr.it/sites/default/files/2018-11/Avviorapido-licenza-TotalAcademicHeadcount-UtenteFinale.pdf | Avvio rapido ]] - {{ https://si.unipr.it/pagina-base/matlab-luniversita-di-parma | Installazione di Matlab per studenti UniPR}} [[ https://www.gnu.org/software/octave/download.html | Octave download]] - [[ https://octave.sourceforge.io/packages.php | Packages]] ===== Guida Rapida ===== Esistono 2 modalita' di interazione: * Command line: una sola finestra con l'interprete per l'esecuzione dei comandi * Tramite IDE (Integrated Development Environment). Diverse finestre, tra cui l'interprete dei comandi, un editor, una finstra per esplorare il file-system e una per visualizzare le variabili nel Workspace. Nelle aule informatiche dell'Ateneo Octave parte in modalita' command-line, mentre Matlab in modalita' IDE. ==== Ambiente di Lavoro ==== Matlab utilizza un Workspace che contiene le variabili utilizzate. Vedi [[https://it.mathworks.com/help/matlab/workspace.html | Workspace]] % Esercizi: % Il carattere e % serve per i commenti. In Octave si puo' usare anche il carattere # c=3 # I numeri sono rappresentati unicamente in Floating Point a 64 bit (8 byte) c # Mostra il contenuto della variabile c whos c # visualizza i dettagli della variabile c nel workspace d=4; # il ; sopprime il modo "verboso" s='stringa' # Nelle stringhe i caratteri sono rappresentati in ASCII who # visualizza il contenuto del workspace help who # help mostra sintassi e opzioni di un comando whos # mostra maggiori dettagli del Workspace clear # svuota il Workspace MATLAB/Octave interagisce con il file-system per caricare programmi e dati, e per salvare i risultati. Vedi [[ https://it.mathworks.com/help/matlab/files-and-folders.html | File e cartelle]] # Esercizi: pwd # mostra la directory (cartella) corrente ls # lista il contenuto di una directory ls -l # ls con piu' dettagli (solo Octave) cd newdir # entra nella sottodir newdir cd .. # entra nella dir genitore cd # torna alla cartella home cd z: # cambia disco di lavoro in Z: (in ambiente windows) mkdir newdir # crea la directory newdir history # visulizza la storia dei comandi eseguiti (solo Octave) diary on # attiva il salvataggio della sessione di comandi diary nomefile.txt # Scrive in nomefile.txt tutti i comandi eseguiti type filename.m # visualizza il contenuto save filename.dat # Salva il Workspace load filename.dat # Carica il WS save -ascii file.dat c # Salva in formato ascii la variabile c ==== Matrici ==== Vedi [[https://it.mathworks.com/help/matlab/learn_matlab/matrices-and-arrays.html | matrices and arrays]] A=[3 5; 7 9] # Crea una matrice 2x2 A1=[1:10] #Array da 1 a 10 con incremento 1 A2=[-3.14:0.2:3.14] # Array da -3.14 a 3.14 con incremento 0.2 A=[1:2:5;7:9;10 20 30] # Crea una matrice 3x3 c=A(2,1) # Scrive in c l'elemento (2,1) della matrice A B=A’ #Scrive in B la trasposta della matrice A C=A*B #Prodotto matriciale A.*B #Prodotto scalare S=sum(A) #Calcola il vettore delle somme colonna per colonna size(A) #Determina il vettore [num_righe num_colonne] rows(A) #Determina il numero di righe (solo Octave) columns(A) #Determina il numero di colonne (solo Octave) length(A) #Dimensione massima della matrice r=8 c=4 zeros(r,c) #Matrice rxc di 0 ones(r,c) #Matrice rxc di 1 eye(n) #Matrice identita' nxn B=inv(A) #Inversa di A ( A*B = matrice Identita') rand(r,c) #Matrice rxc di numeri casuali tra 0 e 1 ==== Rappresentazione grafica ==== Vedi [[https://it.mathworks.com/help/matlab/ref/plot.html | plot]] X=[-3.14:0.1:+3.14]; Y=sin(X) plot(Y) #Grafica gli elementi del vettore Y plot(X,Y) #Grafica del vettore Y con ascissa in X bar(Y) #Grafico a barre title(‘titolo') #Scrive il titolo nel grafico xlabel ('this is xlabel') ylabel ("this is ylabel") grid on #Inserisce la griglia nel grafico hold on # Mantieni il disegno corrente nel grafico (per plot sovrapposti) hold off # Disattiva la funzione hold-on print('plot_matlab.png','-dpng'); # stampa su file il plot in formato png (MATLAB) print('plot_matlab.pdf','-dpdf'); # stampa su file il plot in formato pdf (MATLAB) print plot_matlab.png -dpng'; # stampa su file il plot in formato png (OCTAVE) print plot_matlab.pdf -dpdf'; # stampa su file il plot in formato pdf (OCTAVE) ==== Distribuzione normale ==== [[ https://it.wikipedia.org/wiki/Distribuzione_normale | Distribuzione Normale ]] (wp) c=2 r=10 RN=randn(r,c) #Matrice rxc di casuali con distribuzione normale (mean=0, std=1) m=mean(RN) #Valor medio di ogni colonna di X s=std(RN) #Deviazione standard di ogni colonna X std(RN(:,2)) #Std della seconda colonna # X=[-3.14:0.1:3.14] Y=normpdf(X,m,s) #Densita' di prob. per ogni elemento di X, con mean=m e std=s plot(X,Y) # X=randn(1,200)*10+5 ; # Crea un vettore di 200 numeri random con distribuzione normale, con valor medio=5 e std=10 hist(X,10); # Suddivide l'intervallo del vettore in 10 intervalli, calcola e disegna le frequenze ==== Distribuzione di Poisson ==== [[ https://it.wikipedia.org/wiki/Distribuzione_di_Poisson | Distribuzione_di_Poisson]] (wp) # Esercizi: P=poissrnd(1.5,[1,100]) # genera di 100 numeri random in distribuzione di Poisson con Lambda=1.5 mean(P) # calcola il valor medio bar(P) # genera un plot a barre con la distribuzione dei 100 numeri hist(P) # genera un plot a barre con 10 classi di frequenza hist(P,4) # genera un plot a barre con 4 classi di frequenza [d,n]=hist(P,6) # scrive in dati e n i valori dei dati (d) e le relative classi (n) bar(n,d) # plot a barre con dati e frequenze x=[0:10] y = poisspdf(x,1.5); # determina la densità di probabilità per i valori in x con Lambda=1.5 bar(x,y) ====Logica e relazioni==== Operatori relazionali: > < >= <= == ~= Il risultato e' vero (1) o falso (0). Esempi: 5>7 # risultato: 0 [ 3 5 2 ] >= [ 1 0 12 ] # risultato: 1 1 0 'Tom' == 'Bob' # risultato: 0 1 0 Operatori logici: and & or | xor not ~ Esempi: (0|1)&(1|0) # valuta l'espressione binaria e ritorna il risultato booleano (eta>=25) & (eta<=30) # eta tra 25 e 30 anni Altri operatori logici: any(X) # almeno un elemento del vettore e' vero (diverso da 0) Esempio: any ( [0 7 0] ) risultato 1 (vero) all(X) # tutti gli elementi del vettore veri (diversi da 0) Esempio: all ( [0 7 0] ) risultato 0 (falso) Funzioni di trasformazione: hex2dec('FF') # trasforma in numero decimale una stringa esadecimale dec2hex(1023) # trasforma un numero decimale in una stringa esadecimale dec2bin(1023) # trasforma un numero decimale in una stringa binaria bitshift(3,2) # applica uno shift a sinistra di 2 bit di 3 ====Input/output ==== n=input('inserisci un numero: ') # legge un numero da tastiera e scrive nella variabile s=input('inserisci una stringa: ','s') # legge una stringa da tastiera e scrive nella variabile disp('Riultato'); # scrive sullo schermo una stringa o un variabile disp(['Risultato',num2str(n)]); # concatena diversi valori ====stringhe==== c='ciao' #Le stringhe si scrivono tra singoli apici s='l''albero' # Caratteri speciali s="stringa" # Solo Octave s=num2str(n) #Conversione da numero a stringa n=str2num(s) #Conversione da stringa a numero z=[c,'mondo'] #Concatena 2 (o piu') stringhe ====Script==== Matlab/Octave consente di memorizzare una sequenza di istruzioni in un file; questo, per essere accessibile, deve avere l'estensione ".m"e pertanto si chiama M-file. Se al prompt si digita il nome del file si ottiene lo stesso risultato che si sarebbe ottenuto scrivendo uno ad uno i comandi elencati nel file. Gli M-file possono essere di due tipi: script o function. ==Esempio di script== **data_gen.m** Genera un vettore di dati con distribuzione normale e lo scrive in ASCII nel file data.txt m=input('inserisci valor medio: '); s=input('inserisci deviazione standard: '); n=input('inserisci numero di elementi: '); D=randn(n,1)*s+m save -ascii data.txt D Calcola la media dei voti. File **voti.m** : nvoti = 0; somma = 0; voto = input('voto? (0 per finire)'); while voto ~= 0 somma = somma + voto; nvoti = nvoti + 1; voto = input('voto? (0 per finire)'); end media = somma/nvoti; disp (media) data_analysis.m Analisi e plot dei dati clear; load data.txt mn = min(data); mx = max(data); n = length(data); % determina il numero di misure m = mean(data); % determina il valore medio s = std(data); % determina la deviazione standard %hist(data); title('data plot'); xlabel('xlabel'); ylabel('ylabel'); [d,c]=hist(data,10) % scrive i valori dei dati (d) e le relative classi (c) bar(c,d) str = []; str = [str,'m=', num2str(m), char(10) ]; str = [str,'s=', num2str(s)]; annotation('textbox',[.7 .7 .0 .0],'String',str,'FitBoxToText','on'); % funziona con Matlab print('data_plot.png','-dpng'); ==Esempio di Funzione == gauss.m Data una distribuzione gaussiana con valore medio "media" e deviazione standard "sigma", determina la densita' di probabilita' di un array X. function F=gauss(X, media,sigma) F=exp(-((X-media).*(X-media))/(2.0*sigma*sigma)); F=F/sqrt(2*pi*sigma*sigma); return ==Esempio di script == gaussian.m Grafica la funzione distribuzione normale utilizzando la funzione "gauss()" %Grafica la funzione distribuzione normale (Gauss) m=2; s=1; X=m-3*s:1/100:m+3*s; Y=normpdf(X,m,s); %Y=gauss(X,m,s); plot(X,Y); xlabel('X'); ylabel('Densita'' di probabilita'''); title('Distribuzione Normale'); grid on; print('gauss.png','-dpng') ==== Programmazione ==== MatLab/Octave può essere considerato un linguaggio di programmazione alla stregua del Fortran o del C. L’esistenza di strutture sintattiche tradizionali e l’uso appropriato di funzioni intrinseche consentono di codificare in modo semplice e flessibile algoritmi semplici e più complessi. Ci sono cinque strutture di controllo di flusso: * if statements * switch statements * for loops * while loops * break statements == esempio_if.m == a = 3; if a > 0 disp(['maggiore di zero ',num2str(a)]); else disp(['minore di zero ',num2str(a)]); end == esempio_for.m == for i=1:8 disp(['numero: ',num2str(i)]); end == esempio_while.m == nvoti = 0; somma = 0;   voto = input('voto? (0 per finire)');   while voto ~= 0         somma = somma + voto;         nvoti = nvoti + 1;         voto = input('voto? (0 per finire)');    end    media = somma/nvoti;    disp (media) [[http://didattica-linux.unipr.it/home/alfieri/matdid/LABI/octave/ | altri esercizi ]] (occorre la VPN)