Tag Archives: esercizi matlab

Creare matrici con gli m-file di Matlab

MATLAB

Si possono creare matrici utilizzando gli M-files che sono file di testo contenenti codici MATLAB. Per fare questo basta creare un file che contiene lo stesso statement che si desiderava digitare al prompt di MATLAB, e salvare il file con un nome con estensione .m.

Per scrivere il file di testo basterà un semplice editor di testo tipo notepad che ci permette di realizzare un file di testo formattato in modo semplice senza ulteriori regole di formattazione che nel nostro caso darebbero solo fastidio. Per accedere ad un editor di testo sotto UNIX, usare il simbolo ! seguito dal comando desiderato.

Per esempio, creiamo un file che contiene queste cinque linee:

A = […
16.0 3.0 2.0 13.0
5.0 10.0 11.0 8.0
9.0 6.0 7.0 12.0
4.0 15.0 14.0 1.0];

salviamo il file con il nome matrice.m. Poi al prompt di Matlab digitiamo lo statement matrice, in questo modo avremo detto a Matlab di leggere il file e creare un variabile, A, contenente la nostra matrice d’esempio.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Il comando load in Matlab

MATLAB

Il comando load legge file binari che contengono matrici, generati da precedenti sessioni di MATLAB, o legge file di testo contenenti dati numerici. I file di testo dovrebbero essere organizzati come una tabella rettangolare di numeri,separata da spazi vuoti con una riga per linea, e un numero uguale di elementi in ciascuna fila. Per esempio, se al di fuori di MATLAB si crea un file di testo che contiene queste quattro linee:

16.0 3.0 2.0 13.0
5.0 10.0 11.0 8.0
9.0 6.0 7.0 12.0
4.0 15.0 14.0 1.0

salvando poi il file sotto con il nome matrice.dat, basterà digitare al prompt di Matlab il seguente comando:

load matrice.dat

e Matlab leggerà il file e creerà un variabile con il nome matrice, contenente la nostra matrice d’esempio.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Come modificare le matrici in Matlab

MATLAB

Abbiamo già detto che Matlab è nato proprio dall’esigenza di trattare in modo semplice ed immediato le matrici, ed è quindi questo l’elemento di base che ogni funzione di Matlab avverte l’esigenza di modificare. In questa lezione poniamo l’attenzione su alcune funzioni che consentono di manipolare matrici e vettori.

La funzione abs applicata ad una matrice reale, produce la matrice dei valori assoluti. Applicata ad un numero complesso, ne calcola il modulo. Esempio:

>> A=[-1 -4;-5 6]

A =

    -1    -4
    -5     6

CLICCA PER CONTINUARE A LEGGERE

Generazione di matrici in Matlab

MATLAB

Quando operiamo con le matrici, spesso dobbiamo costruire la matrice su cui effettuare dei calcoli da dati che sono a nostra disposizione, allora si dimostrano particolarmente utili una serie di funzioni buil-in che l’ambiente matlab contiene al suo interno.

Grazie all’utilizzo di tali funzioni sarà possibile costruire tali funzioni in modo semplice e veloce, vediamo allora degli esempi di tali funzioni in ambiente Matlab. Di seguito è riportato un elenco di utili funzioni per la costruzione di matrici:

eye(10)      –  Matrice identità
zeros(10)    – Matrice di zeri
ones(10)     – Matrice di 1
diag(A)       – Matrice diagonale
triu(A)         – Matrice diagonale superiore
tril(A)          – Matrice diagonale inferiore
rand(10)      –  Matrice con numeri casuali
hilb(5)          –  Matrice di Hilbert
magic(5)      –  Matrice magica
toeplitz         – Matrice di toeplitz

Ad esempio, zeros(m, n) produce una matrice mxn di zeri e zeros(n) produce un vettore di zeri; se A è una matrice, allora zeros(A) produce una matrice di zeri delle stesse dimensioni di A.

Se x è un vettore, diag (x) è la matrice diagonale con x lungo la diagonale, se A è una matrice quadrata, allora diag (A) è un vettore costituito dalla diagonale di A.

Le matrici possono essere costruite con blocchi. Per esempio, se A è un 3-x-3 matrice, allora

B = [A, zeros(3,2); zeros(2,3), eye(2)]

costruirà una matrice 5-x-5 .

generatore.matrici

Vediamo altri esempi:

Z = zeros(2,4) Z =
0 0 0 0
0 0 0 0

F = 5*ones(3,3) F =
5 5 5
5 5 5
5 5 5

N = fix(10*rand(1,10)) N =
4 9 4 4 8 5 2 6 8 0

R = randn(4,4) R =
1.0668 0.2944 -0.6918 -1.4410
0.0593 -1.3362 0.8580 0.5711
-0.0956 0.7143 1.2540 -0.3999
-0.8323 1.6236 -1.5937 0.6900

zeros All zeros

ones All ones

rand Uniformly distributed random elements

randn Normally distributed random elements.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Le funzioni in Matlab

MATLAB

MATLAB prevede un gran numero di funzioni matematiche standard, tra le quali ci sono abs, sqrt, exp, e sin. La radice quadrata o il logaritmo di un numero negativo non è considerato un errore; il risultato complesso è prodotto in modo automatico. MATLAB prevede anche funzioni matematiche molto più avanzate, come le funzioni di Bessel e le gamma function.

La maggior parte di queste funzioni accettano argomenti complessi. Per avere un elenco delle funzioni matematiche elementari, basterà digitare al prompt di matlab:

help elfun

Per un elenco più avanzato delle funzioni matematiche e delle matrici digitare:

help specfun
help elmat

Alcune delle funzioni, come sqrt e sin, sono calcolate al momento in quanto sono parte del cuore di MATLAB quindi sono molto efficienti, ma i dettagli della computazione non sono prontamente accessibili. Le altre funzioni, come gamma e sinh sono perfezionate in M-files. Si può vedere il codice originario che le valuta ed eventualmente anche cambiarlo.

Molte funzioni speciali prevedono valori di costanti utili. Il valore infinito è generato dividendo un valore diverso da zero per zero, o valutando espressioni matematiche definite che tendono all’infinito. Il valore Not-a-number è invece generato tentando di valutare espressioni tipo 0/0 o Inf-Inf che non hanno valori matematici ben definiti. I nomi delle funzione non sono riservati. E’ quindi possibile utilizzare alcuni di tali nomi come una nuova variabile, ad esempio:

eps = 1.e-6

e poi usare quel valore in calcoli susseguenti. La funzione originale può essere ripristinata con il comando:

clear eps

funzioni.matlab2Alcuni nomi sono associati a precisi valori, come ad esempio:

pi : 3.14159265…
i : unità Immaginaria,
j : come i
eps : Floating-point con precisione, 2 -52
realmin : il più piccolo floating-point, 2 -1022
realmax : il più grande floating-point,(2-e)2 1023
Inf : Infinito
NaN : Not-a-number.

Abbiamo già ha visto molti esempi di espressioni di MATLAB. Di seguito ci sono altri esempi, e sono riportati i valori che ne risultano.

rho = (1+sqrt(5)) /2 rho = 1.6180
a = abs(3+4i) a = 5
z = sqrt(besselk(4/3,rho-i)) z = 0.3730+ 0.3214i
huge= l’exp(log(realmax)) huge = 1.7977e+308
toobig = il pi*huge toobig = Inf.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Le operazioni aritmetiche in Matlab

MATLAB

Le operazioni possibili in ambiente MATLAB sono di tre tipi:

  1. aritmetiche,
  2. relazionali
  3. logiche.

In questo articolo ci soffermeremo solo sulle operazioni aritmetiche per lasciare spazio, in modo più dettagliato alle altre operazioni, in altri articoli.

Le operazioni aritmetiche disponibili sono:

  • + Addizione
  • – Sottrazione
  • * Moltiplicazione
  • / Divisione
  • \ Left division
  • ^ potenza
  • ‘ Asse coniugato complesso trasposto

Poichè MATLAB ha due tipi differenti di operazioni aritmetiche, un tipo per gli array e un tipo per le matrici, la moltiplicazione negli array deve essere preceduta dal punto, in modo da essere eseguita elemento per elemento; ad esempio se bisogna moltiplicare due vettori VET1 e VET2 bisognerà scrivere:

VET1.*VET2

prestando attenzione alle corrette dimensioni dei vettori.

operatori.aritmetici.matlab

Vediamo un esempio:

>> VET1=[1 2 3 4]

VET1 =

     1     2     3     4

>> VET2=[5 6 7 8]

VET2 =

     5     6     7     8

>> VET1.*VET2

ans =

     5    12    21    32

Per quanto riguarda invece le operazioni di somma e sottrazione non ci sono differenze tra array e matrici e quindi non si deve aggiungere il punto.

>> VET1+VET2

ans =

     6     8    10    12

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Rappresentazione dei numeri in Matlab

MATLAB

Per rappresentare i numeri MATLAB utilizza una notazione decimale e convenzionale, con un punto decimale e opzionale ed indicando quantità positive o il segno meno, per numeri negativi.

In notazione scientifica i numeri vengono rappresentati attraverso l’impiego di una lettera per specificare la potenza decimale. I numeri immaginari usano invece i o j, come suffisso.

In accordo con lo Standard ANSI/IEEE 754-1985 per l’aritmetica binaria floating-point, qualunque sia il sistema di numerazione scelto, le singole cifre dei numeri di macchina sono rappresentate nel calcolatore secondo il sistema binario e quindi con una sequenza di bit. Tuttavia, ciò non significa che i numeri siano trattati come se fossero binari.

Degli esempi di numeri rappresentati correttamente in Matlab sono:

3 -99
0.0001
9.6397238
1.60210e-20
6.02252e23
1i
-3.14159j

3e5i

Tutti i numeri che usano il format long specificato dall’IEEE sono immagazzinati internamente con lo standard floating-point. I numeri floating-point hanno una precisione limitata di 16 cifre decimali significative e una serie limitata da 10^-308 a 10^308+. (Il computer di VAX usa una configurazione diversa, ma la sua precisione e serie sono quasi le stesse.)

numeri.matlab

Nella rappresentazione floating point ogni numero può essere scritto come:

a = pN q

dove:

  • p è un numero reale.
  • N è la base del sistema di numerazione (nel caso binario N = 2).
  • q è un numero intero tale che m ≤ q ≤ M, m < 0 e M > 0

Fissata la base binaria, ogni numero reale a ≠ 0 è definito in modo univoco dalla coppia (p,q),
rispettivamente mantissa e caratteristica (esponente) di a.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Le variabili in Matlab

MATLAB

Una variabile è un insieme di dati modificabili situati in una porzione di memoria (una o più locazioni di memoria) destinata a contenere dei dati, suscettibili di modifica nel corso dell’esecuzione di un programma. Una variabile è caratterizzata da un nome (inteso solitamente come una sequenza di caratteri e cifre).

MATLAB non richiede alcuna dichiarazione del tipo e della dimensione di una variabile. Quando MATLAB incontra un nome variabile nuovo, crea automaticamente la variabile e stanzia l’ammontare adatto in deposito.

Se la variabile già esiste, MATLAB cambia i suoi contenuti e, se necessario, effettua un nuovo deposito.Per esempio definiamo la seguente variabile:

>> elenco = 30

elenco =

    30

crea una matrice 1-by-1 (monodimensionale) di nome elenco e immagazzina il valore 30 come suo singolo elemento. I nomi delle variabili consistono di una lettera, seguita da qualsiasi numero di lettere, cifre o simbolo di sottolineatura.

variabili

MATLAB usa solamente i primi 31 caratteri di un nome di una variabile. MATLAB è inoltre case sensitive; distingue quindi tra uppercase e lowercase. A ed a non sono la stessa variabile.

Per analizzare la matrice assegnata a ciascuna variabile, basta semplicemente digitare il nome della variabile.

Ricordiamo infine che quando nel workspace di Matlab viene creata una variabile a cui non siè dato un nome, essa viene depositata nella varibile ans. La variabile ans viene creata quindi ogni volta che si esegue un’azione che non include una variabile MATLAB in modo da deporre il risultato in tale variabile. Ad esempio:

>>  [0:2:8]

ans =

0     2     4     6     8

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Le operazioni in Matlab

MATLAB

In MATLAB sono definite le seguenti operazioni aritmetiche:

1) addizione +
2) sottrazione –
3) moltiplicazione *
4) divisione /
5) elevamento a potenza ˆ

Quando l’espressione da valutare è troppo lunga per stare su di un’unica riga di comando,risulta possibile utilizzare un carattere di continuazione dato da . . . (tre punti). Ad esempio:

>> 1 + 1/4 + …
1/8

ans =

    1.3750

E’ possibile verificare che poichè in MATLAB non vi è alcuna distinzione tra variabili intere, reali o complesse, il risultato dell’operazione di elevamento a potenza nel caso di esponenti frazionari può non corrispondere a quello naturalmente atteso. Ad esempio, volendo calcolare la radice cubica di -5, si ottiene:

>>  (-9)^(1/5)

ans =

   1.2555 + 0.9122i

quindi un numero immagginario al posto di un numero reale. Il problema è dovuto al fatto che MATLAB, lavorando in notazione complessa, calcola come prima radice cubica di -9 una delle due con parte immaginaria non nulla.

Anche in MATLAB è possibile alterare le precedenze classiche delle operazioni aritmetiche mediante l’uso opportuno delle parentesi tonde. Ad esempio, se nel caso precedente si fosse scritto ( – 9)*1/5 si sarebbe ottenuto il valore -1.8000 ossia, giustamente, – 9/5.

>> (- 9)*1/5

ans =

   -1.8000

operazioni.matlab

Per quanto riguarda i vettori, le operazioni elementari si estendono (quando ben definite) in modo del tutto naturale, con l’eccezione delle operazioni di divisione e di elevamento a potenza. Ad esempio,

>> a = [1:4];
>> b = [1:3];
>> c = [3 2 6 -1] ;

>> a+c (somma di vettori riga)

ans =

     4     4     9     3

>> a-c (differenza di vettori riga)

ans =

    -2     0    -3     5

>> a+b
??? Error using ==> plus
Matrix dimensions must agree.
 
>> a*c
??? Error using ==> mtimes
Inner matrix dimensions must agree.

Le ultime istruzioni ci indicano che, le operazioni fra vettori sono valide solo se le dimensioni sono consistenti. Infatti, dato un vettore riga s di dimensione n (ossia una matrice 1 * n) ed un vettore colonna d di dimensione m, si potrà eseguire il prodotto scalare s*d solo se m=n (ottenendo in tal caso uno scalare).

>> s=[1:4];

>> d=[1;2;3;4];

>> s*d

ans=
             30

Quindi d*s fornirà una matrice m*n.

>> s=[1:4];

>> d=[1;2;3;4];

>> M=d*s

M =

     1     2     3     4
     2     4     6     8
     3     6     9    12
     4     8    12    16

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

MATLAB

Operatore due punti in Matlab

MATLAB

L’operatore : (due punti)
L’operatore due punti rappresenta uno dei più importanti operatori di MATLAB. Si trova in molte forme diverse. Ad esempio l’espressione seguente:

1:10

rappresenta un vettore riga che contiene i numeri interi da 1 a 10

1 2 3 4 5 6 7 8 9 10

Per ottenere una specifica sequenza invece, si deve indicare un incremento. Per esempio:

>> 100:-7:50

ans =

   100    93    86    79    72    65    58    51

cioè una sequenza di numeri da 100 a 50 con passo uguale a -7; mentre

>> 0:pi/4:pi

ans =

         0    0.7854    1.5708    2.3562    3.1416

operatore.matlab
Le espressioni sottoscritte che coinvolgono l’operatore due punti assegnano porzioni di una matrice. Ad esempio assegniamo la solita matrice:

A=[1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]

ed estraiamone alcuni valori:

A(1:k,j)

rappresenta i primi k elementi della colonna jth di A. Allora estraiamo alcuni elementi:

>> A(1:4,4)

ans =

     4
     8
    12
    16

e calcoliamo la somma della quarta colonna.

>> sum(A(1:4,4))

ans =

    40

Il due punti assegna tutti gli elementi in una riga o colonna di una matrice e la keyword END  assegna l’ultima riga o colonna. Così

>> sum(A(:,end))

ans =

    40

calcola la somma degli elementi nell’ultima colonna di A.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Accesso agli elementi di una matrice in Matlab

MATLAB

Come accedere agli elementi di una matrice in Matlab

Vediamo in questa lezione come accedere agli elementi di una matrice in ambiente Matlab; per prima cosa quindi inseriamo nel workspace di Matlab una matrice di esempio:

>> A=[1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]

A =

     1     2     3     4
     5     6     7     8
     9    10    11    12
    13    14    15    16

L’elemento in riga i e colonna j di A è denotato con il simbolo A(i,j). Ad esempio:

>> A(4,2)

ans =

    14

è il numero nella quarta riga e seconda colonna. Per la nostra matrice corrisponde a 14. Così risulta possibile calcolare la somma degli elementi nella quarta colonna di A digitando:

A(1,4) + A(2,4) + A(3,4) + A(4,4)

Questo produce:

>> A(1,4) + A(2,4) + A(3,4) + A(4,4)

ans =

    40

ma non è il modo più elegante di sommare una singola colonna. E’ anche possibile per accedere agli elementi di una matrice utilizzare un singolo pedice, A(k). Questo è il modo solito di accedere agli elementi di vettori riga e vettori colonna.

elementi.matlab

Ma si può anche applicare ad una matrice bidimensionale in questo caso la matrice è considerata come un vettore colonna, formato dalle colonne della matrice originale. Così, per la nostra matrice, A(8) è un altro modo di individuare il valore 14 immagazzinato nella posizione A(4,2), cioè quarta riga seconda colonna.

>> A(8)

ans =

    14

Se si tenta di accedere agli elementi di una matrice al di fuori di essa, si commette un  errore:

>> t = A(4,5)
??? Attempted to access A(4,5); index out of bounds because size(A)=[4,4].

(Messaggio di errore)

D’altra parte, se si immagazzina un nuovo valore in un elemento della matrice che eccede il suo ordine, c’`e un aumento dell’ordine per accomodare il nuovo venuto:

>> A(4,5) = 17

A =

1     2     3     4     0
5     6     7     8     0
9    10    11    12     0
13    14    15    16    17

I vettori vengono trattati in Matlab in modo del tutto analogo. È possibile visualizzare le singole voci di un vettore, dopo averlo definito nel modo seguente:

V=[2 1 3 4];

per visualizzare la prima voce è sufficiente digitare:

>> V (1)
ans =
2

Questo comando stampa il primo elemento nel vettore. Si noti inoltre che una nuova variabile chiamata ans è stata creata.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO: