Sei sulla pagina 1di 81

Piccola guida Matlab

Funzioni di base e di utilizzo rapido

Piccola guida Matlab Funzioni di base e di utilizzo rapido Ing. Antonio Pellegrino 1

Ing. Antonio Pellegrino

Utilizzo di Matlab come calcolatrice

L’interfaccia di Matlab da subito accesso alla command window cioè alla zona della pagina dove avviene la scrittura diretta dei comandi. La cosa più semplice che è possibile fare con questo software è, naturalmente, utilizzarlo come calcolatrice. Ad esempio per eseguire il seguente calcolo:

4

Ad esempio per eseguire il seguente calcolo: 4   2  sin 0,2  

2 sin 0,2

2 2

e

Basta digitare al prompt dei comandi la seguente espressione:

>> 4+sqrt(2) – sin(0.2*pi)^2+exp(2)

ans = 12.4578

il risultato sarà descritto dalla variabile ans.

Definizione di variabili

Per definire una qualsiasi variabile occorre semplicemente dichiararla. Banalmente se si vuole che a e b assumano rispettivamente i valori 4 e 2 basterà scrivere nella command window:

>> a=4;

>>b=2;

>>a*b

ans=8

Cancellazione di variabili

Per

espressione:

cancellare

>> clear a

una

variabile

occorre

digitare

nella

command

window

la

seguente

La variabile a non risulta più presente nel workspace. Ogni variabile definita in questo modo viene conservata in memoria, nel workspace.

Comando whos

Il comando whos mostra una lista di tutte le variabili definite. Digitando tale comando nella command window appariranno tutte le variabili presenti nel workspace seguite da informazioni sulle loro dimensioni (i numeri hanno dimensioni 1x1, i vettori nx1, le matrici nxm), sul numero di byte da esse occupato e sulla loro classe.

>>whos

di byte da esse occupato e sulla loro classe. >>whos Numeri complessi Le seguenti funzioni permettono

Numeri complessi

Le seguenti funzioni permettono di eseguire semplici operazioni elementari coi numeri complessi:

abs = restituisce il modulo di un numero complesso

angle = restituisce la fase di un numero complesso

real = restituisce la parte reale di un numero complesso

imag = restituisce la parte immaginaria di un numero complesso

Esempio:

Lettura e scrittura su file – Current Directory I seguenti comandi permettono di salvare e

Lettura e scrittura su file – Current Directory

I seguenti comandi permettono di salvare e richiamare alcune variabili in un determinato file presente nella cartella “osservata” dal software MATLAB. La cartella osservata dal software MATLAB è riportata in alto nell’interfaccia MATLAB in corrispondenza della dicitura Current Directory. Tutti i file generati vengono salvati nella cartella corrente.

in corrispondenza della dicitura Current Directory. Tutti i file generati vengono salvati nella cartella corrente. 4

- load nomefile variabile 1 variabile 2.

Carica dal file nomefile.mat le variabili elencate

- save nomefile variabile 1 variabile 2

Scrive nel file nomefile.mat le variabili elencate

- load nomefile

carica tutte le variabili presenti in nomefile.mat

- save nomefile

salva tutto il workspace nel file nomefile.mat

Esempio:

salva tutto il workspace nel file nomefile.mat Esempio: Si noti come anche se è stato effettuato

Si noti come anche se è stato effettuato il comando clear e quindi nel workspace non è presente alcuna variabile con il presente comando le variabili sono state richiamate direttamente da file.

Inf e NaN

Alcune operazioni numeriche possono dar luogo a problemi che vengono segnalati da MATLAB scrivendo come risultato le variabili Inf e NaN (not a number)

come risultato le variabili Inf e NaN (not a number) Help Help seguito dal nome della

Help

Help seguito dal nome della funzione restituisce una descrizione e la sintassi d’uso della medesima. Help da solo restituisce l’elenco di tutte le funzioni di MATLAB ordinate per categorie.

Matrici

Come si definisce una matrice in MATLAB? Se ad esempio si vuole definire la seguente matrice 2x2:

A

1

3

2

4

Per fare ciò basta scrivere nella command window il seguente comando:

>> A=[1,2;3,4]

L’accesso agli elementi della matrice definita come detto sopra, ovvero ai singoli elementi posizionati in una determinata posizione identificata da una determinata riga e da una determinata colonna si ottiene digitando il nome della matrice definita seguito tra parentesi da i numeri identificativi di riga e colonna. Ad esempio il seguente comando:

>>A(1,2)

Restituisce l’elemento della matrice posizionato in corrispondenza della prima riga e della seconda colonna.

in corrispondenza della prima riga e della seconda colonna. Per accedere a intere righe o colonne

Per accedere a intere righe o colonne di una matrice bisogna scrivere il nome della matrice e tra parentesi indicare il numero della riga o della colonna di interesse. Se ad esempio si vuole la prima riga della matrice occorre scrivere nella command window:

>>A(1,:)

Si noti come, poiché si vuole l’intera riga l’indice relativo alla colonna è sostituito dal simbolo “:”. Discorso analogo vale se si vuole avere accesso ad un’intera colonna. Ad esempio se si vuole avere accesso alla seconda colonna occorre scrivere nella command window:

>>A(:,2).

Si riportano gli esempi descritti sopra direttamente come appaiono nella command window:

sopra direttamente come appaiono nella command window: Per selezionare sottomatrici di una matrice

Per selezionare sottomatrici di una matrice precedentemente definita occorre digitare il nome della matrice seguito dai numeri di righe e colonne che interessa isolare. Un esempio risulta più chiaro di molte parole:

matrice seguito dai numeri di righe e colonne che interessa isolare. Un esempio risulta più chiaro

Nell’esempio si è selezionata la sottomatrice costituita dalle righe 1 e 2 e dalle colonne 2 e

3. Il simbolo “:” significa “dalla riga x alla riga y” oppure “dalla colonna l alla colonna r”.

Se si fosse scritto nella finestra dei comandi:

>>B(1:2,1:3)

Si sarebbe ottenuta l’intera matrice B (matrice 2x3) poiché si sono richiamate le righe da 1 a 2 e le colonne da 1 a 3.

Operazioni elementari con le matrici

Sono definiti gli operatori “+”, “-“, “*”, ed “^” tra matrici e su matrici. Ecco alcuni esempi:

matrici Sono definiti gli operatori “+”, “-“, “*”, ed “^” tra matrici e su matrici. Ecco
Matrice trasposta La trasposta di una matrice, cioè la matrice che si ottiene sostituendo le
Matrice trasposta La trasposta di una matrice, cioè la matrice che si ottiene sostituendo le
Matrice trasposta La trasposta di una matrice, cioè la matrice che si ottiene sostituendo le

Matrice trasposta

La trasposta di una matrice, cioè la matrice che si ottiene sostituendo le righe alle colonne si ottiene digitando nella finestra dei comandi il nome della matrice seguito dal simbolo “”. In tal modo la matrice trasposta della matrice A definita negli esempi precedenti sarà:

dal simbolo “ ’ ”. In tal modo la matrice trasposta della matrice A definita negli

Matrice inversa

La matrice inversa, cioè la matrice che moltiplicata per la matrice che l’ha generata restituisce la matrice identità si ottiene digitando sulla finestra dei comandi:

>>inv(A)

digitando sulla finestra dei comandi: >>inv(A) Determinante di una matrice Il determinante di una matrice
digitando sulla finestra dei comandi: >>inv(A) Determinante di una matrice Il determinante di una matrice

Determinante di una matrice

Il determinante di una matrice determinato secondo le regole dell’algebra lineare si ottiene digitando nella finestra dei comandi:

>>det(A)

digitando nella finestra dei comandi: >> det(A) Autovalori ed Autovettori di una matrice Si ricorda, per

Autovalori ed Autovettori di una matrice

Si ricorda, per ragioni di completezza, che se A è una matrice quadrata ed Av = lv per uno

scalare l diverso da zero allora l è un auto valore di A e v è un autovettore di A associato

all’autovalore lambda. Gli autovalori di una matrice si ottengono digitando sulla finestra dei comandi:

>>eig(A)

>> eig(A) L’istruzione; >> [V,D]=eig(A) Restituisce due matrici:  Una matrice V contenente gli

L’istruzione;

>> [V,D]=eig(A)

Restituisce due matrici:

Una matrice V contenente gli autovettori della matrice A disposti sulle colonne

Una matrice D contenente nella diagonale principale tutti gli autovalori.

Esempio:

>> A=[1,2,1;4,3,1;0,0,7]

A =

1

2

1

4

3

1

0

0

7

>> [V,D]=eig(A)

V

=

-0.7071

-0.4472

0.3030

0.7071

-0.8944

0.5051

0

0

0.8081

D =

-1

0

0

0

5

0

0

0

7

Dimensione di una matrice

Per ottenere da MATLAB le dimensioni di una matrice, cioè il numero di righe e di colonne di una matrice occorre semplicemente digitare nella finestra dei comandi:

>> size(A)

digitare nella finestra dei comandi: >> size(A) Come risulta chiaro dall’esempio la matrice B ha 2

Come risulta chiaro dall’esempio la matrice B ha 2 righe e tre colonne.

Rango di una matrice

Si ricorda, per ragioni di completezza la definizione di rango di una matrice. Si consideri una matrice rettangolare A con m righe ed n colonne. Qualsiasi matrice ottenuta da A cancellando alcune righe e/o alcune colonne è detta sottomatrice di A. Il numero “r” è detto rango di A se tutte le matrici l x l con l maggiore di r hanno un determinante che è uguale a zero e se almeno una sottomatrice r x r ha un determinante che è diverso da zero. Il rango di una matrice si ottiene semplicemente digitando:

>>rank(B)

Traccia di una matrice La traccia di una matrice, cioè la somma degli elementi di

Traccia di una matrice

La traccia di una matrice, cioè la somma degli elementi di una matrice disposti sulla diagonale principale si determina in ambiente MATLAB digitando il comando:

>>trace(A)

in ambiente MATLAB digitando il comando: >>trace(A) Norma di una matrice Per ragioni di completezza si

Norma di una matrice

Per ragioni di completezza si ricorda che la norma di una matrice è definita come:

norm(A) =

A =

A

2

=

 T   A A
T 
 A A

dove, per una generica matrice B si definisce raggio spettrale r(B) il massimo dei moduli

dei suoi autovalori. La norma di una matrice A si ottiene digitando sulla finestra dei comandi:

>>norm(A)

digitando sulla finestra dei comandi: >> norm(A) Matrici speciali - eye(n,n) restituisce una matrice

Matrici speciali

- eye(n,n) restituisce una matrice identità di dimensione n x n

- zeros(n,m) restituisce una matrice di zeri di dimensione n x m

- ones(n,m) restituisce una matrice di uni di dimensione n x m

- rand (n,m) restituisce una matrice n x m con elementi casuali distribuiti uniformemente tra zero ed uno

n x m - rand (n,m) restituisce una matrice n x m con elementi casuali distribuiti
Vettori I vettori hanno due funzioni fondamentali in MATLAB:  rappresentazione coefficienti) di polinomi (un
Vettori I vettori hanno due funzioni fondamentali in MATLAB:  rappresentazione coefficienti) di polinomi (un
Vettori I vettori hanno due funzioni fondamentali in MATLAB:  rappresentazione coefficienti) di polinomi (un

Vettori

I vettori hanno due funzioni fondamentali in MATLAB:

rappresentazione

coefficienti)

di polinomi

(un

polinomio è

descritto

dal

vettore dei

suoi

rappresentazione di segnali (un segnale è rappresentato mediante la sequenza dei valori che assume in un insieme di istanti tempo, quindi mediante un vettore.

Definizione di vettori

Esistono diversi modi per definire un vettore. Uno di questi consiste nell’assegnare al nome del vettore una sequenza di valori definiti da un valore iniziale, da un passo e dal valore finale. Nel caso in cui non si specifica alcun valore per il passo MATLAB assegnerà al

passo valore unitario. Si riporta qualche esempio così come appare nella command window di MATLAB:

esempio così come appare nella command window di MATLAB: Un altro modo per definire un qualsiasi

Un altro modo per definire un qualsiasi vettore è scriverlo come una matrice riga o una matrice colonna

vettore è scriverlo come una matrice riga o una matrice colonna Qualche altro esempio di definizione

Qualche altro esempio di definizione di vettori:

vettore è scriverlo come una matrice riga o una matrice colonna Qualche altro esempio di definizione
vettore è scriverlo come una matrice riga o una matrice colonna Qualche altro esempio di definizione
Prodotti tra vettori ‘*’ e “.*’ , “/” ed “./” , “^” ed “.^” Il

Prodotti tra vettori ‘*’ e “.*’ , “/” ed “./” , “^” ed “.^”

Il prodotto espresso con il comando * effettua il prodotto riga per colonna secondo le regole dell’algebra lineare. Se, invece, si vuole effettuare il prodotto elemento per elemento tra vettori occorre eseguire il comando .* Si riporta un semplice esempio:

effettuare il prodotto elemento per elemento tra vettori occorre eseguire il comando .* Si riporta un
effettuare il prodotto elemento per elemento tra vettori occorre eseguire il comando .* Si riporta un
effettuare il prodotto elemento per elemento tra vettori occorre eseguire il comando .* Si riporta un
Allo stesso modo gli operatori “^” ed “\” operano a livello vettoriale - matriciale in
Allo stesso modo gli operatori “^” ed “\” operano a livello vettoriale - matriciale in

Allo stesso modo gli operatori “^” ed “\” operano a livello vettoriale - matriciale in linea con l’analisi classica (prodotti riga per colonna). Viceversa gli operatori “.^”, “./” operano a livello vettoriale – matriciale sui singoli elementi dei vettori o matrici.

N.B.: elevando a potenza intera non si deve aggiungere il punto (Esempio a^2, b^2).

N.B.: Per evitare l’ambiguità tra l’utilizzo del punto come separatore decimale oppure come operatore congiunto ai simboli “*”, “/”, “^” è opportuno mantenere gli operatori “.*”, “./”, “.^” ben separati dalle variabili sulle quali essi operano. Esempio:

>> 1./4.*pi*2^2

ans =

3.1416

N.B.: come si nota per le variabili numeriche non vettoriali aggiungere il punto come separatore congiunto ai simboli “*”, “/”, “^” o non aggiungerlo è indifferente.

Polinomi

I polinomi sono rappresentati come vettori. Ad esempio se si vuole rappresentare il seguente polinomio:

3

2

s

2

s

1

Basterà digitare nella command window :

 2  s  1 Basterà digitare nella command window : Il calcolo delle radici

Il calcolo delle radici di un polinomio si esegue digitando il comando roots(pol) che restituisce le radici del polinomio precedentemente definito come vettore:

radici del polinomio precedentemente definito come vettore: Affinché venga restituito il valore di un polinomio

Affinché venga restituito il valore di un polinomio corrispondente ad un determinato valore di input occorre utilizzare la funzione polyval.

valore di input occorre utilizzare la funzione polyval. Per effettuare il prodotto tra due polinomi si

Per effettuare il prodotto tra due polinomi si utilizza il comando conv. Se, ad esempio si vuole effettuare il prodotto tra polinomi:

s

1

s

1

2

s

2

s

1

Occorre effettuare la sequenza di comandi:

Rappresentazione grafica bidimensionale Si supponga di voler eseguire un grafico in cui appaiano come ascisse
Rappresentazione grafica bidimensionale Si supponga di voler eseguire un grafico in cui appaiano come ascisse

Rappresentazione grafica bidimensionale

Si supponga di voler eseguire un grafico in cui appaiano come ascisse ed ordinate i seguenti valori:

x

y

1

5

2

6

3

7

In questo caso la sequenza dei comandi da digitare è la seguente:

valori: x y 1 5 2 6 3 7 In questo caso la sequenza dei comandi
Se invece si vuole che per ogni punto da inserire nel grafico sia associato un

Se invece si vuole che per ogni punto da inserire nel grafico sia associato un simbolo, ad esempio in pallino occorre digitare:

>>plot(b,’o’)

Con il seguente risultato

>> plot(b,’o’) Con il seguente risultato Si riporta in seguito una lista di comandi con cui

Si riporta in seguito una lista di comandi con cui è possibile personalizzare i grafici bidimensionali (da “Matlab programming for engineers”, Stephen J.Chapman)

Ad esempio digitare >> plot(a,’b.’ ) riporterà in grafico la variabile a come un punto

Ad esempio digitare

>> plot(a,’b.’) riporterà in grafico la variabile a come un punto blu

>>plot(a,’go’)

riporterà in grafico la variabile a come un cerchio verde

>> plot(a,’go’) riporterà in grafico la variabile a come un asterisco rosso

riporterà in grafico la variabile a come un asterisco rosso >> plot(b,’-o’) esegue lo stesso grafico

>>plot(b,’-o’) esegue lo stesso grafico riprodotto dal comando plot (b,’o’) attraversato da una linea continua

Se invece si vuole generare un grafico in cui ad ogni valore di x si associa un valore di y basta eseguire la seguente sequenza di comandi:

valore di y basta eseguire la seguente sequenza di comandi: Il risultato che si ottiene è

Il risultato che si ottiene è il seguente:

di comandi: Il risultato che si ottiene è il seguente: Se si desidera specificare il colore

Se si desidera specificare il colore della linea di tracciamento del grafico ed il suo spessore si scriverà:

>> plot(x,y,’k’,’linewidth’,2)

In cui ‘k’ indica il colore della linea di grafico (nero) e 2 lo spessore della linea.

Grafico di una funzione

Per eseguire il diagramma di una funzione predefinita occorre digitare il comando fplot Si riporta un semplice esempio:

digitare il comando fplot Si riporta un semplice esempio: Opzioni per diagrammi e grafici - grid
digitare il comando fplot Si riporta un semplice esempio: Opzioni per diagrammi e grafici - grid

Opzioni per diagrammi e grafici

- grid inserisce una griglia per entrambi gli assi

- xlabel, ylabel associa agli assi x e y un determinato titolo

- title associa un titolo al grafico

- semilogx, semilogy mette gli assi x e y in forma logaritmica

- loglog mette entrambi gli assi in forma logaritmica

- axis ([xmin xmax ymin ymax]) impone agli assi un valore minimo e un valore massimo

- hold mantiene gli assi correnti e aggiunge nuove curve o nuovi punti, o, in generale, nuovi dati ad un grafico esistente.

ad esempio il comando

ad esempio il comando eseguirà il diagramma riportato in precedenza associando una griglia ad entrambi gli

eseguirà il diagramma riportato in precedenza associando una griglia ad entrambi gli assi, un titolo a ciascun asse ed un titolo al grafico.

Si riportano di seguito altri esempi:

un titolo a ciascun asse ed un titolo al grafico. Si riportano di seguito altri esempi:

>>loglog(x,y), grid

>>semilogy(x,y),grid 27

>>semilogy(x,y),grid

>>semilogy(x,y),grid 27

>>loglog(x,y),axis([2000 10000 4000 200000]),grid

>>loglog(x,y),axis([2000 10000 4000 200000]),grid >>hold on,

>>hold on, fplot('tanh',[-2,2]),fplot('sinh',[-2,2]),grid

10000 4000 200000]),grid >>hold on, fplot('tanh',[-2,2]),fplot('sinh',[-2,2]),grid 28

>> fplot('tanh',[-2,2],'ro')

>> fplot('tanh',[-2,2],'ro') Diagrammi polari Il modulo e la fase di numeri complessi, così come

Diagrammi polari

Il modulo e la fase di numeri complessi, così come qualunque altro tipo di dati che può essere espresso tramite le coordinate modulo ed angolo può essere rappresentato graficamente ricorrendo alle coordinate polari.

L’esempio seguente illustra quanto appena detto:

essere rappresentato graficamente ricorrendo alle coordinate polari. L’esempio seguente illustra quanto appena detto: 29
essere rappresentato graficamente ricorrendo alle coordinate polari. L’esempio seguente illustra quanto appena detto: 29
Il comando da digitare nella command window è: >> polar(angolo,modulo,'go') Diagrammi a stelo –

Il comando da digitare nella command window è:

>>polar(angolo,modulo,'go')

Diagrammi a stelo – istruzione stem

Si supponga di voler diagrammare, un vettore di valori y che corrispondono ad un altro determinato vettore di valori x e lo si voglia fare con un diagramma a barre. Naturalmente MATLAB include tale tipo di rappresentazione grafica che corrisponde all’istruzione stem (stelo).

Un esempio risulta più chiaro di mille parole:

>>a=[1,3,-2,3,1,-5,3,2,6]

a =

 

1

3

-2

3

1

-5

3

2

6

>>b=[1,1,1,2,3,4,-2,-1,3]

b =

 

1

1

1

2

3

4

-2

-1

3

>>stem(a,b,'b'),grid

La rappresentazione grafica che si ottiene è la seguente:

La rappresentazione grafica che si ottiene è la seguente: Visualizzazione di più grafici in una finestra

Visualizzazione di più grafici in una finestra

A volte può essere utile riportare, all’interno di una stessa finestra l’insieme di più

diagrammi, allo scopo, ad esempio, di visualizzare l’andamento di più variabili correlate nel tempo.

Il comando da digitare nella command window è il comando subplot(m,n,p). Questo

suddivide la finestra dei diagrammi in m righe ed m colonne e posiziona il diagramma in oggetto dove indicato. Si riporta un semplice esempio a solo scopo didattico.

La sintassi da utilizzare è la seguente: >> subplot(righe,colonne,posizione); plot(variabile) La posizione viene
La sintassi da utilizzare è la seguente: >> subplot(righe,colonne,posizione); plot(variabile) La posizione viene
La sintassi da utilizzare è la seguente: >> subplot(righe,colonne,posizione); plot(variabile) La posizione viene
La sintassi da utilizzare è la seguente: >> subplot(righe,colonne,posizione); plot(variabile) La posizione viene

La sintassi da utilizzare è la seguente:

>>subplot(righe,colonne,posizione); plot(variabile)

La posizione viene “contata” a partire dalla prima riga da sinistra verso destra, contando successivamente i grafici delle righe successive alla prima. La posizione viene cioè contata da sinistra verso destra e dall’alto in basso.

Inserimento di testo in un grafico

Spesso, per permettere di spiegare i dati visualizzati, occorre associare a qualcuno dei dati visualizzati (o a tutti ) del testo. Per fare ciò possono essere utilizzati due comandi di istruzione: il comando text ed il comando gtext.

Il comando text scrive nel diagramma, in corrispondenza delle coordinate indicate, il testo indicato tra virgolette. La sintassi è la seguente:

>>text(x,y,’testo’)

Il comando gtext scrive nel diagramma, in corrispondenza di un punto indicato dal mouse, il testo indicato. La sintassi è semplicemente la seguente:

>>gtext(‘testo’)

Un semplice esempio chiarirà ulteriormente quanto appena detto:

esempio chiarirà ulteriormente quanto appena detto: Altri esempi di grafici di funzioni In questo paragrafo
esempio chiarirà ulteriormente quanto appena detto: Altri esempi di grafici di funzioni In questo paragrafo

Altri esempi di grafici di funzioni

In questo paragrafo verranno illustrati due ulteriori esempi di grafici di funzioni in modo da rendere più completo l’insieme di esempi sulla rappresentazione grafica bidimensionale. L’esempio seguente prevede la creazione di una nuova funzione. Come si vedrà nei paragrafi successivi per creare una funzione occorre utilizzare l’editor di MATLAB cliccando l’icona “New M file” posizionata nella barra degli strumenti in alto a sinistra. Si rimanda ai paragrafi successivi per ulteriori approfondimenti. La funzione che si vuole diagrammare è la:

y

e

2

x

senx

5

La funzione creata attraverso l’editor è la seguente:

function [y]=provagrafico(x) y = exp(-x^2)*sin(5*x); end

digitando nella command window:

>>fplot('provagrafico',[-3,3])

Il diagramma che si ottiene è il seguente:

Il diagramma che si ottiene è il seguente: Il secondo esempio, presente anche all’interno dell’help

Il secondo esempio, presente anche all’interno dell’help della funzione fplot di MATLAB, illustra come effettuare un grafico contemporaneo di due funzioni creando una funzione che restituisce una matrice di due colonne. Il listato digitato all’interno dell’editor di MATLAB è il seguente:

function [y] = provagrafico2(x) y(:,1)= 200*sin(x(:))./x(:); y(:,2)= x(:).^2; end

Digitando nella command window :

>> fplot('provagrafico2',[-20,+20])

Il diagramma che si ottiene è il seguente:

Il diagramma che si ottiene è il seguente: Modifica dei grafici ottenuti Attraverso la finestra evidenziata

Modifica dei grafici ottenuti

Attraverso la finestra evidenziata in rosso nella seguente figura è possibile modificare, grazie ad una serie di comandi di semplice utilizzo l’aspetto ed il contenuto dei diagrammi.

è possibile modificare, grazie ad una serie di comandi di semplice utilizzo l’aspetto ed il contenuto

Array Editor

Per lanciare l’array editor è sufficiente cliccare due volte sull’oggetto matrice (ad esempio A) dalla finestra del workspace:

matrice (ad esempio A) dalla finestra del workspace: Comandi clear e clc Il comando clear cancella

Comandi clear e clc

Il comando clear cancella tutte le variabili presenti nel Workspace. È buona norma, quando si inizia a risolvere un nuovo problema, cancellare tutte le variabili presenti nel workspace per evitare inutili errori di utilizzo o sovrapposizione di variabili già definite precedentemente. Il comando clc cancella soltanto il contenuto “visivo” sulla finestra di comando. Le variabili fino a quel punto introdotte non vengono cancellate.

Comando who

Dice quali sono le variabili presenti nel workspace senza specificare altro

le variabili presenti nel workspace senza specificare altro Significato del ; Se alla fine di una

Significato del ;

Se alla fine di una istruzione si aggiunge il segno ; allora MATLAB non presenta in video il risultato dell’istruzione anche se la esegue e ne memorizza il risultato.

Funzioni e Script – Editor di Matlab

Cliccando sull’icona “New M-File” della barra degli strumenti in alto a sinistra viene lanciato l’editor di MATLAB con cui si possono scrivere e salvare dei file funzione o degli script (sequenze di comandi MATLAB) richiamabili in un secondo momento. Il direttorio di default in cui MATLAB salva i file dell’utente è quello indicato nella finestra Current Directory. Aggiungendo un nuovo direttorio alla lista dei direttori, MATLAB ricerca i file funzione ed i file script anche in quel direttorio. È buona norma evitare di salvare i propri file nel direttorio di default al fine di mantenere distinti i singoli progetti ed argomenti di ricerca.

distinti i singoli progetti ed argomenti di ricerca. Figura: Icona dell’editor Matlab e del direttorio corrente

Figura: Icona dell’editor Matlab e del direttorio corrente

Ci sono due generi di M-file:

Scripts che non accettano argomenti d’entrata o argomenti di uscita. Loro operano su dati nel workspace.

Functions che possono accettare argomenti d’entrata e argomenti di uscita. Una variabile interna `e locale alla funzione.

Le funzioni

Le funzioni sono degli M-files che accettano argomenti di entrata e forniscono risultati in uscita. Il nome della funzione e dell’M-file deve essere lo stesso. La sintassi nello scrivere un M-file è la seguente (primo rigo da digitare durante la scrittura del file)

function[uscita1,uscita2,uscita3] = nomefunzione(ingresso1,ingresso2);

Al momento di richiamare la funzione creata precedentemente (attraverso l’editor di MATLAB) occorre utilizzare la seguente sintassi:

[u1,u2,u3] = nomefunzione(valore1,valore2)

In cui u1,u2 ed u3 sono i nomi, arbitrari, che assegno alle variabili di uscita e valore1,valore2 sono i dati numerici in input della funzione.

Esempio1

Per chiarezza si riporta un semplice esempio di listato di funzione e la maniera di richiamare quest’ultima nella command window:

si riporta un semplice esempio di listato di funzione e la maniera di richiamare quest’ultima nella
si riporta un semplice esempio di listato di funzione e la maniera di richiamare quest’ultima nella

Esempio 2 Si voglia adesso costruire una funzione che, dati i lati ”a” e ”b” di un rettangolo fornisca l’area ”A”, il perimetro ”p” e la diagonale ”d” (“Ciaburro”, manuale MATLAB) . Il listato da digitare nell’editor è il seguente:

function [ A , p , d ] =rettang ( a , b )

A

= a * b;

p

= 2 * ( a + b );

d

=sqrt ( a^2 + b^2 );

al momento di richiamare la funzione nella finestra dei comandi occorrerà digitare, ad

esempio:

>>[g,e,f]=rettang(2,3)

I tre valori che costituiscono il vettore risultato saranno rispettivamente l’area, il perimetro

e la diagonale del rettangolo avente i lati con lunghezze specificate tra parentesi tonde.

Gli script

Quando si esegue uno script precedentemente creato, MATLAB esegue semplicemente la sequenza di comandi inseriti nel listato. Anche se gli script, a differenza delle funzioni, non forniscono dati in uscita l’insieme delle variabili da essi create rimane nel workspace e può

essere utilizzato per i calcoli successivi. Inoltre, inserendo all’interno del listato i comandi opportuni (ad esempio plot) è possibile produrre dei grafici. Per poter inserire dei commenti all’interno di uno script (ad esempio delle spiegazioni sui calcoli inseriti) occorre semplicemente scrivere il testo preceduto dal simbolo % .

Si riporta un semplice esempio di script per il calcolo dell’indice di massa corporea:

%semplice script per illustrare il funzionamento dell'editor di MATLAB disp('DETERMINAZIONE DELL INDICE DI MASSA CORPOREA') disp('gentilmente potresti dirmi quanto pesi?') peso= input('digita il tuo peso in kg') disp('gentilmente potresti dirmi quanto sei alto/a?') altezza=input('gigita la tua altezza in metri') disp('INDICE DI MASSA CORPOREA IMC')

IndiceMC=peso/altezza^2;

disp(['IndiceMC=',num2str(IndiceMC)])

Il risultato nella finestra dei comandi è il seguente:

Come può vedersi nel listato dello script sono presenti una prima riga di commento (in
Come può vedersi nel listato dello script sono presenti una prima riga di commento (in

Come può vedersi nel listato dello script sono presenti una prima riga di commento (in verde) ed i comandi disp e input che permettono di far apparire scritte, commenti e istruzioni nella finestra dei comandi e di recepire dati in input richiesti all’utente.

Comandi disp, input, num2str

Il comando disp permette di visualizzare un vettore o una matrice senza mostrare il nome del vettore o una stringa di testo. Ad esempio se si vuole fare apparire sulla finestra dei comandi la frase “mi piace esercitarmi con MATLAB” sarà sufficiente digitare all’interno dell’editor di MATLAB

disp(‘mi piace esercitarmi con MATLAB’)

La sintassi da utilizzare è dunque, in questo caso la seguente:

disp(‘testo’)

se invece si vuole utilizzare il comando disp per visualizzare un risultato memorizzato su una variabile occorrerà utilizzare all’interno dell’editor di MATLAB la seguente sintassi:

disp(variabile)

Oppure

disp(['variabile=',num2str(variabile)])

Il

comando input richiede un input da parte dell’utente e serve ogni qual volta si vuole far

si

che un determinato valore di variabile sia assegnato manualmente da chi opera nella

command window. La sintasis da utilizzare è la seguente:

variabile = input('richiesta variabile')

Il comando num2str converte numeri o matrici nella loro rappresentazione stringa. Digitando:

num2str(variabile)

si

converte una matrice (o un numero) nella sua rappresentazione stringa con circa 4 cifre

di

precisione ed un esponente se richiesto.

Il

comando

num2str(a,6)

converte la variabile a in una rappresentazione stringa con un massimo di 6 cifre di precisione.

Esempio:

>>num2str(rand(2,2),3)

ans =

0.815

0.127

0.906

0.913

Strutture di controllo del flusso - Costrutti if, for, while e switch

Costrutto if

La struttura if valuta un espressione logica che esegue un gruppo di asserzioni quando l’espressione è verificata.

elseif esegue un altro gruppo di comandi quando altre espressioni logiche opzionali sono verificate.

else stabilisce quali comandi eseguire qualora nessuna delle espressioni logiche presenti in if ed elseif sia verificata.

Una keyword end termina l’ultimo gruppo di asserzioni. I gruppi di asserzioni sono delineati da quattro keywords, non sono previste parentesi.

Il semplice costrutto if contenuto nell’esempio seguente illustra perfettamente il modo di operare con questa struttura:

%semplice script per illustrare il funzionamento dell'editor di MATLAB disp('DETERMINAZIONE DELL INDICE DI MASSA CORPOREA') disp('gentilmente potresti dirmi quanto pesi?') peso= input('digita il tuo peso in kg') disp('gentilmente potresti dirmi quanto sei alto/a?') altezza=input('gigita la tua altezza in metri') if altezza >= 1.80 disp('complimenti, altezza mezza bellezza'); elseif altezza >=1.60 && altezza <1.80 disp('ok, sei perfettamente nella norma');

else

disp('mi dispiace amico,potevi nascere un pò più alto');

end disp('INDICE DI MASSA CORPOREA IMC')

IndiceMC=peso/altezza^2;

disp(['IndiceMC=',num2str(IndiceMC)])

Si noti come sia presente l’operatore logico && (and) in corrispondenza dell’asserzione corrispondente ad elseif.

Esempio programma completo dell’Indice di Massa Corporeo

%semplice script per illustrare il funzionamento dell'editor di MATLAB disp('DETERMINAZIONE DELL INDICE DI MASSA CORPOREA') disp('gentilmente potresti dirmi quanto pesi?') peso= input('digita il tuo peso in kg') disp('gentilmente potresti dirmi quanto sei alto/a?') altezza=input('gigita la tua altezza in metri') if altezza >= 1.80 disp('complimenti, altezza mezza bellezza'); elseif altezza >=1.60 && altezza <1.80 disp('ok, sei perfettamente nella norma');

else

disp('mi dispiace amico,potevi nascere un pò più alto');

end disp('INDICE DI MASSA CORPOREA IMC')

IndiceMC=peso/altezza^2;

disp(['IndiceMC=',num2str(IndiceMC)])

if IndiceMC >50 disp('SUPER OBESO') elseif IndiceMC<=50 && IndiceMC>40 disp ('PATOLOGICAMENTE OBESO') elseif IndiceMC<=40 && IndiceMC>35 disp ('GRAVEMENTE OBESO') elseif IndiceMC<=35 && IndiceMC>30 disp ('OBESO') elseif IndiceMC<=30 && IndiceMC>25 disp ('sovrappeso') elseif IndiceMC<=25 && IndiceMC>18.5 disp ('REGOLARE') elseif IndiceMC<=18.5 && IndiceMC>16 disp ('MAGREZZA') else disp('GRAVE MAGREZZA') end

Operatori Logici

Gli Operatori logici & ed && hanno lo stesso significato (AND - affinché l’asserzione sia verificata occorre che entrambe le condizioni specificate siano vere) ma mentre il primo opera su matrici il secondo opera su scalari.

Gli Operatori logici | ed || hanno lo stesso significato (OR - affinché l’asserzione sia verificata occorre che solo una tra le condizioni specificate sia vera) ma mentre il primo opera su matrici il secondo opera su scalari.

Esiste anche l’operatore logico NOT

Operatori di confronto

Operatori di confronto Comandi isequal ed isempty Il confronto tra due variabili A e B attraverso

Comandi isequal ed isempty

Il confronto tra due variabili A e B attraverso l’operatore di confronto A = = B fa quello che ci si aspetta quando A e B sono 2 scalari. Quando invece A e B sono matrici l’operatore di confronto A = = B non esamina se le matrici siano uguali o meno ma esamina solo in corrispondenza di quali valori queste sono uguali. Il risultato è una matrice di 1 e 0 in cui 1 significa che gli elementi delle due matrici in corrispondenza di una specifica posizione siano identici e 0 che siano diversi. Se A e B non sono della stessa misura l’istruzione A = = B è un errore.

Il modo corretto di controllare l’uguaglianza tra due variabili è quello di usare la funzione isequal. La sintassi da utilizzare è la seguqnte:

>> isequal(A,B)

Esempio:

Esempio 2 45
Esempio 2 45
Esempio 2 45

Esempio 2

Esempio 2 45
Esempio 2 45
Il comando isempty verifica se una matrice (o un vettore) è un vettore vuoto oppure

Il comando isempty verifica se una matrice (o un vettore) è un vettore vuoto oppure no. Restituisce 1 se la matrice è vuota e 0 se non lo è. La sintassi è la seguente:

>> isempty(B)

Esempio:

La sintassi è la seguente: >> isempty(B) Esempio: Comandi all ed any Il comando all verifica

Comandi all ed any

Il comando all verifica se gli elementi di una matrice sono tutti non nulli oppure no. La sintassi da utilizzare è la seguente:

B = all(A)

B= all(A,dim)

Se A è un vettore, all(A) restituisce il valore logico 1 se tutti gli elementi non sono nulli, altrimenti, se anche solo uno degli elementi vettore è nullo restituisce il valore logico 0.

Se A è una matrice il comando all(A) tratta le colonne di A come vettori restituendo un vettore riga con valori logici 1 e 0

B = all(A,dim) esegue le verifiche sulla matrice A lungo la dimensione specificata dal valore numerico dim. Se dim è 1 la verifica avviene lungo la prima riga. Se dim = 2 la verifica avviene lungo la prima colonna

Esempi:

dim = 2 la verifica avviene lungo la prima colonna Esempi: Importante È possibile verificare immediatamente
dim = 2 la verifica avviene lungo la prima colonna Esempi: Importante È possibile verificare immediatamente
dim = 2 la verifica avviene lungo la prima colonna Esempi: Importante È possibile verificare immediatamente
dim = 2 la verifica avviene lungo la prima colonna Esempi: Importante È possibile verificare immediatamente

Importante

È possibile verificare immediatamente quali elementi di una matrice rispettino una certa condizione. Ad esempio se si vuole identificare gli elementi di una matrice A maggiori di 0.5 basterà digitare:

>>B = (A>0.5)

Si riporta un semplice esempio:

Il comando any verifica se qualcuno degli elementi di una matrice A è non nullo
Il comando any verifica se qualcuno degli elementi di una matrice A è non nullo

Il comando any verifica se qualcuno degli elementi di una matrice A è non nullo oppure no. La sintassi da utilizzare è la seguente:

B = any(A)

B= any(A,dim)

Se A è un vettore, any(A) restituisce il valore logico 1 se almeno uno degli elementi è non nullo, altrimenti, se neanche uno degli elementi è non nullo restituisce il valore logico 0.

Se A è una matrice il comando any(A) tratta le colonne di A come vettori restituendo un vettore riga con valori logici 1 e 0

B = any(A,dim) esegue le verifiche sulla matrice A lungo la dimensione specificata dal valore numerico dim. Se dim è 1 la verifica avviene lungo la prima riga. Se dim = 2 la verifica avviene lungo la prima colonna

Esempi:

dim. Se dim è 1 la verifica avviene lungo la prima riga. Se dim = 2
Comando find L’istruzione find localizza tutti gli elementi non nulli di una matrice. Si supponga
Comando find L’istruzione find localizza tutti gli elementi non nulli di una matrice. Si supponga
Comando find L’istruzione find localizza tutti gli elementi non nulli di una matrice. Si supponga

Comando find

L’istruzione find localizza tutti gli elementi non nulli di una matrice. Si supponga ad esempio di disporre della seguente matrice A:

>>A=[1,2,0;3,2,0;0,0,2]

A =

1

2

0

3

2

0

0

0

2

Digitando nella command window :

>> [r,c,v]=find(A)

Si ottiene:

r =

1

2

1

2

3

c =

1

1

2

2

3

v =

1

3

2

2

2

In cui r,c e v sono, rispettivamente, gli indici di riga, gli indici di colonna ed i valori corrispondenti degli elementi non nulli della matrice considerata.

Se si ha a che fare semplicemente con un vettore:

v =

1

0

0

2

0

L’istruzione find(v) restituirà semplicemente gli indici corrispondenti agli elementi non nulli del vettore:

>> h=find(v)

h =

1 4

Costrutto for

Il loop for ripete un gruppo di asserzioni un numero finito di volte. La parola chiave end termina le asserzioni.

Si riporta un semplice esempio per capire questo semplice ma potente costrutto. L’esempio calcola il valore del rapporto aureo come frazione tra l’ennesimo e l’n-1esimo numero della serie di Fibonacci.

%script di esempio per spiegare il costrutto for %questo script

a=0;

b=1;

for n=1:100;

a=a+b

b=a+b

end gratio = b/a; disp(['Valore del rapporto aureo', num2str(gratio)])

Si riporta uno stralcio dei risultati che questo script fornisce (primi e ultimi risultati)

…… …… 52

……

……

…… …… 52
…… …… 52
…… …… 52

In maniera più elegante lo stesso risultato poteva ottenersi elaborando il seguente script:

%script di esempio per spiegare il costrutto for %questo script calcola il rapporto aureo e i primi % 100 numeri della serie di Fibonacci

i=2;

x(i-1)=0;

x(i)=1;

for i=2:100; x(i+1)= x(i)+x(i-1)

end gratio = x(i+1)/x(i); disp(['Valore del rapporto aureo', num2str(gratio)])

le prime righe di risultato che lo script fornisce sono le seguenti:

del rapporto aureo' , num2str(gratio)]) le prime righe di risultato che lo script fornisce sono le
del rapporto aureo' , num2str(gratio)]) le prime righe di risultato che lo script fornisce sono le
del rapporto aureo' , num2str(gratio)]) le prime righe di risultato che lo script fornisce sono le
del rapporto aureo' , num2str(gratio)]) le prime righe di risultato che lo script fornisce sono le
del rapporto aureo' , num2str(gratio)]) le prime righe di risultato che lo script fornisce sono le
Costrutto while Il ciclo while ripete un gruppo di asserzioni un determinato numero di volte

Costrutto while

Il ciclo while ripete un gruppo di asserzioni un determinato numero di volte finché una determinata condizione è verificata. La parola chiave end termina le asserzioni.

Si riporta un piccolo e semplice esempio che somma, ad ogni iterazione, 2 al valore di x fintantoché è verificata la condizione x<25. Il primo valore di x è un numero casuale compreso tra 0 e 3.

%piccolo esempio per illustrare il costrutto while

x=3*rand;

while x<25;

x=x+2

end

Ciclo while con 2 condizioni imposte

Come è possible eseguire una serie di istruzioni iterativamente fintantoché una delle due condizioni imposte non è più vera? Si utilizza il ciclo while con l’operatore logico & o &&

Esempio:

%esempio di while con due condizioni i=rand; x=rand; while x<25 && i<90

x=x+1

i=i+3

end

Il ciclo while viene eseguito mentre le condizioni poste sono vere. Se ad esempio si vuole proseguire con le iterazioni fino a che x<25 ed i<90 il ciclo while riportato nell’esempio fa al caso nostro.

Istruzione break

L’istruzione break fa si che si esca velocemente da un ciclo for o while se una certa condizione è verificata. In un ciclo annidato l’istruzione break esce solamente dal ciclo interno.

Si riporta un esempio di ciclo for in cui è inserita all’interno l’istruzione break

%esempio di ciclo while con break

a=1;

b=1;

for a=1:100; a=a+b if a>25 break; else disp('niente break') end

end

Cicli annidati

È inoltre possible annidare 2 o più cicli di diverso tipo costruendo listati comunque complessi in base alle esigenze di calcolo richieste. Si riporta un semplice esempio di listato che include il costrutto if (con all’interno l’istruzione break) all’interno di un ciclo for:

%script di esempio cicli while e for annidati

y=0;

x=1;

i=1;

indice=i; for i=1:50

x(i)=26*rand

y(i)=1/x(i)

if x(i)>20 disp('NO! CHE SFORTUNA!!') break else disp ('tutto ok ti sei salvato') end

end

Questo semplice script genera numeri casuali compresi tra 1 e 26 e ne calcola il reciproco. La generazione di numeri casuali si interrompe qualora il numero casuale generato sia maggiore di 20. Ecco qualche iterazione:

Prima iterazione:

Terza iterazione: Comandi fix, round, floor, ceil - fix(x) arrotonda gli elementi di x agli

Terza iterazione:

Terza iterazione: Comandi fix, round, floor, ceil - fix(x) arrotonda gli elementi di x agli interi

Comandi fix, round, floor, ceil

- fix(x)

arrotonda gli elementi di x agli interi più vicini verso lo zero

- round(x) arrotonda gli elementi di x all’intero più vicino

- floor (x) arrotonda gli elementi di x all’intero più vicino verso meno infinito

- ceil (x) arrotonda gli elementi di x all’intero più vicino verso più infinito

Esempi:

57
57
57
57
57

Costrutto switch

Il costrutto switch permette di dare risultati (o di fare scelte) in base a dei valori di output; qualche esempio chiarisce al meglio la sintassi e l’utilizzo.

Esempio 1

%piccolo programma per illustrare il costrutto switch

d=floor(3*rand);

switch d case 1 disp('è un 1') case 2 disp ('è un 2') otherwise disp('è un 3')

end

Esempio 2

%secondo esempio per illustrare il costrutto switch

z=floor(10*rand)

switch z case {1,3,5,7,9} disp ('dispari') case {2,4,6,8} disp('pari') otherwise disp('zero')

end

Simboli, come scriverne alcuni

{ = ALT+123 (tastierino numerico)

} = ALT+125 (tastierino numerico)

| = ALT+124 (tastierino numerico)

~ = ALT+126 (tastirino numerico)

Comando rand

- y = rand(3) - da una matrice 3x3 composta da numeri casuali compresi tra zero e uno. Un messaggio di errore apparirà se al posto di 3 si inserisce una quantità non scalare.

- y = rand(3,4) - da una matrice 3x4 composta da numeri casuali compresi tra zero e uno

- y=rand(3,4,5,3,…

)

– restituisce una matrice ad n dimensioni composta da numeri

casuali compresi tra zero e uno

- rand – restituisce un numero casuale compreso tra zero ed uno

Il comando randn è identico al comando rand ma restituisce anche numeri negativi

Salvare e aprire dati in un file di testo comandi di operazione sui file fopen, fprintf,fscanf,fclose

salvare in un file

Vediamo come salvare dei dati su un archivio di testo. Come esempio supponiamo di voler salvare i risultati della funzione exp(x) entro l’intervallo (1,2) con passo 0.1.

Innanzitutto occorre costruire il vettore:

>>x=1:0.1:2;

Quindi valutare la matrice A digitando nella finestra dei comandi:

>>A=[x;exp(x)]

 Successivamente decidere il nome del file esterno su cui si vuole salvare la matrice

Successivamente decidere il nome del file esterno su cui si vuole salvare la matrice A, ad esempio matexp.txt

Aprire in modalità scrittura il file su cui si è deciso di salvare utilizzando la sintassi:

>> matexp=fopen('matexp.txt','wt');

Il nome del file deve essere posto dentro apici poiché è una stringa. Il fatto che il file sia aperto in modalità lettura è evidenziato dal fatto che si è scritto, dopo il nome del file ‘wt’.

matexp è il nome interno che si è assegnato al file (nel senso che una volta aperto il file si opererà nella command window utilizzando tale nome)

matexp.txt è il nome esterno che si è assegnato al file (nel senso che tutti i dati sono immagazzinati in un file di testo avente il nome esterno)

Immagazzinare nell’archivio “nome file” (nome interno) la matrice A utilizzando la seguente sintassi (ad esempio)

>> fprintf(matexp,'%6.2f %8.4f\n',A)

I simboli %6,2f ed %8.4f indicano che si sta salvando la matrice in due colonne (la matrice per come era stata scritta aveva due righe anziché due colonne, vedremo perché) di cui la prima deve avere massimo sei cifre di cui due decimali e la seconda deve avere massimo 8 cifre di cui 4 decimali.

Il simbolo \ n significa nuova riga poiché se ho una matrice:

MATLAB la legge in verticale, (nel senso che legge prima 1.000, poi 2.7183, poi 1.1000)

MATLAB la legge in verticale, (nel senso che legge prima 1.000, poi 2.7183, poi 1.1000) e la scrive in orizzontale (nel senso che scriverà 1.000 e 2.7183 nella

stessa riga) per cui, se si vuole una matrice fatta di 2 colonne con le caratteristiche

di

precisione dei dati immagazzinati viste, si dovrà “istruire” il software dicendogli

di

andare a capo ogni 2 valori scritti.

Il risultato che si ha è il seguente (matrice salvata all’interno del file matexp.txt)

1.00

2.7183

1.10

3.0042

1.20

3.3201

1.30

3.6693

1.40

4.0552

1.50

4.4817

1.60

4.9530

1.70

5.4739

1.80

6.0496

1.90

6.6859

2.00

7.3891

Infine chiudere il file sul quale si è scritto

>> fclose(matexp);

leggere i file immagazzinati in un file di testo

Vediamo adesso come leggere dati da un archivio di testo su cui li si è immagazzinati. Il nome esterno del file sia matexp.txt che potrebbe anche essere stato generato attraverso un programma esterno. La sequenza di comandi da effettuare è la seguente:

Aprire il file su cui precedentemente si sono immagazzinati i dati in modalità

lettura:

>> matexp=fopen('matexp.txt','r');

matexp è il nome interno che si è assegnato al file (nel senso che una volta aperto il file si opererà nella command window utilizzando tale nome)

matexp.txt è il nome esterno che si è assegnato al file (nel senso che tutti i dati sono immagazzinati in un file di testo avente il nome esterno). Il nome esterno deve essere posto tra apici perché è una stringa.

Il simbolo ‘r’ significa che si sta aprendo il file in modalità lettura

Prelevare dal’archivio matexp la matrice A utilizzando la seguente sintassi (ad esempio)

>> A=fscanf(matexp,'%g %g', [2 inf]);

>> A=fscanf(matexp,'%g %g', [3 inf]);

>> A=fscanf(matexp,'%g %g', [3 4]);

La matrice, immagazzinata nel file di testo è:

1.00

2.7183

1.10

3.0042

1.20

3.3201

1.30

3.6693

1.40

4.0552

1.50

4.4817

1.60

4.9530

1.70

5.4739

1.80

6.0496

1.90

6.6859

2.00

7.3891

In lettura MATLAB legge da sinistra verso destra e dall’alto in basso (cioè legge la prima riga passando poi alla seconda) e restituisce il risultato in colonna.

Il risultato del comando:

>> A=fscanf(matexp,'%g %g', [2 inf]);

è infatti:

il risultato in colonna. Il risultato del comando: >> A=fscanf(matexp,'%g %g', [2 inf]); è infatti: 62

Il simbolo [2 inf] significa che quando il software mi restituisce i dati letti si vuole che li disponga in 2 righe (2) e che legga tutti i dati fino alla fine (inf). Se si scrive al posto di [2 inf] il simbolo [3 inf] il risultato del comando

>> A=fscanf(matexp,'%g %g', [3 inf]);

è:

A =

1.0000

3.0042

1.3000

4.0552

1.6000

5.4739

1.9000

7.3891

2.7183

1.2000

3.6693

1.5000

4.9530

1.8000

6.6859

0

1.1000

3.3201

1.4000

4.4817

1.7000

6.0496

2.0000

0

Cioè la matrice restituita ha 3 righe ed i dati sono letti fino alla fine, mentre se si digita nella finestra dei comandi:

>> A=fscanf(matexp,'%g %g', [3 4]);

Il risultato è una matrice composta da 3 righe ed i dati forniti sul monitor sono tali da riempire al massimo 4 colonne, cioè:

A

=

1.0000

3.0042

1.3000

4.0552

2.7183

1.2000

3.6693

1.5000

1.1000

3.3201

1.4000

4.4817

Il simbolo '%g %g' è relativo al formato in cui si vogliono visualizzare i dati. I formati più comuni sono:

- %e = notazione esponenziale

- %f = notazione a punto fisso

- %g = la più compatta tra le notazioni %e ed %f

Produrre dei punti equidistanti secondo n intervalli comprendendo gli estremi

Per fare ciò si consiglia di evitare il costrutto MATLAB

x = [xLow : delta : xUp]

ad esempio la seguente istruzione:

x = [0.1: 0.001 : 1.2]

non è consigliabile a causa della precisione limitata della CPU anche in doppia precisione. Un algoritmo corretto allo scopo di produrre punti equidistanti secondo n intervalli (inclusi gli estremi è il seguente:

%piccolo script per produrre punti equidistanti secondo %n intervalli comprendendo gli estremi disp('inserisci il numero di intervalli') n= input('nintervalli') disp('inserisci il limite superiore') Xup= input ('estremo superiore') disp('inserisci il limite inferiore') Xlow= input ('estremo inferiore') delta=(Xup-Xlow)/n; for i=1:n+1 x(i)= Xlow + delta*(i-1);

end

disp(x)

Un altro algoritmo, meno corretto perché accumula gli errori legati all’operazione di somma (i termini x(i) sono cioè meno precisi), è il seguente:

%piccolo script per produrre punti equidistanti secondo %n intervalli comprendendo gli estremi disp('inserisci il numero di intervalli') n= input('nintervalli') disp('inserisci il limite superiore') Xup= input ('estremo superiore') disp('inserisci il limite inferiore') Xlow= input ('estremo inferiore') delta=(Xup-Xlow)/n;

x(1)=Xlow;

for i=1:n x(i+1)= x(i) + delta;

end

disp(x)

Infine, un algoritmo equivalente al primo algoritmo riportato (differisce soltanto dal punto di vista degli input introdotti) è il seguente:

%piccolo script per produrre punti equidistanti secondo %n intervalli comprendendo gli estremi disp('inserisci il numero di punti') n= input('npunti') disp('inserisci il limite superiore') Xup= input ('estremo superiore') disp('inserisci il limite inferiore') Xlow= input ('estremo inferiore')

delta=(Xup-Xlow)/(n-1);

for i=1:n x(i)= Xlow + delta*(i-1);

end

disp(x)

Osservazione sul costrutto while

Come funziona esattamente il costrutto while?

Il costrutto while continua a eseguire le istruzioni in esso contenute mentre la sua condizione è vera.

Esempio: Data la serie armonica (somma degli inversi dei numeri naturali) per sapere quanti termini sono necessari prima di raggiungere almeno il valore 5 si scriverà:

%esempio salvato per illustrare %una osservazione sul ciclo while

n=0;

somma=0;

while somma<5;

n=n+1;

somma=somma+1/n;

end

disp(['n=',num2str(n)]);

disp(somma);

Sarebbe un grave errore utilizzare l’espressione:

while somma = 5

Allo stesso modo è una imprecisione utilizzare l’espressione

while somma <=5

In quanto il problema chiede espressamente “prima di raggiungere almeno il valore 5”. Ciò sta a significare che il ciclo while deve continuare non appena è stato raggiunto o superato l valore 5. Supponiamo, cosa non vera, che la somma dei primi 83 reciproci dei numeri naturali sia esattamente pari al valore 5.

Se si utilizzasse l’istruzione:

while somma <=5

Il costrutto while sarebbe autorizzato ad iterare ancora una volta per sommare l’ottantaquattresimo termine che quindi andrebbe oltre il valore 5 richiesto dal problema.

Sulle dimensioni di una matrice – comandi size e length

Come determinare le dimensioni di una matrice?

Occorre, come visto qualche pagina fa, utilizzare l’istruzione size.

>> A=rand(2,2,2);

>> A

A(:,:,1) =

0.6324

0.2785

0.0975

0.5469

A(:,:,2) =

0.9575

0.1576

0.9649

0.9706

Questo perché A è una matrice tridimensionale 2 X 2 X 2. È come se fossero due matrici una dietro l’altra.

Scrivere

>>A(: , : ,1) mostra le caselle della “matrice anteriore”

>>A(: , :, 2) mostra le caselle della “matrice posteriore”

Se si scrive:

A =

1

4

2

5

3

6

E si vuole la dimensione della seconda dimensione della matrice A, occorre digitare:

>> size (A,2)

ans =

3

Dimensione della matrice come singolo vettore:

d=size(A)

d =

2 3

Se si vuole che ogni dimensione sia assegnata ad una variabile separata:

[m,n]=size(A)

m =

2

n =

3

Ulteriori esempi:

>>A=rand(2,2,2)

A(:,:,1) =

0.8147

0.1270

0.9058

0.9134

A(:,:,2) =

0.6324

0.2785

0.0975

0.5469

Dimensione della matrice come singolo vettore (la misura è data come singolo vettore)

d=size(A)

>>d=size(A)

d

=

2

2

2

Se,invece, si vuole che ogni dimensione sia assegnata ad una variabile separata occorre digitare:

>> [righe,colonne,profondita]=size(A)

righe =

2

colonne =

2

profondita =

2

Ancora un esempio:

>> A=zeros(3,5);

>> nrows=size(A,1);

>> ncols=size(A,2);

>> disp(['nRows= ',num2str(nrows),'ncols= ',num2str(ncols)]);

>>nRows= 3 ncols= 5

Maggiori delucidazioni si ottengono digitando help size nella command window di MATLAB.

L’istruzione length restituisce la misura della dimensione maggiore di una generica matrice. Se invece di una matrice si ha a che fare con un vettore, l’istruzione restituisce semplicemente la lunghezza del vettore.

Esempi:

>>M=ones(3,10);

>> length(M)

ans =

10

>>V=ones(1,10);

>> length(V)

ans =

10

Utilizzando le istruzioni size e length insieme è possibile determinare il numero di dimensioni di una matrice.

Esempio:

>> A=zeros(3,5);

>> nRowsCols=size(A);

>> ndimensions=length(nRowsCols)

ndimensions =

2

Integrali e Derivate – Comandi syms e int

Domanda: Come si fa a calcolare l’integrale analitico di una funzione?

Risposta: Si utilizzano i comandi syms e int.

A titolo di esempio supponiamo di voler calcolare l’integrale delle funzioni x^2 e logaritmo di x^2. Occorrerà digitare:

>>syms x;

>> >> int(x^2)

ans =

1/3*x^3

>>int(log(x^2))

ans =

log(x^2)*x-2*x

Domanda: come si fa a calcolare la derivata analitica di una funzione?

Risposta: Si utilizzano i comandi syms e diff.

A titolo di esempio supponiamo di voler effettuare il calcolo della derivata della funzione log(x^tan(x)). Occorre digitare:

>>syms x;

>> diff(log(x^tan(x)))

ans =

(1+tan(x)^2)*log(x)+tan(x)/x

Ordinare un vettore o una matrice – istruzione sort

L’istruzione sort ordina un vettore o una matrice nel modo desiderato (crescente o decrescente).

Definito un vettore v nel seguente modo:

>>v = [1,2,0,-4,6,-2,0]

v =

1

2

0

-4

6

-2

0

Per ordinarlo in modo crescente basta digitare il comando:

>>v_ord=sort(v)

v_ord =

-4

-2

0

0

1

2

6

Se invece si desidera ordinarlo in maniera decrescente basterà scrivere:

v_desc=sort(v,'descend')

v_desc =

6

2

1

0

0

-2

-4

Operando con matrici l’istruzione sort ordinerà le colonne di una matrice in ordine crescente (o descrescente).

Definita, ad esempio la matrice:

>>A=[1,5,2;4,0,-3]

A =

1

5

2

4

0

-3

L’istruzione:

>> sort(A)

ans =

1

4

0

5

-3

2

Ordina in maniera crescente ogni colonna della matrice. L’effetto dell’istruzione è assolutamente identico all’effetto dell’istruzione:

>> sort(A,1)

ans =

1

4

0

5

-3

2

Poiché l’istruzione sort(A,1) significa letteralmente “ordina lungo la dimensione 1, cioè lungo le righe” (quindi ordinerà le colonne).

L’istruzione:

>> sort(A,2)

ans =

1

-3

2

0

5

4

significa letteralmente “ordina lungo la dimensione 2, cioè lungo le colonne” (quindi ordina le righe).

Infine l’istruzione:

>> [C,D]=sort(A,2)

C =

1

2

5

-3

0

4

D =

1

3

2

3

2

1

Dopo aver ordinato le righe della matrice A restituisce anche una matrice D di indici che illustra le posizioni precedenti (lungo la riga) di tutti gli elementi che compongono la matrice C ordinata.

Naturalmente

anche

l’”ordinamento”

di

matrici

può

essere

effettuato

in

maniera

decrescente.

L’istruzione open

L’istruzione open quando digitata nella command window permette di visualizzare un vettore od una matrice di interesse all’interno dell’array editor:

Esempio:

>> open A

>> open A Comando diag L’istruzione diag se applicata ad un vettore restituisce una matrice diagonale

Comando diag

L’istruzione diag se applicata ad un vettore restituisce una matrice diagonale n x n i cui elementi della diagonale principale sono gli elementi del vettore.

Esempio:

>>v=[1,2,3]

 

v =

 

1

2

3

>> diag(v)

ans =

1

0

0

0

2

0

0

0

3

Qualora invece l’istruzione è applicata ad una matrice essa restituisce un vettore contenenti gli elementi della diagonale principale:

Esempio:

>>A=[1,2,1;4,3,1;0,0,7]

A =

1

2

1

4

0

3

0

1

7

>> diag(A)

ans =

1

3

7

Elenco funzioni comuni

sqrt (3) =

pi

= π

exp(2) =

e

3
3

2

clear a = cancella la variabile a precedentemente dichiarata

whos = mostra una lista di tutte le variabili definite

sin(a) = esegue il seno di a

cos(a) = esegue il coseno di a

acos(a) = esegue l’arco coseno di a

asin(a) = esegue l’arcoseno di a

atan (a) = esegue l’arcotangente di a

log(a) = esegue il logaritmo naturale di a

log10(a) = esegue il logaritmo in base dieci di a

abs (a) = restituisce il modulo di un numero complesso

angle (a) = restituisce la fase di un numero complesso

real (a) = restituisce la parte reale di un numero complesso

imag (a) = restituisce la parte immaginaria di un numero complesso

load nomefile variabile 1 variabile 2.

Carica dal file nomefile.mat le variabili elencate

save nomefile variabile 1 variabile 2

Scrive nel file nomefile.mat le variabili elencate

load nomefile

carica tutte le variabili presenti in nomefile.mat

save nomefile

salva tutto il workspace nel file nomefile.mat

- help nomefunzione = restituisce la descrizione della funzione e la sintassi d’uso della stessa

- help = restituisce l’elenco di tutte le funzioni di MATLAB, ordinate per categoria

- A’ = restituisce la trasposta della matrice A

- inv(A) = restituisce la matrice inversa della matrice A

- det(A) = restituisce il determinante della matrice A

- eig(A) = restituisce gli autovalori della matrice A

- [V,D]=eig(A) - Restituisce due matrici: una matrice V contenente gli autovettori della matrice A disposti sulle colonne ed una matrice D contenente nella diagonale principale tutti gli autovalori.

- size(A) = restituisce le dimensioni della matrice A (righe, colonne,profondità)

- size (A,n) = restituisce la dimensione n della matrice (se n è 2 il numero di colonne)

- [m,n]=size(A) = associa le dimensioni di una matrice a due variabili separate

- rank(A) = restituisce il rango della matrice A

- trace(A) = restituisce la traccia di una matrice

- norm(A) = restituisce la norma di una matrice A

- eye(n,n) restituisce una matrice identità di dimensione n x n

- zeros(n,m) restituisce una matrice di zeri di dimensione n x m

- ones(n,m) restituisce una matrice di uni di dimensione n x m

- rand (n,m) restituisce una matrice n x m con elementi casuali distribuiti uniformemente tra zero ed uno

- y = rand(n) - restituisce una matrice nxn composta da numeri casuali compresi tra zero e uno

- y=rand(n,m,p,r,…

)

– restituisce una matrice ad n dimensioni composta da numeri

casuali compresi tra zero e uno

- rand – restituisce un numero casuale compreso tra zero ed uno

- randn - restituisce un numero casuale compreso tra meno uno ed uno. In generale tutti i comandi rand possono essere sostituiti da randn comprendendo anche numeri negativi.

- roots(pol) restituisce le radici di un polinomio precedentemente definito come vettore

- polyval(pol,1) restituisce i valori di in polinomio associati ad un determinato valore di input

- conv(pol1,pol2) restituisce il prodotto tra due polinomi sotto forma di vettore, visualizzando i coefficienti del polinomio risultante.

- plot(b,’o’) riporta in un grafico i valori associati della variabile b associando ad ogni valore in ordinata ascisse corrispondenti ai numeri naturali. Ogni punto che si ottiene è contrassegnato da un simbolo circolare (vedi altri esempi al paragrafo rappresentazione grafica 2D)

- plot(b,’-o’)

riporta in un grafico i valori associati della variabile b associando ad

ogni valore in ordinata ascisse corrispondenti ai numeri naturali. Ogni punto che si

ottiene è contrassegnato da un simbolo circolare (vedi altri esempi al paragrafo rappresentazione grafica 2D). I valori sono attraversati da una linea continua

- plot(x,y) esegue il grafico in cui ad ogni variabile x corrisponde una determinata variabile y (ascisse e ordinate)

- plot(x,y,’k’,’linewidth’,2) esegue il grafico in cui ad ogni variabile x corrisponde una determinata variabile y (ascisse e ordinate) specificando il colore e lo spessore della linea

- fplot esegue il diagramma di una funzione

- loglog(x,y), grid - riporta un diagramma (x,y) in scala logaritmica su entrambi gli assi e con griglia

- semilogy(x,y),grid – riporta un diagramma (x,y) in scala logaritmica in y con griglia

- loglog(x,y),axis([2000 10000 4000 200000]),grid – riporta un diagramma (x,y) in scala logaritmica su entrambi gli assi con dei limiti ai valori minimi e massimi degli assi

- hold on, fplot('tanh',[-2,2]),fplot('sinh',[-2,2]),grid – riporta, nello stesso asse i diagrammi delle funzioni tangente iperbolica e seno iperbolico tra le asisse -2 e 2.

- polar(angolo,modulo,'go') esegue il diagramma polare di una coppia di dati esprimibili in fase e modulo

- subplot(righe,colonne,posizione); plot(variabile) – esegue più diagrammi nella stessa finestra di rappresentazione.

- text(x,y,’testo’) – visualizza il testo nel grafico in corrispondenza delle coordinate

- gtext(‘testo’) – visualizza il testo nel grafico in corrispondenza dalla posizione indicata dalla freccia del mouse

- * esegue il prodotto riga per colonna secondo le regole dell’algebra lineare

- .* esegue il prodotto tra vettori elemento per elemento

- .^ esegue la potenza (a livello vettoriale - matriciale) operando sui singoli elementi di vettori o matrici.

- ./ esegue la divisione (a livello vettoriale - matriciale) operando sui singoli elementi di vettori o matrici.

- clear cancella tutte le variabili presenti nel workspace

- clc cancella “visivamente” tutto quello che c’è scritto nella command window senza cancellare dal workspace le variabili

- who dice quali sono le variabili presenti nel workspace senza specificare altro.

- asinh esegue la funzione arcoseno iperbolico

- acosh esegue le funzione arco coseno iperbolico

- disp(‘testo’) visualizza nella finestra dei comandi il testo che si è scritto tra virgolette

- disp(variabile) visualizza nella finestra dei comandi un risultato memorizzato su una variabile

- disp(['variabile=',num2str(variabile)]) visualizza nella finestra dei comandi un risultato memorizzato su una variabile sotto forma di stringa

- variabile = input('richiesta variabile') - richiede un input da parte dell’utente

- num2str(variabile) converte una matrice (o un numero) nella sua rappresentazione stringa con 4 cifre di precisione.

- num2str(variabile,n) converte una matrice (o un numero) nella sua rappresentazione stringa con al massimo n cifre di precisione.

- isequal(A,B) - Verifica se le variabili A e B sono uguali restituendo 1 se l’asserzione è vera e zero se invece è falsa.

- isempty(B) - Verifica se la variabile B è una matrice vuota restituendo 1 se l’asserzione è vera e zero se invece è falsa.

- B = all(A) - verifica se gli elementi di una matrice sono tutti non nulli oppure no.

- B= all(A,dim) ) - verifica se gli elementi di una matrice sono tutti non nulli oppure no. Le verifiche sulla matrice A sono effettuate lungo la dimensione specificata dal valore numerico dim

- B = (A>0.5) – determina in quale posizione si trovano gli elementi di una matrice A con valore maggiore di 0.5

- fix(x)

arrotonda gli elementi di x agli interi più vicini verso lo zero

- round(x) arrotonda gli elementi di x all’intero più vicino

- floor (x) arrotonda gli elementi di x all’intero più vicino verso meno infinito

- ceil (x) arrotonda gli elementi di x all’intero più vicino verso più infinito

- nome=fopen('nomefile.txt','wt'); - Crea un file di testo in modalità scrittura

- fprintf(nome,'%6.2f %8.4f\n',A) – scrive su un file di testo una matrice A nel

formato numerico richiesto e cambiando riga ogni due numeri immagazzinati

- fclose(nome); chiude il file di testo

- nome=fopen('nomefile.txt','r'); apre un file di testo in modalità lettura

- A=fscanf(nome,'%g %g', [2 inf]); legge i dati immagazzinati in un file di testo creando una matrice di 2 righe e leggendo i dati fino alla fine

- A=fscanf(nome,'%g %g', [3 4]); legge i dati immagazzinati in un file di testo creando una matrice di 3 righe e leggendo i dati fino a formare 4 colonne

- length(M) - restituisce la misura della dimensione maggiore di una generica matrice

- syms x – stabilisce che la variabile rispetto alla quale effettuare i calcoli (ad esempio derivate ed integrali) sia la variabile x

- int(x^2) – esegue l’integrale della funzione x^2

- diff(x^3) – esegue la derivata della funzione x^3

- v_ord=sort(v) – ordina in modo crescent il vettore v

- v_desc=sort(v,'descend') – ordina in modo decrescente il vettore v

- sort(A,1) – ordina le colonne di una matrice A in modo crescente

- sort(A,2) – ordina le righe di una matrice A in modo crescente

- [C,D]=sort(A,2) – ordina le righe di una matrice A in modo crescente restituendo

in cui si trovavano gli elementi

inoltre

prima dell’ordinamento

una matrice D contenente tutti gli indici

- stem(a,b,'b'),grid – Esegue una rappresentazione grafica di tipo stem (stelo) dei due vettori di variabili a e b.

- [r,c,v]=find(A) – restituisce gli indici di riga, di colonna ed i valori degli elementi non nulli di una matrice

- h=find(v) – restituisce gli indici degli elementi non nulli di un vettore

- open A – visualizza la matrice A nell’array editor

- diag(v) – restituisce una matrice diagonale con gli elementi del vettore v disposti sulla diagonale principale

- diag(A) – restituisce un vettore contenente gli elementi disposti sulla diagonale principale della matrice.