Esplora E-book
Categorie
Esplora Audiolibri
Categorie
Esplora Riviste
Categorie
Esplora Documenti
Categorie
1
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:
2
4 2 sin 0,2 e 2
ans = 12.4578
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 cancellare una variabile occorre digitare nella command window la seguente
espressione:
>> clear a
La variabile a non risulta più presente nel workspace. Ogni variabile definita in questo
modo viene conservata in memoria, nel workspace.
2
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
Numeri complessi
Le seguenti funzioni permettono di eseguire semplici operazioni elementari coi numeri
complessi:
Esempio:
3
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.
4
- load nomefile variabile 1 variabile 2.
- load nomefile
- save nomefile
Esempio:
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.
5
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)
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.
6
Matrici
Come si definisce una matrice in MATLAB? Se ad esempio si vuole definire la seguente
matrice 2x2:
1 2
A
3 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.
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,:)
7
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:
8
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.
Sono definiti gli operatori “+”, “-“, “*”, ed “^” tra matrici e su matrici.
Ecco alcuni esempi:
9
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à:
10
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)
>>det(A)
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:
11
>>eig(A)
L’istruzione;
>> [V,D]=eig(A)
Una matrice V contenente gli autovettori della matrice A disposti sulle colonne
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 0 0.8081
12
D=
-1 0 0
0 5 0
0 0 7
>> size(A)
>>rank(B)
13
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)
Per ragioni di completezza si ricorda che la norma di una matrice è definita come:
norm(A) = A = A 2 = A A T
14
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)
Matrici speciali
15
Vettori
I vettori hanno due funzioni fondamentali in MATLAB:
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
16
passo valore unitario. Si riporta qualche esempio così come appare nella command window
di MATLAB:
Un altro modo per definire un qualsiasi vettore è scriverlo come una matrice riga o una
matrice colonna
17
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:
18
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.
19
Polinomi
I polinomi sono rappresentati come vettori. Ad esempio se si vuole rappresentare il
seguente polinomio:
3 s2 2 s 1
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 s 2 2 s 1
Occorre effettuare la sequenza di comandi:
20
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
21
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’)
Si riporta in seguito una lista di comandi con cui è possibile personalizzare i grafici
bidimensionali (da “Matlab programming for engineers”, Stephen J.Chapman)
22
Ad esempio digitare
>>plot(b,’-o’) esegue lo stesso grafico riprodotto dal comando plot (b,’o’) attraversato da
una linea continua
23
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:
Se si desidera specificare il colore della linea di tracciamento del grafico ed il suo spessore
si scriverà:
>> plot(x,y,’k’,’linewidth’,2)
24
In cui ‘k’ indica il colore della linea di grafico (nero) e 2 lo spessore della linea.
Per eseguire il diagramma di una funzione predefinita occorre digitare il comando fplot
Si riporta un semplice esempio:
- 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.
25
ad esempio il comando
eseguirà il diagramma riportato in precedenza associando una griglia ad entrambi gli assi,
un titolo a ciascun asse ed un titolo al grafico.
>>loglog(x,y), grid
26
>>semilogy(x,y),grid
27
>>loglog(x,y),axis([2000 10000 4000 200000]),grid
28
>> fplot('tanh',[-2,2],'ro')
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.
29
Il comando da digitare nella command window è:
>>polar(angolo,modulo,'go')
>>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]
30
b=
1 1 1 2 3 4 -2 -1 3
>>stem(a,b,'b'),grid
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.
31
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.
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.
32
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’)
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:
33
2
y e x sen5 x
function [y]=provagrafico(x)
y = exp(-x^2)*sin(5*x);
end
>>fplot('provagrafico',[-3,3])
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:
>> fplot('provagrafico2',[-20,+20])
34
Il diagramma che si ottiene è il seguente:
35
Array Editor
Per lanciare l’array editor è sufficiente cliccare due volte sull’oggetto matrice (ad esempio
A) dalla finestra del workspace:
Comando who
Dice quali sono le variabili presenti nel workspace senza specificare altro
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.
36
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.
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);
[u1,u2,u3] = nomefunzione(valore1,valore2)
37
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:
38
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 );
>>[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:
39
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.
disp(‘testo’)
disp(variabile)
40
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:
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)
Esempio:
>>num2str(rand(2,2),3)
ans =
0.815 0.127
0.906 0.913
41
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.
Si noti come sia presente l’operatore logico && (and) in corrispondenza dell’asserzione
corrispondente ad elseif.
42
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.
43
Operatori di confronto
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:
44
Esempio 2
45
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:
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.
46
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:
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)
47
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.
Esempi:
48
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
>> [r,c,v]=find(A)
Si ottiene:
r=
49
1
c=
v=
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.
v=
50
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.
Si riporta uno stralcio dei risultati che questo script fornisce (primi e ultimi risultati)
51
……..
……..
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)])
53
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.
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:
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.
54
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.
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:
55
Terza iterazione:
- 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:
56
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
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
58
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
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.
>>x=1:0.1:2;
>>A=[x;exp(x)]
59
Successivamente decidere il nome del file esterno su cui si vuole salvare la matrice
A, ad esempio matexp.txt
>> 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)
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.
60
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.
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
>> fclose(matexp);
>> 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)
61
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.
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.
è 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=
Cioè la matrice restituita ha 3 righe ed i dati sono letti fino alla fine, mentre se si
digita nella finestra dei comandi:
Il risultato è una matrice composta da 3 righe ed i dati forniti sul monitor sono tali
da riempire al massimo 4 colonne, cioè:
A=
- %e = notazione esponenziale
63
Produrre dei punti equidistanti secondo n intervalli comprendendo gli
estremi
Per fare ciò si consiglia di evitare il costrutto MATLAB
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:
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;
64
end
disp(x)
Infine, un algoritmo equivalente al primo algoritmo riportato (differisce soltanto dal punto
di vista degli input introdotti) è il seguente:
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);
while somma = 5
65
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:
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.
>> 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
66
Scrivere
Se si scrive:
A=
1 2 3
4 5 6
ans =
d=size(A)
d=
2 3
[m,n]=size(A)
m=
2
67
n=
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 =
68
colonne =
profondita =
Ancora un esempio:
>> A=zeros(3,5);
>> nrows=size(A,1);
>> ncols=size(A,2);
>>nRows= 3 ncols= 5
Esempi:
>>M=ones(3,10);
>> length(M)
ans =
10
>>V=ones(1,10);
>> length(V)
69
ans =
10
Esempio:
>> A=zeros(3,5);
>> nRowsCols=size(A);
>> ndimensions=length(nRowsCols)
ndimensions =
A titolo di esempio supponiamo di voler calcolare l’integrale delle funzioni x^2 e logaritmo
di x^2. Occorrerà digitare:
>>syms x;
ans =
1/3*x^3
>>int(log(x^2))
ans =
70
log(x^2)*x-2*x
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
>>v = [1,2,0,-4,6,-2,0]
v=
1 2 0 -4 6 -2 0
>>v_ord=sort(v)
v_ord =
-4 -2 0 0 1 2 6
71
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).
>>A=[1,5,2;4,0,-3]
A=
1 5 2
4 0 -3
L’istruzione:
>> sort(A)
ans =
1 0 -3
4 5 2
>> sort(A,1)
ans =
1 0 -3
4 5 2
72
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 2 5
-3 0 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.
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:
73
>> open A
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
74
4 3 1
0 0 7
>> diag(A)
ans =
sqrt (3) = 3
pi = π
exp(2) = e 2
75
real (a) = restituisce la parte reale di un numero complesso
load nomefile
save nomefile
76
- trace(A) = restituisce la traccia di una matrice
- y = rand(n) - restituisce una matrice nxn composta da numeri casuali compresi tra
zero e 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.
77
ottiene è contrassegnato da un simbolo circolare (vedi altri esempi al paragrafo
rappresentazione grafica 2D). I valori sono attraversati da una linea continua
78
- ./ esegue la divisione (a livello vettoriale - matriciale) operando sui singoli elementi
di vettori o matrici.
- 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.
- disp(‘testo’) visualizza nella finestra dei comandi il testo che si è scritto tra
virgolette
- 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
79
- 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
- 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
- syms x – stabilisce che la variabile rispetto alla quale effettuare i calcoli (ad
esempio derivate ed integrali) sia la variabile x
80
- [C,D]=sort(A,2) – ordina le righe di una matrice A in modo crescente restituendo
inoltre una matrice D contenente tutti gli indici in cui si trovavano gli elementi
prima dell’ordinamento
- diag(v) – restituisce una matrice diagonale con gli elementi del vettore v disposti
sulla diagonale principale
81