Corso di ingegneria CEA (Prof. Carfagni)
Riassunto teoria di Matlab e svolgimento compiti vecchi
Indice
- Teoria
- Inizio - Pag. 2
- Variabili, vettori e matrici - Pag. 3
- Input e output - Pag. 4
- If - Pag. 5
- For e while - Pag. 6
- Grafica - Pag. 8
- Operatori aritmetici, di confronto e logici - Pag. 11
- Esempi comuni - Pag. 11
- Svolgimento compiti precedenti
- Compito 08/09/17 - Pag. 16
- Compito 15/09/17 - Pag. 20
- Compito 23/01/18 - Pag. 24
- Consigli - Pag. 29
- Soluzioni esercitazioni - Pag. 34
Inizio
Per iniziare a scrivere un programma dobbiamo cliccare sul tasto “New Script” in alto a sinistra. Una volta fatto questo comparirà nella parte centrale una nuova finestra chiamata “Editor” e una scheda con un nome simile a “untitled”; qui è dove dobbiamo scrivere l’algoritmo del nostro programma. Prima di iniziare la stesura del programma conviene salvarlo dandogli già un nome; clicchiamo quindi sul pulsante “Save” (che si trova vicino al pulsante usato prima “New script”). Si aprirà una finestra dalla quale dovremo scegliere il nome e la destinazione nella quale salvare il nostro file di Matlab (questi file hanno l’estensione .m). Una volta scelto tutto, basterà premere il pulsante salva e avremo salvato il nostro programma. È consigliabile ripremere il pulsante Save spesso per non rischiare di perdere il nostro lavoro anche perché dopo aver salvato il programma una prima volta, basterà cliccare il pulsante Save e questa volta non vi verrà chiesto nulla, il programma si salverà istantaneamente. Possiamo anche notare che il titolo della scheda che prima era “untitled” ora avrà il nome da voi scelto.
Una volta scritto il programma oppure una sua parte, per provare ad eseguirlo dobbiamo premere il pulsante “Run” o il tasto “F5” della nostra tastiera (in alcuni portatili per premere il tasto F5 bisogna tenere premuto contemporaneamente anche il tasto “Fn” che di solito si trova vicino a ctrl). Se avevamo salvato correttamente il file, il programma verrà eseguito e darà i propri risultati oppure ci riporterà gli errori.
Variabili, vettori e matrici
Variabili: sono indicate da lettere o parole e si usano per memorizzare un singolo valore. Es: a, i, somma, ecc. (nota: nel nome delle variabili è molto importante stare attenti al maiuscolo: a e A sono 2 variabili distinte).
Vettori: sono variabili che contengono più valori. Graficamente si possono vedere come delle caselle allineate. La lunghezza del vettore è il numero di caselle che possiede. Per richiamare il valore contenuto in una singola casella si usa la seguente notazione: nome_vettore(i) dove i è il numero della casella che cerchiamo. Es: V(2) è 9, V(3) è 3.
Matrici: si possono vedere come variabili che contengono una griglia di valori o come vettori di vettori, ovvero un vettore verticale che contiene un vettore orizzontale all’interno di ogni sua casella (i vettori orizzontali devono avere la stessa lunghezza ma possono anche non avere la solita lunghezza di quello verticale: in questo caso la matrice sarebbe una matrice rettangolare). Per richiamare il valore contenuto in una singola casella si usa la seguente notazione: nome_matrice(i,j) dove i è il numero della riga della casella che cerchiamo mentre j è il numero della colonna. Es: A(1,1) è 2, A(3,2) è 31.
Per creare una nuova variabile nel nostro programma che contenga un valore preciso a nostra scelta basta scrivere: nome_variabile = valore_scelto. Es: a=3, somma=0.
Per creare un nuovo vettore che contenga valori scelti da noi basta scrivere: nome_vettore = [valore_prima_casella, valore_seconda_casella, …]. Es: V=[6,9,3].
Per creare una nuova matrice che contenga valori scelti da noi basta scrivere: nome_matrice = [valori_prima_riga_separati_da_virgola; valori_seconda_riga_separati_da_virgola]. Es: A=[2,5,11;4,21,6;9,31,6].
I metodi descritti sopra per creare vettori e matrici non vengono quasi mai utilizzati. Quasi sempre siamo interessati a creare vettori o matrici in cui le caselle contengano particolari valori: nome_matrice = zeros(n,m) con questo comando possiamo generare matrici n x m che contengono 0 all’interno di ogni casella, matrici “vuote”. Es: A=Zeros(3,2).
nome_matrice = ones(n,m) con questo comando possiamo generare matrici n x m che contengono 1 all’interno di ogni casella. Es: A=Ones(4,7).
nome_matrice = rand(n,m) con questo comando possiamo generare matrici n x m che contengono numeri casuali compresi fra 0 e 1 (1 escluso) all’interno di ogni casella. Es: A=rand(3,2). Questo comando viene utilizzato in quasi tutti i programmi anche per generare numeri casuali. Infatti questo come tutti i comandi sopra descritti valgono anche per generare variabili e vettori: questi non sono altro che matrici 1 x 1 o matrici 1 x n.
Nei compiti viene sempre chiesto di generare numeri casuali compresi in un certo intervallo [a,b]. Per farlo basta utilizzare questa notazione: nome_matrice = rand(n,m)*(b-a)+a. Con questo comando possiamo generare numeri reali compresi nell’intervallo [a,b]. Se ci interessano solamente i numeri interi possiamo usare il comando fix che tronca i numeri decimali alla loro prima cifra: nome_matrice = fix(rand(n,m)*(b-a+1)+a). Attenzione: Con il fix va aggiunto anche un +1 dentro alla parentesi!
Un altro metodo usato per creare vettori particolari (vettori incrementali), è questo: nome_vettore = a:passo:b. In questo caso possiamo generare dei vettori composti dai valori di una serie compresa fra a e b. Il passo indica l’incremento da un valore ad un altro e se viene omesso è 1. Es: V=1:5 è uguale al vettore [1,2,3,4,5] W=2:2:10 è uguale al vettore [2,4,6,8,10]. Nota: Se vogliamo una serie decrescente, dobbiamo mettere il passo negativo. Es: V=10:-1:5 genera il vettore [10,9,8,7,6,5].
Il comando sum() restituisce il valore della somma di tutti i valori di un vettore. Se usiamo questo comando su una matrice dobbiamo scrivere invece sum(sum(nome_matrice)), poiché con un solo sum creerebbe un vettore le cui caselle conterrebbero le somme di ogni vettore colonna della matrice. Es: sum(V) è uguale a V(1)+V(2)+V(3). sum(sum(A)) è uguale a A(1,1)+A(2,1)+A(3,1)+A(1,2)+A(2,2)+A(3,2)+A(1,3)+A(2,3)+A(3,3). Invece sum(A) corrisponde al vettore [A(1,1)+A(2,1)+A(3,1), A(1,2)+A(2,2)+A(3,2), A(1,3)+A(2,3)+A(3,3)].
Il comando prod() restituisce il valore della moltiplicazione di tutti i valori di un vettore. Se usiamo questo comando su una matrice dobbiamo scrivere invece prod(prod(nome_matrice)). Es: prodotto=prod(V) è uguale a prodotto=V(1)*V(2)*V(3).
Il comando round() approssima i valori di una matrice all’intero più vicino (comando inutile se non specificatamente richiesto visto che di solito si usa fix).
Il comando sort() serve per ordinare in ordine crescente i valori di una matrice. Es: sort(V) fa diventare V=[3,6,9].
Clear (o clearvars) è un comando che va scritto all’inizio di ogni programma e serve a eliminare tutte le variabili, vettori e matrici rimasti in memoria da un programma precedente (non ti fare troppe domande, scrivilo sempre nella prima riga del tuo programma).
Input e output
Quello che scriviamo nel nostro programma è un codice che viene letto solamente da noi che lo compiliamo ma che non appare all’utilizzatore una volta salvato il programma. Quindi per quanto funzionale sia il nostro programma dobbiamo preoccuparci pure dell’aspetto “grafico” dello stesso.
disp è un comando utilizzato per “parlare” all’utilizzatore. Attraverso di esso possiamo comunicare una frase o un risultato/valore di una variabile. Questo comando compare in ogni programma almeno una volta, altrimenti lo schermo dell’utilizzatore sarebbe vuoto. Se vogliamo mostrare il valore di una variabile dobbiamo scrivere disp(nome_variabile). Se invece ci interessa scrivere una frase dobbiamo scrivere il testo fra gli apostrofi (non le virgolette!!): disp('testo').
Come si può vedere dall’immagine precedente, se noi scriviamo del testo su Matlab preceduto da un % questo diventerà verde: questo perché è la notazione per scrivere un commento. I commenti sono delle linee di testo che non vengono lette dal programma e non compaiono nemmeno nello schermo dell’utilizzatore. Sono come degli appunti dello sviluppatore per ricordarsi per esempio del perché ha creato una variabile o della sua funzione all’interno del programma. Si possono scrivere anche sulla stessa linea di un comando del programma, l’importante sta nel scriverlo a destra del comando. Si possono usare anche durante il compito per spiegare meglio dei passaggi del nostro programma al professore se possono sembrare senza senso.
Un altro comando che viene richiesto in alcuni programmi è input. Finora abbiamo dichiarato variabili con valori casuali o scelti da noi, ma a volte può capitare che sia l’utilizzatore a dover scegliere ed inserire il valore di una variabile, per esempio in un programma in cui serve sapere l’età dell’utilizzatore. Per fare ciò ci viene incontro questo comando: testo = input(" "), che assegna ad una variabile il valore inserito da tastiera dall’utilizzatore. Es: età=input("Quanti anni hai?") sullo schermo dell’utilizzatore apparirà la frase “Quanti anni hai?” e il programma si bloccherà in quel punto finché l’utilizzatore non scriverà la sua età e premerà invio.
Trucchetto che può aiutare (se capito, se no meglio ignorarlo). Quando proveremo un programma premendo sul tasto Run di Matlab, la finestra in basso “Command Window” può essere usata per capire cosa compare nello schermo dell’utilizzatore. Attenzione, questa cosa non è sempre vera e può trarre in inganno. Infatti la Command Window simulerà lo schermo dell’utilizzatore solo se nel nostro programma ogni volta che dichiariamo una variabile, vettore, matrice o quando facciamo un'operazione con alcune di esse (Es: a=b+c) metteremo il punto e virgola ; alla fine di ognuno di questi comandi. Infatti quando noi eseguiamo il nostro programma, nella command window appariranno anche i valori delle variabili o delle matrici quando le generiamo e ogni volta che ne modifichiamo il loro valore (per esempio in corrispondenza del comando A=rand(2,3) appariranno i valori casuali assunti dalla matrice A); se noi invece mettiamo un punto e virgola alla fine nel command window queste informazioni non appariranno, ma il comando in realtà è stato eseguito lo stesso, proprio come succederebbe nello schermo dell’utilizzatore. Può essere difficile da capire alla fine di quali comandi si può mettere o no il punto e virgola, ma in generale la regola è che si può mettere ovunque tranne dopo i comandi if, else, elseif, for, while, end, come vedremo più avanti. Mettere sempre i punti e virgola alla fine dei giusti comandi comporterà anche una command window più pulita, più leggibile e sarà anche più facile trovare gli errori che ci segnala Matlab. Se non capite alla fine di quali righe inserire il punto e virgola, leggetevi il terzo consiglio della sezione Consigli!!
Istruzione di controllo if
L’if e l’else, sono due comandi centrali della programmazione; si traducono in italiano in se e altrimenti e si usano per verificare delle condizioni.
if condizione
blocco_istruzioni_1;
else
blocco_istruzioni_2;
end
Nel blocco_istruzioni_1 dobbiamo scrivere tutto ciò che deve essere eseguito dal programma se la condizione è vera. Analogamente, nel blocco_istruzioni_2 dobbiamo scrivere i comandi che devono essere eseguiti se la condizione risulta falsa. Con blocco_istruzioni_1 si intendono tutti quei comandi scritti fra l’if e l’else, mentre tutti quelli compresi fra l’else e l’end faranno parte del blocco_istruzioni_2.
Es: if i <= 10 & i >= 2 somma=somma+i; i=i+1; else disp(somma); end Il programma in questo esempio (incompleto) si chiede se i è compreso fra 2 e 10. Se questa condizione è vera, aggiungerà il valore di i alla variabile somma e poi incrementerà di 1 il valore di i. Altrimenti, se il valore di i non è compreso fra 2 e 10, mostrerà a schermo il valore della variabile somma.
Il comando if può essere usato anche in altri due modi:
-
Senza l’uso dell’else:
if condizione
blocco_istruzioni;
endIn questo caso il programma svolgerà i comandi del blocco_istruzioni se la condizione è vera, altrimenti non farà nulla.
Es: if i < 10 i=i+1; end Se i è minore di 10, incrementerà il valore della i di 1, altrimenti non farà nulla.
-
Con più condizioni:
if condizione 1
blocco_istruzioni_1;
elseif condizione 2
blocco_istruzioni_2;
else
blocco_istruzioni_else;
endIn questo caso il programma pone più condizioni ed eseguirà il blocco istruzioni corrispondente alla condizione vera. Se nessuna delle condizioni risultasse vera, il programma eseguirà il blocco istruzioni dell’else. Nota: si possono inserire altri elseif a piacimento con le corrispondenti condizioni e blocco istruzioni, l’importante è che si trovino dopo il blocco istruzioni dell’if e prima dell’else. Nota: Si possono scrivere anche programmi con elseif e senza else alla fine (ovvero l’unione dei casi sopra descritti).
Cicli for e while
I comandi for e while si usano per creare dei cicli. Un ciclo si usa per ripetere dei comandi molto simili un certo numero di volte. Possiamo subito dire che il ciclo for è caso particolare del ciclo while, quindi si potrebbe pensare di imparare solo quest’ultimo e poter risolvere tutti i problemi senza conoscere il ciclo for. In realtà si tende a fare il ragionamento contrario: si cerca di usare il più possibile il ciclo for perché è più facile e corto da scrivere al contrario del ciclo while che molte volte è la causa di malfunzionamenti del programma.
- Ciclo for:
for nome_indice = valore_iniziale : passo : valore_finale
blocco_istruzioni;
end
Dove con indice si intende una variabile solitamente chiamata con le lettere i, j o k che ha la funzione di contatore dei “giri” del ciclo. Il nostro indice scorrerà dal valore_iniziale fino al valore finale incrementandosi sempre del passo, come abbiamo visto nei vettori. Il ragionamento che segue il programma è il seguente:
- Entro nel ciclo.
- Fisso il valore dell’indice uguale al valore_iniziale
- Eseguo il blocco_istruzioni (ovvero tutti i comandi che ci sono fra il for e l’end).
-
Controllo che l’indice sia minore o uguale al valore_finale.
- Se lo è, incremento l’indice del valore del passo (il passo può essere omesso e se lo si omette viene considerato 1) e torno al punto 3.
- Altrimenti, esco dal ciclo ed eseguo il resto del programma sotto l’end.
Attenzione: nonostante la notazione sia la stessa di quella usata per creare i vettori incrementali, gli indici sono delle variabili e di conseguenza contengono un singolo valore alla volta; semplicemente durante il ciclo l’indice assumerà ad ogni giro il valore successivo della serie.
Es: somma=0; n=10; V=rand(1,n)*10; for i=1:n somma=somma+V(i); end disp('La somma del vettore è:'); disp(somma); L’algoritmo di questo esempio si occupa di sommare gli elementi di un vettore di lunghezza n=10 riempito di numeri casuali compresi fra 0 e 10. Quando il programma entra nel ciclo for, ad ogni giro aggiunge alla variabile somma il valore della casella del vettore V in posizione i, ovvero al primo giro leggerà la prima casella, al secondo giro la seconda casella,… fino all’ultima casella. Eseguito l’ultimo giro, il programma continuerà con le istruzioni che seguono l’end, ovvero mostrerà a schermo la somma ottenuta.
- Ciclo while:
nome_indice = valore_iniziale;
while condizione
blocco_istruzioni;
end
Puntualizziamo 3 cose che sono gli errori più frequenti:
- È importante ricordarsi sempre di mettere l’indice uguale al valore iniziale prima di entrare nel ciclo while.
- Nella condizione possono in realtà comparire più condizioni collegate dagli operatori logici, ma deve quasi sempre essercene una legata all’indice altrimenti il ciclo o non partirà proprio o potrebbe durare all’infinito. Con condizione legata all’indice intendo per esempio: nome_indice <= valore_finale (la più comune).
- Nel blocco_istruzioni deve sempre comparire da qualche parte l’incremento dell’indice, ovvero: nome_indice = nome_indice + passo;
Queste tre regole vanno sempre tenute a mente altrimenti il ciclo while molto probabilmente non funzionerà correttamente. Detto ciò il ragionamento che fa il ciclo while è il seguente:
- Fisso il valore iniziale dell’indice (prima regola).
- Verifico la condizione:
- se è vera, eseguo tutti i comandi del blocco istruzioni, alla fine torno alla riga del while e ricomincio dal punto 2).
- se è falsa, esco dal ciclo ed eseguo i comandi sotto l’end.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
-
Formulario MATLAB
-
Manualetto Matlab
-
Appunti sui comandi Matlab
-
Laboratori Matlab - Informatica medica