MATLAB, HELP E DOCUMENTAZIONE
Il Matlab è un ambiente che permette in modo interattivo,senza la necessità di consultare corposi manuali, di ottenereinformazioni e visualizzare documentazione ed esempi. Èbuona prassi utilizzare in modo intensivo tali funzionalità perl’autocorrezione e per l’apprendimento.Ecco alcune possibilità:
• Supponiamo di conoscere il nome del comando(funzione) Matlab o della variabile riservata Matlab su cuivogliamo acquisire informazioni dettagliate. Utilizziamo ilcomando help o il comando doc. Esempi:
>> help log
>> doc log
Come si vede, le informazioni del comando help vengonofornite nella finestra comandi, e quelle del comando doc,
MATLAB, HELP E DOCUMENTAZIONE 1
spesso più estese, vengono visualizzate in una finestra aparte ed estratte dal manuale Matlab online ottenibileanche dando il comando senza argomenti. Una finestra diricerca permette di trovare, tramite parole chiave, quello acui si è interessati.>> doc
Talvolta l’uscita del testo del comando help è lunga. Puòessere utile utilizzare all’inizio sessione il comando>> more on
La visualizzazione dei comandi verrà proposta pagina perpagina (si passa alla successiva con la barra spaziatrice).
• Supponiamo di voler conoscere il nome del comando(funzione) Matlab che contiene nella sua descrizione unacerta parola. Esempio:
>> lookfor logarithm
MATLAB, HELP E DOCUMENTAZIONE 3
COSTANTI NUMERICHE REALI
Matlab usa per un numero la convenzionale notazionedecimale, con un opzionale punto decimale, un segno (+ o-) che lo precede e la notazione esponenziale comepotenza di 10.Esempi di costanti numeriche:
3 -99 0.0001
9.6397238 1.60210e-20 -6.02252e23
I numeri vengono di default memorizzati internamente indoppia precisione (64 bit=8 bytes, IEEE floating-pointstandard, rango rappresentabile circa 10−308 – 10+308, circa16 cifre decimali significative rappresentabili).Provate a dare il comando seguente. Cosa ottenete?
>> 36028797018963968-36028797018963972
COSTANTI NUMERICHE REALI 5
Regola: Il segno del numero può essere seguito da uno o piùspazi bianchi, prima del numero stesso, ma non si devonoinserire spazi bianchi all’interno del numero, prima e dopodel carattere esponenziale e, prima e dopo dell’eventualesegno dell’esponente.Si provi a dare:
>> -1.634e-20
>> - 1.634e-20
>> -1.634 e-20
>> -1.634e -20
>> -1.634e- 20
COSTANTI NUMERICHE REALI 7
VARIABILI
Otteniamo il risultato seguente
ans =
0
Perchè otteniamo 0?
Cos’è ans?
È il nome di una speciale variabile Matlab a cui vieneassegnato il risultato di un’espressione quando tale risultatonon è assegnato ad una variabile.
VARIABILI 9
Altre variabili riservate che hanno un valore predefinito inMatlab:
pi 3.14159265...
eps Floating-point relative precision,
realmin Smallest floating-point number,
realmax Largest floating-point number,
Inf Infinity
NaN Not-a-number
Provate i comandi:
>> 34/0
>> 0/0
>> Inf/Inf
>> Inf-Inf
>> Inf^Inf
Che valore assume la variabile ans?
VARIABILI 11
Come creare, definire ed usare le variabili in Matlab:
• Scegliere i nomi (consigliato utilizzare solo caratterialfanumerici, il primo deve essere obbligatoriamentealfabetico). Ammesso il simbolo di trattino basso(underscore) _
• Assegnare dei valori ai nomi di variabile:
>> var1 = -12.3
>> var2 = 7e-2
• Usare i valori assegnati per ottenere il risultato diun’espressione che utilizzi i nomi di variabileprecedentemente assegnati:
>> var1+2*var2-5.3
VARIABILI 13
• Assegnare il risultato di un’espressione ad un’altravariabile:
>> var3 = var1+2*var2-5.3
Che differenza si nota negli ultimi due casi?
Attenzione: Non si possono inserire spazi bianchi all’interno diun nome di variabile! E non sempre viene segnalato errore:
>> var 1+2*var2-5.3
>> var1+2*var 2-5.3
>> var1 + 2 * var2 - 5.3
Ma come si vede, si possono inserire spazi bianchi prima edopo gli operatori matematici.Non si possono utilizzare o visualizzare variabili che non sianostate precedentemente assegnate:
>> var3 = var6+2
VARIABILI 15
• Dichiarazione di variabili predefinita dal tipo di valoreassegnato! Anche i numeri assegnati a variabili vengonodi default memorizzati internamente in doppiaprecisione.
• Esistono altri tipi di variabili numeriche che possonoessere esplicitamente definite tramite funzioni Matlab;ecco alcuni esempi:
logical - Convert numeric values to logical.
single - Convert to single precision.
uint32 - Convert to unsigned 32-bit integer.
int16 - Convert to signed 16-bit integer.
double - Convert to double precision.
Per una completa lista dare il comando
>> help datatypes
VARIABILI 17
• Attenzione: Nella definizione e nell’uso, i nomi di variabilisono case sensitive:
>> var1 = -12.3, var2 = 7e-2
>> var3 = VaR1+2*vAr2
Cosa si ottiene? Viene segnalato un errore! Perchè solonella prima variabile e non nella seconda?
• Concatenazione di comandi: nell’esempio precedenteabbiamo visto che due comandi di assegnazionepossono essere inseriti nella stessa linea comando,separandoli con una virgola.
• Soppressione dell’uscita del risultato sulla finestracomandi: si provino i seguenti comandi:
>> var1 = -12.3;
>> var2 = 7e-2;
>> var3 = var1+2*var2
VARIABILI 19
Cosa cambia?Attenzione: la soppressione dell’uscita del risultato NONsignifica che il comando NON viene eseguito!Anche con il carattere ; può essere effettuata laconcatenazione:
>> var1 = -12.3; var2 = 7e-2; var3 = var1+2*var2
Che differenza si nota inserendo
>> var1 = -12.3; var2 = 7e-2; var3 = var1+2*var2;
Posso scrivere???
>> var1 = -12.3 var2 = 7e-2 var3 = var1+2*var2;
Ovviamente NO! Ottengo un errore. Perchè?Ma posso scrivere, ad esempio
>> var1 = -12.3 , var2 = 7e-2 ; var3 = var1+2*var2;
VARIABILI 21
ESPRESSIONI NUMERICHE: Le espressioni numeriche vengonocostruite utilizzando costanti, variabili (precedentementeassegnate!!!), operatori matematici e funzioni matematiche.
Operatori matematici:
+ Addition
- Subtraction
* Multiplication
/ Division
^ Power
( ) Specify evaluation order
Attenzione a come si scrivono le espressioni matematiche.L’uso delle parentesi rotonde è importante!Esempio: dare i comandi
>> a = 5; b = 10;
VARIABILI 23
Si noti la differenza nei risultati di queste due espressioninumeriche
>> (2*a-b)/2
>> 2*a-b/2
Funzioni matematiche:Dare i comandi
>> help elfun % funzioni matematiche elementari
>> help specfun % funzioni matematiche speciali
VARIABILI 25
COMMENTI E DOCUMENTAZIONE
È un comando Matlab quanto viene scritto dopo il carattere%? Ovviamente no! È semplicemente un commento alcomando precedente, per aggiungere un’informazioneesplicativa al comando stesso.Ciò può essere sempre fatto con la seguente regola:Tutti i caratteri che in una riga comando seguono il carattere%, fino alla fine della riga, vengono trascurati dal Matlab esono solamente dei commenti utili all’utente.
Dare i comandi
>> % Esempio elementare
>> a = 5; % assegno alla variabile a il valore 5
>> b = 10; % c = 20;
>> d = a+b+c
COMMENTI E DOCUMENTAZIONE 27
Cosa accade?
Perchè?
Come effettuare la correzione in modo che venga calcolatoil risultato dell’espressione ed assegnato alla variabile d?
Si noti che nella finestra comandi i caratteri di commentosono in colore verde!
COMMENTI E DOCUMENTAZIONE 29
ANCORA SULLE VARIABILI E FUNZIONI
Consideriamo le funzioni matematiche elementari sin e cos.Si ricordi che l’argomento deve essere espresso in radianti.Se l’angolo è espresso in gradi si deve usare la funzione sind
oppure cosd. Ciò vale per tutte le funzioni trigonometriche incui si deve utilizzare la funzione corretta in dipendenzadell’argomento (espresso in radianti oppure in gradi).Si diano i comandi
>> cos(pi)
>> cos(2*pi)
>> sin(pi/2)
>> sin(3*pi/2)
I risultati sono esatti?Si diano i comandi seguenti il cui risultato esatto dovrebbeessere 0
ANCORA SULLE VARIABILI E FUNZIONI 31
>> cos(pi/2)
>> cos(3*pi/2)
>> sin(pi)
>> sin(2*pi)
>> sin(0)
Cosa si ottiene? Perchè?Un’aiuto per dare una risposta si trova negli aiuti online dimatlab (in help pi oppure in doc pi???)Sono gli effetti della precisione finita del computer!
Possiamo assegnare un valore ad una variabile riservata o auna funzione intrinseca Matlab?la risposta è SI, nel senso che non viene segnalato dalMatlab un errore, ma gli effetti sui comandi successivi sonoimprevedibili e generano errori!!!
ANCORA SULLE VARIABILI E FUNZIONI 33
Guardiamo prima le variabili che sono presenti nelworkspace. Ritroviamo tutte le variabili che abbiamo definitoavendo assegnato loro dei valori. Ma non vediamo lefunzioni sin e cos, e non vediamo la variabile riservata pi.Vediamo solamente la variabile speciale ans. Questo ènormale nel Matlab!
Proviamo ora
>> sin = 5.2
Cosa si vede ora nel workspace? Appare una variabile dinome sin il cui contenuto corrisponde al numero decimale5.2. Ma . . . da ora in poi non potremo pù utilizzare la funzionesin per calcolare il seno trigonometrico di un angoloespresso in radianti!
ANCORA SULLE VARIABILI E FUNZIONI 35
Proviamo infatti
>> sin(0)
Cosa otteniamo? . . . Un’incomprensibile messaggio di errore:
??? Subscript indices must either be real positive integers or logicals.
Incomprensibile per ora. Ritorneremo a questo esempio inseguito.
Esempio ancora più pericoloso!!
>> pi = 10 ; cos(pi)
Non otteniamo un errore, bensì un risultato completamenteerrato!!! Anzichè -1, otteniamo
ans =
-0.8391
ANCORA SULLE VARIABILI E FUNZIONI 37
E adesso????? Guardiamo il nostro workspace, oppurediamo il comando
>> whos
Con il quale otteniamo nella finestra comandi, similiinformazioni
Name Size Bytes Class Attributes
a 1x1 8 double
ans 1x1 8 double
b 1x1 8 double
pi 1x1 8 double
sin 1x1 8 double
var1 1x1 8 double
var2 1x1 8 double
var3 1x1 8 double
ANCORA SULLE VARIABILI E FUNZIONI 39
Vogliamo correggere le sciocchezze che abbiamo fatto eritornare ai valori ed alle funzionalità originali per sin e pi.Facile! Abbiamo il comando Matlab clear. Diamo
>> clear sin
>> clear pi
oppure direttamente
>> clear sin pi
ed ora tutto è ritornato normale (guardiamo il workspace).Infatti le seguenti istruzioni ora danno i risultati attesi
>> sin(0) , cos(pi)
Pulizia di tutte le variabili ed eventuali funzioni del workspace(guardiamo dopo tale comando il workspace e diamo ilcomando whos):
>> clear all
ANCORA SULLE VARIABILI E FUNZIONI 41
CONSIGLIO:
Quando si vuole dare un nome particolare ad una variabile,verificare sempre prima che tale nome non sia già uno diquelli di comandi (funzioni) o variabili speciali Matlab.Se ad esempio si pensa di usare il nome eps per memorizzarviun valore che vogliamo dare alla costante matematica ε, eprima di farlo diamo il comando
>> help eps
ci accorgeremo che è il nome di una variabile riservataMatlab. Quindi dovremo cambiare nome, per non avereproblemi!Un altro comando Matlab che fornisce risposte piùdettagliate, anche su variabili già presenti nel workspace ofunzioni create dall’utente, è il comando exist. Si guardil’help o il doc per la sintassi d’uso e per i valori restituiti. Si provi
>> exist('eps')
ANCORA SULLE VARIABILI E FUNZIONI 43
SEMPLICE O DOPPIA PRECISIONE: Come si è detto, il Matlab, didefault, attribuisce alle variabili a cui viene assegnato unvalore numerico (costante numerica o risultati diun’espressione numerica) la doppia precisione (8 bytes). Èperò possibile, ed è anche utile per verificare i problemilegati all’aritmetica del computer, definire costanti e variabiliin semplice precisione. Verifichiamo di aver ripulito ilworkspace, e diamo i seguenti comandi.
>> ad = 123456789
>> as = single(123456789) % oppure as = single(ad)
>> add = double(as)
Che cosa possiamo notare nei tre risultati? Perchè?(guardiamo il workspace ed usiamo l’help o il doc per icomandi single e double).
ANCORA SULLE VARIABILI E FUNZIONI 45
Sinora il Matlab ci ha fornito per i valori numerici il formato didefault (5 cifre e formato con punto di radice fisso oppureesponenziale, in dipendenza del valore). Formato significamodalità di visualizzazione e NON di memorizzazione.Si provi a dare
>> pi , single(pi) , double(single(pi)) , 0.052 , -0.000052
Apparentemente non c’è nulla di strano!? Ma oracambiamo tipologia di visualizzazione (7 cifre per valori insemplice precisione, 15 per valori in doppia precisione,formato con punto di radice fisso oppure esponenziale, indipendenza del valore) con il seguente comando
>> format long
e ripetiamo la precedente istruzione.
I valori visualizzati per π greco sono tutti diversi! Perchè?
ANCORA SULLE VARIABILI E FUNZIONI 47
Per ritornare alla modalità di default, basta dare il comandoseguente (ma abbiamo visto che il formato long è più utile!).
>> format % oppure format short
Esistono altri formati (vedere l’help o il doc format).
Vediamo ora un altro esempio (da effettuare con il formatodi default ad anche con il formato long), i cui risultati sono dacapire.
>> a2 = 1/3 , b2 = 3*a2
>> a1 = single(1/3) , b1 = 3*a1
ed un altro ancora
>> % 5 nove finali, 6 nove finali, 7 nove finali
>> single(1.199999), single(1.1999999), single(1.19999999)
>> 1.199999, 1.1999999, 1.19999999 % 5 nove finali, 6 finali, 7 finali
>> 1.199999999999999, 1.1999999999999999 % 14 nove finali, 15 finali
ANCORA SULLE VARIABILI E FUNZIONI 49
VARIABILI STRINGA DI CARATTERI
Esistono altre variabili la cui dichiarazione è predefinitaquando ad esse si assegna un valore:sono le variabili stringa di caratteri.Scriviamo
>> cognome = 'Redivo Zaglia'
Che cosa vediamo nella finestra comandi? Che cosavediamo nel workspace?Il valore assegnato alla variabile cognome è costituito dallasequenza di caratteri che abbiamo assegnata (senza icaratteri apice ’ che precedono e seguono la sequenza dicaratteri!). Nel workspace il tipo di variabile Class = char
viene definito per il fatto che ho assegnato a tale nome divariabile una costante stringa (sequenza di caratteri).
VARIABILI STRINGA DI CARATTERI 51
Il secondo valore del Size (1× 13) indica il numero di caratteriche costituiscono la stringa.Si noti che il carattere spazio bianco all’interno, vieneconteggiatoScriviamo
>> cognome = ' Redivo Zaglia'
Ora la variabile è costituita da 14 caratteri, percè vieneconteggiato anche il primo blank (spazio bianco). Gli apiciservono a delimitare la sequenza di caratteri e ad indicareche la costante è di tipo stringa, non fanno parte dellastringa e non vengono memorizzati.E se nella mia stringa voglio inserire il carattere apice?Basta indicarlo con due apici consecutivi. Scriviamo
>> cognome = 'Dell''Accio'
Cosa viene memorizzato? Quanti caratteri?
VARIABILI STRINGA DI CARATTERI 53
Scriviamo ora
>> nome = 'Francesco'
ed usiamo i comandi Matlab per comporre il nome ecognome assieme
>> S = strcat(nome,cognome)
oppure
>> S = [nome,cognome]
Cosa viene memorizzato? Guardare anche il workspace.Modificare i comandi precedentemente dati in modo che visia uno spazio bianco tra nome e cognome. Diamo ora
>> S1 = char(nome,cognome)
Che differenza si nota nel workspace ed in quanto vienemostrato? Si guardi il size.
VARIABILI STRINGA DI CARATTERI 55
UN PO’ DI ESEMPI (È FACILE SBAGLIARE, E LE CONSEGUENZE SONO
IMPREVEDIBILI!): Si diano una alla volta i seguenti comandi e siconfrontino tra loro le risposte date dal Matlab (si guardianche il workspace):
>> clear all
>> a = 2
>> as = '2'
>> a1 = a + 10
>> a2 = as + 10
>> a3 = str2num(as) + 10
>> a4 = num2str(a) + 10
Si cerchi anche il significato (help o doc) delle due funzionistr2num e num2str.
VARIABILI STRINGA DI CARATTERI 57
SCRIPT M-FILE
Il Matlab opera in modalità interprete di comandi nel sensoche ciascun comando fornito viene verificato per la suacorrettezza sintattica. Se il comando è sintatticamentecorretto (anche se non lo è sematicamente!), il comandoviene prima tradotto in linguaggio macchina, poi eseguito, esuccessivamente è possibile dare un altro comando.Anzichè fornire una sequenza di comandi direttamente nellaapposita finestra Matlab, è possibile raggrupparli in unoScript M-file Matlab.
Lo script Matlab è un file esterno, memorizzato nel directorycorrente in cui si sta lavorando (Current Folder o CurrentDirectory).
SCRIPT M-FILE 59
Tale file
• contiene una collezione di comandi Matlab che sarannoeseguiti in sequenza logica;
• viene creato e modificato utilizzando l’Editor del Matlab;
• deve avere l’estensione di default di Matlab .m
Abitualmente tutti i comandi inseriti in uno script vengonoinseriti con il carattere punto e virgola di soppressionedell’uscita. Quando necessita dover visualizzare il valore diuna variabile o una costante (numerica o stringa di caratteri)viene utilizzato il comando disp che ha un effetto simile aquanto si ottiene sopprimendo il punto e virgola. Il comandoaccetta un solo argomento (che può anche essere unvettore o una matrice) entro parentesi rotonde .
SCRIPT M-FILE 61
Esempi (possono essere dati anche nella finestra comandi):
>> disp ('Ciao, come stai?');
>> disp (3.456782e-3)
>> alfa = 3.5;
>> disp(alfa)
>> alfa = 4.2
>> disp(alfa);
Si noti che l’inserimento o il non inserimento del carattere ;
alla fine del comando disp è irrilevante.
Tutte le variabili create mediante assegnazione da uno scriptrestano visibili nel workspace e riutilizzabili anche dopo che loscript ha esaurito l’esecuzione delle istruzioni in essocontenute.
SCRIPT M-FILE 63
COME CREARE ED ESEGUIRE UNO SCRIPT:
• Creare un nuovo file script (barra in alto, File –> New –>Script oppure icona).
• Nella finestra Editor che si apre, si inseriscono i comandi(stesse regole della finestra comandi) ed i commenti. Icomandi non vengono eseguiti in tale fase!!! Esempio:
%
% Questo e' uno script di prova
%
disp('Ciao! Buona giornata. Segue la data e l''ora. ')
%
% Il comando datestr(now) restituisce la stringa di caratteri
% che contiene la data attuale e l'ora
%
data = datestr(now);
disp (data);
SCRIPT M-FILE 65
• Salvare il file assegnandogli un nome (File –> Save as).Usiamo ad esempio il nome ciao.m. Il file viene salvatonel directory scelto dall’utente.
• Eseguire lo script: spostarsi nella finestra comandi e dare ilnome del file, ovvero
>> clear all
>> ciao
Cosa si vede nel workspace?Il nome del file deve essere dato senza l’estensione .m. Siprovi
>> ciao.m
Attenzione: il file deve trovarsi nel directory corrente. Se èstato salvato altrove, si deve cambiare, nell’appositafinestra Matlab, il directory corrente.
SCRIPT M-FILE 67
COME MODIFICARE UNO SCRIPT:
• Aprire il file (barra in alto, File –> Open oppure icona) eselezionare il file da modificare.
• Fare le modifiche.
• Salvare il file, con lo stesso nome o cambiando il nome senecessario.
Dopo il salvataggio si può rieseguire lo script dalla finestracomandi.
Esempio: si modifichi il file ciao.m cambiando la frase dibenvenuto in
Ciao! Oggi e`:
Attenzione all’accento! Il simbolo di accento non è ugualeal simbolo apice!
SCRIPT M-FILE 69
ESERCIZIO
Si scriva uno script triangolo.m che, assegnati i valori dei duecateti, calcoli l’area ed il perimetro di un triangolorettangolo.
Si inseriscano commenti e si usi il comando disp pervisualizzare i risultati.
Si cerchi, si trovi e si usi, la funzione Matlab che calcola laradice quadrata di un numero (necessaria per . . . ).
ESERCIZIO 71
RIDEFINIZIONE DEL TIPO DI VARIABILI
Vogliamo sottolineare una caratteristica particolare diMatlab che lo differenzia da molti altri linguaggi classici diprogrammazione: il tipo (Class) della variabile non vieneassociato in modo definitivo ad un certo nome di variabilealla quale avevamo precedentemente assegnato un valore.
Il tipo può essere modificato a piacimento, se e quandoserve, semplicemente assegnando alla variabile con uncerto nome, i valori che ci interessano.Ad esempio, costanti reali in semplice o doppia precisione,costanti intere, stringhe di caratteri ed anche . . . vettori omatrici, un argomento che tratteremo in seguito.
RIDEFINIZIONE DEL TIPO DI VARIABILI 73
Vediamo cosa accade nel Workspace dopo l’esecuzione diquesti comandi (verificarli uno per volta):
>> clear all
>> alfa = 3.734567678383638
>> alfa = single(alfa)
>> alfa = num2str(alfa)
>> alfa = strcat(alfa,'76')
>> alfa = str2num(alfa)
>> alfa = [alfa , 2*alfa] % vettore double 1 riga x 2 colonne
>> alfa = [alfa ; 2*alfa] % matrice double 2 righe x 2 colonne
>> alfa = [alfa ; 2*alfa] % matrice double 4 righe x 2 colonne
>> alfa = [alfa , 2*alfa] % matrice double 4 righe x 4 colonne
>> alfa = num2str(alfa) % matrice char 4 righe x 46 colonne!!!!
>> clear alfa
RIDEFINIZIONE DEL TIPO DI VARIABILI 75
VETTORI E MATRICI
Vettore colonna di lunghezza 5 Vettore riga di lunghezza 4(matrice 5 righe e 1 colonna) (matrice 1 riga e 4 colonne)
x =
−2
8
4
0
5
y =
[−3 6 3 −4
]
Matrice 3 righe e 4 colonne:
A =
0 −6 8 1
−2 5 5 −3
7 8 0 3
VETTORI E MATRICI 77
ARRAY
I vettori e le matrici vengono memorizzate allo stesso modoin Matlab, e vengono indicate con il nome di array. In effettiil vettore colonna può essere considerato come una matriceche ha una sola colonna ed il vettore riga come unamatrice che ha una sola riga.
Come creare un vettore riga:
Inseriamo i valori tra parentesi quadre separati da spazibianci o da virgole o ambedue i modi. L’esempio seguentemostra alcuni modi equivalenti per creare un vettore riga.
>> riga = [-3 6 3 -4]
>> riga = [-3, 6, 3, -4]
>> riga = [-3 6, 3 -4]
Guardiamo il workspace ed usiamo il comando whos.
ARRAY 79
Come creare un vettore colonna:
Inseriamo i valori tra parentesi quadre separati dal caratterepunto e virgola oppure andiamo a capo riga o ambedue imodi. L’esempio seguente mostra ancuni modi equivalentiper creare il precedente vettore colonna.
>> colonna = [-2; 8; 4 ; 0 ; 5]
>> colonna = [-2
8
4
0
5]
>> colonna = [-2
8
4; 0 ; 5]
Guardiamo il workspace ed usiamo il comando whos.
ARRAY 81
DUE UTILI FUNZIONI:
• size: restituisce un vettore di due interi (il primo è ilnumero di righe ed il secondo il numero di colonne)
>> size(riga) >> size(colonna)
ans = ans =
1 4 5 1
• length: se l’argomento è un vettore (sia riga checolonna), restituisce un intero che indica il numero dicomponenti del vettore. E se è una matrice?
>> length(riga) >> length(colonna)
ans = ans =
4 5
ARRAY 83
Come creare una matrice:
Il modo più semplice consiste nel fornire i valori tenendopresente che il carattere punto e virgola oppure andare acapo riga indica l’inizio di una nuova riga della matrice.Ecco alcuni esempi equivalenti:
>> matrice = [0 -6 8 1 ; -2 5 5 -3 ; 7 8 0 3]
>> matrice = [0 -6 8 1
-2 5 5 -3
7 8 0 3]
>> matrice = [0 -6 8 1 ; -2, 5, 5, -3
7 8 0 3]
Guardiamo il workspace, usiamo il comando whos ed ilcomando size. Usiamo anche il comando length. Cosaotteniamo? Perchè? (si veda l’help oppure il doc).
ARRAY 85
I comandi che seguono generano errori. Perchè? Sicorreggano gli errori.
>> A = [-3 -1 ; 3 2 , 3 0]
>> A = [-3 -1;
3 2 , 3 0]
>> A = [-3 -1; 3
2 ; 3 0]
>> A = [-3 -1 ; 3 2 1; 3 0]
>> v = [1 -2 7
4 5]
>> v = [1, -2, 7; 4 5]
Ora possiamo capire come vengono memorizzate le stringhedi caratteri! Diamo ancora
>> cognome = ' Redivo Zaglia'
Guardiamo il workspace, usiamo i comandi whos, size elength. Cos’è una stringa di caratteri?
ARRAY 87
OPERAZIONI PER ARRAY
Le regole seguenti valgono sia per matrici che per vettori, inquanto i vettori sono array in cui una delle dimensioni vale 1.
ADDIZIONE E SOTTRAZIONE: Entrambe tali operazioni possonoessere effettuate solamente quando gli array hanno le stessedimensioni ed il calcolo viene effettuato tra gli elementi chesi trovano nelle stesse posizioni all’interno delle due array.
A =
0 −6 8
−2 5 5
B =
1 3 5
3 −5 2
C = A+B =
1 −3 13
1 0 7
D = A−B =
−1 −9 3
−5 10 3
OPERAZIONI PER ARRAY 89
In Matlab scriveremo semplicemente
>> A = [ 0 -6 8 ; -2 5 5 ]
>> B = [ 1 3 5 ; 3 -5 2 ]
>> C = A + B
>> D = A - B
Se scriviamo
>> A1 = [ 0 -6 ; 8 -2 ; 5 5 ]
>> B1 = [ 1 3 5 ; 3 -5 2 ]
>> C1 = A1 + B1
>> D1 = A1 - B1
otterremo errore. Perchè? E se scriviamo
>> x = [1, 2, -4, 6]; y = [-2; 3; -4; 5]; z = x+y ;
>> x1 = [1; 2; -4; 6]; y1 = [-2; 3; -4]; z1 = x1+y1 ;
cosa accade? Correggere, aiutandosi con il workspace ocon il comando whos.
OPERAZIONI PER ARRAY 91
Proviamo invece a scrivere
>> A = [ 0 -6 8 ; -2 5 5 ]; a = 3; C = A + a;
>> x = [1, 2, -4, 6]; y = 2; z = x-y ;
Non c’è errore quando uno degli operandi è uno scalare el’altro un array! Cosa viene eseguito? Cercare di capirlo.
MOLTIPLICAZIONE: Possiamo definirla usando il concetto dicombinazione lineare di vettori (colonna!).Sia α uno scalare e v un vettore, il prodotto αv è un vettore incui tutte le componenti sono moltiplicate per α. Ad esempio
α = 9, v =
3
4
−2
, αv =
27
36
−18
.
In Matlab l’operatore moltiplicazione è il carattere *
OPERAZIONI PER ARRAY 93
Potremo quindi scrivere
>> alfa = 9; v = [3;4;-2]; alfa*v
Attenzione: Cosa cambia se scrivo come segue?
>> alfa = 9; v = [3 4 -2]; alfa*v
Definiamo ora una combinazione lineare di vettori (colonna!)
α1 = 9, α2 = 3, α3 = 1 v1 =
3
4
−2
, v2 =
3
8
0
, v3 =
4
0
4
α1v1 + α2v2 + α3v3 = 9
3
4
−2
+ 3
3
8
0
+ 1
4
0
4
=
40
60
−14
.
OPERAZIONI PER ARRAY 95
Definiamo ora una matrice A le cui colonne siano i vettoriv1, v2 e v3 ed un vettore colonna x le cui componenti sianogli scalari α1, α2 ed α3:
A =
3 3 4
4 8 0
−2 0 4
, x =
9
3
1
Il prodotto di una matrice A per un vettore x è una semplicee compatta rappresentazione della combinazione linearedelle colonne della matrice A, utilizzando come scalari dellacombinazione lineare, le componenti del vettore x. Ovvero
Ax = 9
3
4
−2
+ 3
3
8
0
+ 1
4
0
4
=
40
60
−14
.
OPERAZIONI PER ARRAY 97
Attenzione: Il numero di colonne di A deve coincidere con ilnumero di componenti del vettore colonna x.
Verifichiamo con l’equivalenza delle due rappresentazioni.Scriviamo con il Matlab la prima (combinazione lineare):
>> alfa1=9; alfa2=3; alfa3=1; v1=[3;4;-2]; v2 =[3;8;0]; v3=[4;0;4]; alfa1*v1+alfa2*v2+alfa3*v3
L’istruzione che ho indicato è troppo lunga e fuoriesce dallapagina. È stato fatto espressamente! Può infatti accadereche si vogliano scrivere più istruzioni oppure che si debbascrivere un comando o un’espressione molto lunga, e chepertanto si ecceda la lunghezza della riga della finestracomandi (oppure il limite segnalato dall’editor Matlab).Si può continuare a scrivere nelle righe successive, maindicando al Matlab che si intende continuare quanto scrittonelle righe precedenti?
OPERAZIONI PER ARRAY 99
La risposta è affermativa: basta utilizzare tre punti consecutivi... (senza spazi bianchi) alla fine della riga che si intendecontinuare nella riga successiva.
Vediamo alcuni esempi (tutti sintatticamente corretti):
>> alfa1=9; alfa2=3; alfa3=1; v1=[3;4;-2]; v2 =[3;8;0]; v3=[4;0;4]; ...
alfa1*v1+alfa2*v2+alfa3*v3
>> alfa1=9; alfa2=3; alfa3=1; v1=[3;4;-2]; v2 =[3;8;0]; v3= ...
[4;0;4]; alfa1*v1+alfa2*v2+alfa3*v3
>> alfa1=9; alfa2=3; alfa3=1; v1 ...
=[3;4;-2]; v2 =[3;8;0]; v3=[4;0;4]; alfa1 ...
*v1+alfa2*v2+alfa3*v3
Ma si può anche sbagliare! Infatti:
>> alfa1=9; alfa2=3; alfa3=1; v1=[3;4;-2]; v2 =[3;8;0]; v3=[4;0;4] ...
alfa1*v1+alfa2*v2+alfa3*v3
>> alfa1=9; alfa2=3; alfa3=1; v1=[3;4;-2]; v2 =[3;8;0]; v ...
3= [4;0;4]; alfa1*v1+alfa2*v2+alfa3*v3
OPERAZIONI PER ARRAY 101
>> alfa1=9; alfa2=3; alfa3=1; v1= [3 ...
4;-2]; v2 =[3;8;0]; v3=[4;0;4]; alfa1 ...
*v1+alfa2*v2+alfa3*v3
Attenzione: Non confondiamoci! Queste due istruzionicreano due vettori diversi. Perchè?
>> v1 = [1 ...
2]
>> v2 = [1
2]
Riprendiamo il prodotto matrice–vettore e scriviamo con ilMatlab la seconda modalità:
>> A = [3 3 4; 4 8 0; -2 0 4]; x = [9; 3; 1]; A*x
Cosa accade invece se scrivo come segue? Perchè?
>> A = [3 3 4; 4 8 0; -2 0 4]; x = [9, 3, 1]; A*x
OPERAZIONI PER ARRAY 103
Vediamo ora il prodotto matrice–matrice. Sia A una matricen×m, B una matrice m× q. Il prodotto di due matrici C = AB
è una matrice n× q, le cui colonne sono formate da unasuccessione di prodotti matrice-vettore, effettuaticonsiderando la matrice A e, successivamente, tutte lecolonne della seconda matrice B.
Si noti che per poter eseguire tale prodotto, è necessarioche il numero di colonne della matrice A sia uguale alnumero di righe della matrice B. Il risultato C è una matriceavente lo stesso numero di righe di A e lo stesso numero dicolonne di B.
La j-esima colonna di C è la combinazione lineare dellecolonne di A utilizzando gli scalari estratti dalla j–esimacolonna di B.
OPERAZIONI PER ARRAY 105
Gli elementi di C = (cij) sono quindi dati dalle formule
cij =
m∑k=1
aikbkj , i = 1, . . . , n, j = 1, . . . , q.
Esempio:
A =
3 3 4
4 8 0
B =
9 −1 −2 0
3 0 1 −3
1 2 −1 5
C = AB =
40 5 −7 11
60 −4 0 −24
OPERAZIONI PER ARRAY 107
In Matlab
>> A = [3 3 4; 4 8 0];
>> B = [9 -1 -2 0; 3 0 1 -3; 1 2 -1 5];
>> C = A*B
La seguente operazione invece segnala errore! Perchè?
>> C = B*A
Attenzione: Se q = n, AB è una matrice n× n ed esiste ancheil prodotto BA (ma è una matrice m×m).Se n = m = q le matrici A e B sono entrambe quadrate con lastessa dimensione e lo sono anche le matrici prodotto AB eBA, ma il prodotto non è commutativo!
Ovvero AB ̸= BA (eccettuato casi particolari).
OPERAZIONI PER ARRAY 109
Esempio:
>> A = [3 3 4; 4 8 0; -2 3 5];
>> B = [9 -1 -2; 0 3 0; 1 -3 1];
>> A*B
>> B*A
TRASPOSIZIONE:
L’operazione di trasposizione viene utilizzata in algebralineare per trasformare una matrice n×m in una matricem× n.
L’operazione trasforma le righe della prima in colonne dellaseconda (e le colonne della prima, ovviamente, in righedella seconda).
OPERAZIONI PER ARRAY 111
Esempi:
A =
3 3 4
4 8 0
c =
9
3
r =[2 0 3
]
AT =
3 4
3 8
4 0
cT =[9 3
]rT =
2
0
3
In Matlab si usa in carattere apice '
>> A = [3 3 4; 4 8 0], c = [9; 3], r = [2 0 3]
>> AT = A', cT = c', rT = r'
Cosa si ottiene coi seguenti comandi?
>> s1 = c'*c, s2 = r*r'
>> H1 = c*c', H2 = r'*r
OPERAZIONI PER ARRAY 113
ELEVAMENTO A POTENZA INTERA: Questa operazione è validasolo per matrici quadrate (numero di righe coincidente con ilnumero di colonne) e, come nel caso degli scalari, Am,m ∈ N, significa effettuare il prodotto (matrice–matrice) di Aper se stessa, m volte. Ad esempio
A3 =
3 4
4 8
3 4
4 8
3 4
4 8
=
251 452
452 816
In Matlab
>> A = [3 4; 4 8]
>> A^3 % Equivalente ad A*A*A
Attenzione: Se l’array non è quadrato si ha un errore:
>> B = [3 4; 4 8; 3 5], B^4
Cosa accade se m è un intero negativo o un numero reale?
OPERAZIONI PER ARRAY 115
UTILI FUNZIONI PER ARRAY:
Si provino i comandi indicati e si cerchi di capire cosa vienecalcolato ed il tipo di dato restituito.
Per approfondimenti, utilizzare il comando help o doc
sum (somma di elementi)
>> v1 = [1 2 3 4], sum(v1)
>> v2 = v1', sum(v2)
>> A = [1 2; 3 4; 5 6], sum(A), sum(A,1), sum(A,2)
prod (prodotto di elementi)
>> v1 = [1 2 3 4], prod(v1)
>> v2 = v1', prod(v2)
>> A = [1 2; 3 4; 5 6], prod(A), prod(A,1), prod(A,2)
Si vedano anche cumsum, cumprod e diff
OPERAZIONI PER ARRAY 117
ESERCIZIO
Sia z = [0 -1 2 4 -2 1 5 3] e J = [5 2 1 6 3 8 4 7]. Sidetermini che cosa viene calcolato (anche dal punto di vistadel significato matematico) dalle seguenti istruzioni Matlab:
>> x = z', A = x*x', s = x'*x, w =x*J,
>> length(x), length(z)
>> size(A), size(x), size(z), size(s), size(w)
La virgola alla fine della prima riga genera un errore?
ESERCIZIO 119
INIZIAMO A PROGRAMMARE
LA STRUTTURA CONDIZIONALE SEMPLICE:
if x < 0 then if x < 0
print Il valore e‘ negativo disp('Il valore e` negativo')
end if end
Oppure, in forma compatta
if x < 0, disp('Il valore e` negativo'), end
LA STRUTTURA CONDIZIONALE ALTERNATIVA:
if x < 0 then if x < 0
print√x immaginaria disp('sqrt(x) immaginaria')
else else
r =√x r = sqrt(x)
end if end
INIZIAMO A PROGRAMMARE 121
LA STRUTTURA CONDIZIONALE MULTIPLA:
if x < 0 then if x < 0
print Il valore e‘ negativo disp('Il valore e` negativo')
else if x > 0 elseif x > 0
print Il valore e‘ positivo disp('Il valore e` positivo')
else else
print Il valore e‘ nullo disp('Il valore e` nullo')
end if end
La parte relativa all’else può anche essere omessa.
Esercizio:
Si scrivano tre script files corrispondenti alle tre forme distruttura condizionale.Si assegni poi nella finestra comandi un valore alla variabile x
e si eseguano in sequenza, sempre nella finestra comandi, gliscript creati, verificando che la risposta sia quella attesa.
INIZIAMO A PROGRAMMARE 123
ATTENZIONE AL CORRETTO USO DELL’indentation:
Si considerino i due seguenti script (volutamente scritti senzaindentation).
script1.m script2.m
if a > 0 if a > 0
if a >= 5 if a >= 5
disp(' 1 - Passa per 1') disp(' 2 - Passa per 1')
elseif a <= 2 end
disp(' 1 - Passa per 2') elseif a <= 2
end disp(' 2 - Passa per 2')
else else
disp(' 1 - Passa per 3') disp(' 2 - Passa per 3')
end end
Si provino tali due script, molto simili (differiscono solo per laposizione di un end) assegnando i valori a=-1, a=1, a=6.
INIZIAMO A PROGRAMMARE 125
Come si può notare, con lo stesso valore, il percorso logicoseguito non è lo stesso nei due script. Semanticamente nonsono uguali! Certamente il non corretto utilizzodell’indentation non aiuta a determinare quali dei due siaquello che realizza quanto si desidera. Vediamo quindi glistessi due script scritti con la corretta indentation.script1.m script2.m
if a > 0 if a > 0
if a >= 5 if a >= 5
disp(' 1 - Passa per 1') disp(' 1 - Passa per 1')
elseif a <= 2 end
disp(' 1 - Passa per 2') elseif a <= 2
end disp(' 2 - Passa per 2')
else else
disp(' 1 - Passa per 3') disp(' 1 - Passa per 3')
end end
INIZIAMO A PROGRAMMARE 127
ESPRESSIONI LOGICHE
Negli esempi precedenti, relativi alla struttura condizionale,abbiamo utilizzato delle semplici espressioni logiche, adesempio a > 0. Il risultato è uguale ad una costante logicache vale true, se la condizione è verificata, oppure false, sela condizione NON è verificata. Possiamo creare variabililogiche assegnando ad esse il risultato di un’espressionelogica, ovvero direttamente una delle uniche due costantilogiche esistenti (true e false).
Attenzione: Quando si assegna ad una variabile un valorelogico (sia esso una costante logica che il risultato diun’espressione logica) la Class della variabile è logical ma ilvalore che viene visualizzato NON è true e false, bensì 1 se ilvalore è true e 0 se il valore è false.
ESPRESSIONI LOGICHE 129
Esempi:
>> a = 5;
>> % si guardi nel workspace la Class della variabile pos
>> pos = a > 0; pos
>> a = -3;
>> pos = a > 0; pos
>> T = true
>> F = false
Cosa cambia con i seguenti comandi? (si ricordi che il tipo divariabile può essere ridefinito attraverso una nuovaassegnazione).
>> T = 1
>> F = 0
ESPRESSIONI LOGICHE 131
Possiamo costruire espressioni logiche molto articolateutilizzando gli operatori di relazione e gli operatori logici:
Operatori di relazione:
== Equal
~= Not equal
< Less than
> Greater than
<= Less than or equal
>= Greater than or equal
Operatori logici (per valori scalari logici):
&& Short-circuit logical AND
|| Short-circuit logical OR
~ Logical NOT
ESPRESSIONI LOGICHE 133
Costruiamoci con il Matlab la tabella dei risultati:
Operatore AND &&:
>> true && true
>> true && false
>> false && true
>> false && false
Operatore OR ||:
>> true || true
>> true || false
>> false || true
>> false || false
Operatore NOT �:
>> ~true
>> ~false
ESPRESSIONI LOGICHE 135
Gli operatori di relazione possono essere utilizzati anche suarray (che abbiano le stesse dimensioni!). In tal casooperano elemento per elemento e restituiscono una array ditipo logico (avente le stesse dimensioni) che ha per elementidelle costanti logiche.
>> A = [1 2 3; 4 5 6]; B = [9 2 3; 4 5 9];
>> ugual = A == B
Operatori logici (per array):
& Element-wise logical AND
| Element-wise logical OR
~ Logical NOT
Funzioni logiche (applicate ai vettori):
any True if any element of vector is nonzero
all True if all elements of vector are nonzero
ESPRESSIONI LOGICHE 137
Esempi:
>> A = [1 2 3; 4 5 6]; B = [9 2 3; 4 5 9]; C = [1 2 3; 4 5 7];
>> al = (A == B) | (A ~= C)
>> x = [1 0 3 -1], any(x), all(x)
>> y = [1; 4; -1; 2], any(y), all(y)
>> z = [0 0 0 0 0], any(z), all(z)
>> x=[1 2 3] ; y=[1 5 7] ; z=[10 11 12];
>> any(x==y), all(x==y), any(x==z), any(x~=y)
>> all(x~=y), all(x~=z), all(x<y), all(x<z)
Domanda: Cosa accade se si utilizzano le funzioni any ed all
con delle matrici? (usare i comandi help e doc!)
Domanda: Cosa accade con gli operatori di relazionequando uno dei due operandi è uno scalare e l’altro unarray? Si provi:
>> x = [1 0 3 -1], x >= 0, x == 1
>> A = [9 -2 3; 4 5 0], A > -1, A ~= 0
ESPRESSIONI LOGICHE 139
Esercizio: Si scrivano le espressioni logiche Matlab checorrispondono alle seguenti richieste:
• Data una variabile a, si vuole verificare se a < −5 o a ≥ 5
(per verifica, si assegnino ad a i valori −10, −5, 0, 5, 10).
• Data una variabile a, si vuole verificare se 5 < a < 10 (perverifica, si assegnino ad a i valori −5, 5, 3, 10, 20).
• Date due variabili a e b si vuole verificare se −10 ≤ a < 0 e0 ≤ b < 10 (per verifica, si assegnino alle coppie a e b ivalori (−15, 2), (−5, 0), (−1, 13), (10,−2)).
• Date due variabili a e b si vuole verificare se −10 ≤ a < 0 o0 ≤ b < 10 (per verifica, si assegnino alle coppie a e b ivalori (−15, 2), (−5, 0), (−1, 13), (10,−2)).
Esercizio (la soluzione ottimale non è banale!): Data unamatrice A, si verifichi se tutti i suoi elementi sono non nulli.
ESPRESSIONI LOGICHE 141
INIZIALIZZAZIONE DI ARRAY
Spesso accade che vi sia la necessità (o l’utilità) diinizializzare un array, ovvero di assegnare in modo rapido edefficiente valori ai suoi elementi, senza elencarlisingolarmente.
L’apprendimento di questi comandi, del loro uso e delrisultato ottenuto, verrà effettuato attraverso l’esecuzione dicomandi. Per approfondimenti, utilizzare il comando help odoc che rimanda anche ad altre funzioni.
zeros
>> x = zeros(1,4), y = zeros(3,1)
>> A = zeros(2,3), B = zeros(4), B = zeros(4,4)
Attenzione al valore considerato di default quando mancaun argomento.
INIZIALIZZAZIONE DI ARRAY 143
ones
>> x = ones(1,4), y = ones(3,1)
>> A = ones(2,3), B = ones(4), B = ones(4,4)
rand (distribuzione uniforme in [0, 1])
>> x = rand(1,4), y = rand(3,1)
>> A = rand(2,3), B1 = rand(4), B2 = rand(4,4)
randn (distribuzione normale, o gaussiana)
>> x = randn(1,4), y = randn(3,1)
>> A = randn(2,3), B1 = randn(4), B2 = randn(4,4)
Attenzione: Si ripetano piu’ volte i seguenti comandi
>> x1 = rand(1,4), x2 = rand(1,4)
Cosa si osserva? Ora si ripeta più volte la seguente coppia dicomandi
>> rand('state',0), x1 = rand(1,4), x2 = rand(1,4)
INIZIALIZZAZIONE DI ARRAY 145
linspace (vettore riga)
>> x = linspace(0,1,5)
>> x1 = linspace(1,10), x2 = linspace(1,10,100) % x1, x2 coincidono
>> y = linspace(0,1,101) % Punti equispaziati di h=0.01 in [0,1]
Domanda: la sintassi del comando è linspace(a,b,n) perottenere n punti equispaziati nell’intervallo [a,b], a e b inclusi,con passo h (a e b possono essere variabili o numeri reali).Quanto vale h?
Esercizio: dato un intervallo [a,b], ed un numero razionale h,si determini una formula matematica che permetta dicalcolare il valore di n tale che il comando
linspace(a, b, n)
crei un vettore di componenti [a, a+h, a+2h, ..., b]. ndeve essere un numero naturale (si cerchino le funzioninecessarie per trovare un intero a partire da un reale).
INIZIALIZZAZIONE DI ARRAY 147
logspace (vettore riga)
>> x = logspace(0,1,5)
>> x1 = logspace(0,3), x2 = logspace(0,3,50) % x1, x2 coincidono
>> y = logspace(0,4,5)
Domanda: Cosa si ottiene in generale dando il comandologspace(0,n,n+1), con n numero naturale?
: carattere due punti o colon (vettore riga)
>> i = 0:5, j = -1:10, k = -1:1:10 % l'incremento di default e` 1
>> i = 5:-2:-3, j = 10:-1:-1
>> x = 0:0.01:1, y = 0.5:0.1:1.5
Domanda (la risposta non è banale e deve esseregiustificata): I comandi x1 = 0:0.1:1 e x2 =
linspace(0,1,11) forniscono lo stesso risultato?
INIZIALIZZAZIONE DI ARRAY 149
Esercizio:
Dato un intero n, ed un intervallo [a,b], si scriva un comandoche, utilizzando il carattere due punti :, e tenendo conto dicome si deve calcolare il passo h, crei un vettore riga dilunghezza n che contenga
[a, a+h, a+2h, ..., b]
La soluzione ottimale è costituita da quattro soli comandi (dicui il primi tre consistono nell’assegnazione dei valori allevariabili n, a e b).
Esercizio:
Come il precedente, ma costruendo un vettore colonna.Anche in questo caso, la soluzione ottimale è costituita daquattro soli comandi.
INIZIALIZZAZIONE DI ARRAY 151
FUNZIONI MATEMATICHE ED ARRAY
Le funzioni matematiche possono avere come argomentonon solo una costante o una variabile semplice oun’espressione che restituisce un valore, ma anche un’array.Questo è uno dei vantaggi del Matlab. In restituzione, per laquasi totalità delle funzioni, si ottiene il risultato che siotterrebbe applicando la stessa funzione alle singolecomponenti o elementi dell’array (senza utilizzare cicli!).Vediamo alcuni esempi. Il risultato ottenuto chiarirà comeagiscono e soprattutto il tipo di array restituito.
>> x = linspace(-3,5,11);
>> sqrt(x + 3), cos(2*x)
>> y = x';
>> abs(y), sin(4*y - pi)
>> A = [1 2 3; 4 5 6];
>> log(A), log10(A)
FUNZIONI MATEMATICHE ED ARRAY 153
OPERAZIONI PER ARRAY, ELEMENTO PER ELEMENTO
Il Matlab prevede alcune operazioni tra array molto utili(anche se abitualmente non contemplate nei testi standarddi Algebra Lineare). Sono operazioni che agiscono su vettorie matrici elemento per elemento. Sono rappresentate inMatlab dai caratteri
.* (moltiplicazione) ./ (divisione) .^ (elevamento a potenza)
Vediamo due esempi per capire come funzionano talioperatori
1
2
3
4
.*
5
6
7
8
=
5
12
21
32
1
2
3
4
.^
1
2
3
4
=
1
4
27
256
OPERAZIONI PER ARRAY, ELEMENTO PER ELEMENTO 155
In Matlab
>> [1 2 3 4]' .* [5 6 7 8]'
>> [1; 2; 3; 4] .^ [1; 2; 3; 4]
Possiamo anche operare con vettori riga e con matrici:
>> [1 2 3 4] .* [5 6 7 8]
>> A=[1 2 3; 4 5 6], B=[2 2 3; 2 2 3], A.*B
Attenzione: Tali operatori si possono usare quando glioperandi sono array con le stesse dimensioni e non vannoconfusi con gli operatori senza il punto.
Infatti tutte le seguenti istruzioni danno errore:
>> [1 2 3 4]' .* [5 6 7]'
>> [1 2 3 4]' * [5 6 7 8]'
>> [1; 2; 3; 4] ^ [1; 2; 3; 4]
>> A=[1 2 3; 4 5 6], B=[2 2 3; 2 2 3], A*B
OPERAZIONI PER ARRAY, ELEMENTO PER ELEMENTO 157
Ma questa è corretta! Perchè?
>> A=[1 2 3; 4 5 6], B=[2 2 3; 2 2 3], A*B'
Attenzione: Tali operatori si possono usare anche quandouno degli operandi è uno scalare. Ma vediamo cosaaccade (cercando di capire cosa viene calcolato e checosa restituisce):
>> % stessi risultati dell'operatore *
>> [1; 2; 3; 4] .* 3 , 2 .* [1; 2; 3]
>> % stesso risultato dell'operatore /
>> [1; 2; 3; 4] ./ 3.2
>> 2.1./[1; 2; 3; 4], 2.3./[1 2; 3 4] % Operazioni corrette
>> [1; 2; 3; 4] .^ 3 , [1 2; 3 4] .^ 3 % Operazioni corrette
>> 2.2.^[1; 2; 3; 4], 2.2.^[1 2; 3 4] % Operazioni corrette
OPERAZIONI PER ARRAY, ELEMENTO PER ELEMENTO 159
Invece . . .
>> % Divisione di un numero per un vettore colonna
>> % fornisce un risultato strano!
>> 2 / [1; 2; 3; 4]
>>
>> % Elevamento a potenza di un numero per una
>> % matrice quadrata fornisce un risultato strano!
>> 2 ^ [1 2; 3 4]
>>
>> % Errori!
>> 2 / [1 2; 3 4]
>> 2 ^ [1; 2; 3; 4]
OPERAZIONI PER ARRAY, ELEMENTO PER ELEMENTO 161
CONTINUIAMO A PROGRAMMARE
LA STRUTTURA ITERATIVA CON CONDIZIONE:
x = −5 x = -5;
while x < 0 do while x < 0
print Il valore e‘ negativo disp('Il valore e` negativo')
x = x+ 1 x = x + 1;
end while end
print Il valore ora e‘ positivo disp('Il valore ora e` positivo')
Attenzione ai loop infiniti: È importante ricordare che leistruzioni del ciclo continuano ad essere ripetute se lacondizione (qualsiasi espressione logica il cui risultato sia unadelle costanti true o false) assume il valore true. Si esce dalciclo, quando la condizione risulta uguale a false. Quindi leistruzioni all’interno del ciclo devono prevedere modificheche permettano alla condizione di assumere il valore false.
CONTINUIAMO A PROGRAMMARE 163
Esercizio:
Si scriva e si esegua uno script file corrispondente alprecedente ciclo con condizione.
Approfondimento: La condizione può anche restituireun’array di costanti logiche. In tal caso, quando vieneeseguito il ciclo? Si veda il doc while.
UN ERRORE COMUNE:
Ci si ricordi sempre che con il computer si lavora in aritmeticafinita e non esatta, quando si scrivono le condizioni dei cicli.Esercizio: Si cerchi di correggere il seguente ciclo errato:
x = 1.0
while x ~= 0
x = x - 0.1
end
CONTINUIAMO A PROGRAMMARE 165
INDICIZZAZIONE DEGLI ARRAY
Il Matlab indicizza gli elementi di una matrice o lecomponenti di un vettore partendo da 1 e NON da 0.Esempi:
x =[
13 − 2 9 10]
x(1) x(2) x(3) x(4)
A =
2 3 4
1 8 7
riga 1
riga 2
col 1 col 2 col 3
A(2,3) indica il valore 7
A(1,2) indica il valore 3
. . .
INDICIZZAZIONE DEGLI ARRAY 167
Attenzione: Non confondere le parentesi quadre con leparentesi rotonde:
>> x1 = [13 -2 9 10], x2 = [-2;3;2]
>> y1 = x1(2), y2 = x2(2), z = x1 % Corretto
>> y1 = x1[2], y2 = x2[2] % Errato
>> A = [2 3 4; 1 8 7]
>> a = A(2,3), b = A(1,2), c = A % Corretto
>> a = A[2,3] % Errato
Attenzione: Gli indici devono essere numeri interi maggiori dizero e minori del corrispondente valore del size!
>> A = [2 3 4; 1 8 7], size(A)
>> i = 2; j = 3; a = A(i,j) % Corretto
>> i = 0; j = 3; a = A(i,j) % Errato
>> i = 2; j = 5; a = A(i,j) % Errato
>> i = 2; j = -2; a = A(i,j) % Errato
>> i = 2.5; j = 3; a = A(i,j) % Errato
INDICIZZAZIONE DEGLI ARRAY 169
CREARE UN VETTORE MEDIANTE GLI INDICI: Per far riferimento aglielementi di un vettore che si vuole utilizzare, si usa l’indicedella componente a cui ci si riferisce. Ciò vale sia che ilvettore sia di tipo riga che colonna.
>> xr = [13 -2 9 10], xc = [13; -2; 9; 10]
>> yr = xr(3), yc = xc(3) % yr e yc contengono lo stesso valore 9
Ma se creiamo un vettore, assegnando dei valori alle suecomponenti, il vettore risultante è sempre un vettore riga!
>> x(1) = 13; x(2) =-2; x(3)=9; x(4)=10;
>> disp(x), size(x)
Se il vettore esiste, la modifica di alcune sue componentilascia inalterata la sua tipologia (se era vettore riga, restavettore riga, se era vettore colonna, resta vettore colonna).
>> xr = [13 -2 9 10], xc = [13; -2; 9; 10]
>> xr(4) = 5; disp(xr), xc(3) = 3; disp(xc)
INDICIZZAZIONE DEGLI ARRAY 171
CREARE UNA MATRICE MEDIANTE GLI INDICI:
È naturalmente possibile creare una matrice assegnando isuoi elementi o alcuni suoi elementi tramite gli indici. Ildimensionamento della matrice risultante verrà fatto inmodo automatico (anche se è oneroso per il Matlab dalpunto di vista computazionale) e gli elementi non assegnativengono posti uguali a zero.
>> A(2,1) = 13; A(1,3) = -2; A(3,4) = 9;
>> size(A), disp(A)
Esercizio: (sul resize) Si eseguano i comandi che seguono,individuando gli effetti che essi producono
>> xr = [1 2 3 4], size(xr), xr(6) = 99; disp(xr), size(xr)
>> xc = [1; 2; 3; 4], size(xc), xc(6) = 99; disp(xc), size(xc)
>> A = [1 2 3; 4 5 6; 7 8 9; 10 11 12], size(A)
>> A(5,6) = 99; disp(A), size(A)
INDICIZZAZIONE DEGLI ARRAY 173
INDICIZZAZIONE AVANZATA
L’uso del carattere : (colon), oppure l’uso di vettori di interiche rappresentano indici, risultano molto utili nellamanipolazione di array. Vediamo alcuni esempi che nemostreranno le grandi potenzialità. Si cerchi di capire cosaaccade.Iniziamo con i vettori (riga o colonna).
>> % Da un vettore riga creiamo nuovi vettori riga
>> z = [13 -2 9 10 -3 5 2]
>> x = z(2:5), y = z(2:2:7)
>> I = [1 3 5 7], x1 = z(I), J = [1:2:5], x2 = z(J)
>> K = [5 1 4], v1 = z(K)
>> % Da un vettore colonna creiamo nuovi vettori colonna
>> w = z'
>> xx = w(2:5), yy = w(2:2:7)
>> xx1 = w(I), xx2 = w(J), v2 = w(K)
INDICIZZAZIONE AVANZATA 175
Facile sbagliare!
>> z = [13 -2 9 10 -2 3 2]
>> x = z(0:5) % Errore
>> y = z(0:2:-3) % Restituisce una Empty matrix!
>> I = [0 2 4 6], x1 = z(I) % Errore
Una Empty matrix non è una Matrice vuota!Una Empty matrix è una matrice che non contiene alcunelemento, ed ha una riga e zero colonne.Una Matrice vuota è anch’essa una matrice che noncontiene alcun elemento, ma ha zero righe e zero colonne.Esempi:
>> E = [] % anche con spazi bianchi all'interno E = [ ]
INDICIZZAZIONE AVANZATA 177
La variabile speciale end
Nell’indicizzazione con il carattere : si può utilizzare lavariabile speciale end che assume il valore dell’ultimo indicedi un array.Esempi:
>> z = [13 -2 9 10 -3 5 2]
>> x = z(3:end), y = z(2:2:end-1), w = z(1:end-2)
ma genera un errore se si usa come valore da assegnare adun array:
>> I = [1 3 end]
>> J = [1:end]
>> K = 1:end
INDICIZZAZIONE AVANZATA 179
Si possono creare nuovi vettori o matrici estratte da unamatrice esistente. Esempi:
>> A = [2 3 4; 1 8 7; -2 0 5; 3 -4 -1], size(A)
>> B = A(2:3,1:2), C = A(2:end,2:end), D = A(1:2:end,1:2:end)
>> xr = A(4, 2:end), xc = A(3:end, 2)
Un altro utilizzo del carattere : (colon): Usato in una matriceassume il significato di tutte le righe se è nel primo indice,ovvero di tutte le colonne se è nel secondo indice
>> A = [2 3 4; 1 8 7; -2 0 5; 3 -4 -1], size(A)
>> B = A(2:3,:), C = A(:,2:end), D = A(1:2:end,:)
>> xr = A(4,:), xc = A(:,2)
Domanda: Cosa accade con i seguenti comandi(applicazione del carattere : ai vettori)?
>> x = [1 2 3], x1 = x(:), y = [1; 2; 3], y1 = y(:)
>> z = [3 2 1], z = z(:), w = [3; 2; 1], w = w(:)
INDICIZZAZIONE AVANZATA 181
ARRAY CONCATENATI
È possibile creare o modificare un array concatenando altriarray. Vediamo alcuni esempi (si determini come vengonocreate le array e che tipo di concatenazione viene fatta).
>> x = [], x = [x,1], x = [x,2], x = [x,3]
>> y = [10 20 30], z = [x,y], A = [x;y]
>> w = [100;200], B = [A w]
>> u = [1000 2000], C = [[B B]; [x y u]]
>> t = [1 2], R = [t;t;t], D = [R,y']
Un’errata concatenazione, con dimensioni che non vannobene, fornisce un errore. Correggere i seguenti comandi:
>> clear all
>> x = [], x = [x,1], x = [x,2], x = [x;3]
>> y = [10 20], z = [y;y], A = [z,y]
>> B=[1 2 3;4 5 6], w = [100;200], B = [B w']
>> u = [1 2], C = [[u u u]; [10 20 30]]
ARRAY CONCATENATI 183
RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE
La tecnica utilizzata dal Matlab per rappresentare in modografico una funzione f(x) si basa sulla conoscenza di uncerto numero di suoi punti (ascissa e relativa ordinata).Supponiamo che le ascisse siano ordinate in modo crescentee che siano noti n punti appartenenti alla funzione:
(x1,y1), (x2,y2), (x3,y3), . . . , (xn,yn).
Matlab richiede che si creino due distinti vettori con lo stessonumero di componenti: nel primo si inseriranno tutte leascisse e nel secondo tutte le corrispondenti ordinate
x = [x1,x2,x3, . . . ,xn] y = [y1,y2,y3, . . . ,yn]
Il comando Matlab plot serve per congiungere i punti dati(nell’ordine) e tracciare il grafico in una finestra a parte.
RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 185
Ovviamente il numero di punti deve essere sufficientementegrande per poter dare l’impressione di una curva!
Esempio: Si vuole tracciare il grafico della funzioney = x2 −
√x+ 2+ sin3x nell’intervallo −2 ≤ x ≤ 5 ovvero
[a,b] = [−2,5]. Si provi
>> a = -2; b = 5; n = 11;
>> x = linspace(a, b, n);
>> y = x.^2 - sqrt(x+2) + sin(3*x);
>> plot(x,y)
11 punti sono troppo pochi! Si ripetano tutte le istruzioniassegnando però ad n il valore 81. Decisamente meglio! Oraha l’aspetto di una curva. E se diamo i seguenti comandicosa vediamo nella figura?
>> plot(x',y')
>> plot(x,y')
>> plot(x',y)
RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 187
Se ne deduce che al comando plot non interessa che i duevettori dello stesso tipo (ambedue riga o ambeduecolonna), basta che abbiano lo stesso numero dicomponenti. Inoltre si può notare che successive istruzioniplot mostrano il grafico nella stessa finestra (Figure 1).
AZIONI SULLE FIGURE:
È possibile agire direttamente sulla finestra che contiene lafigura per effettuare numerose operazioni:
• Salvare la propria figura (File -> Save as oppure icona) invari formati (.fig, .pdf, .eps, .jpg, . . . ) per conservarla,assegnandole un nome. Si sottolinea che l’estensione.fig indica il formato del Matlab che permette direcuperare in altra sessione la figura e modificarla,mentre tutti gli altri formati sono solo dei salvataggi perpoterla stampare o visualizzare con altri software.
RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 189
• Aprire una figura salvata in altra sessione Matlab (File ->Open oppure icona). La figura deve avere l’estensione.fig. La figura aperta appare in un altra finestra e noncancella l’esistente.
• Inserire delle scritte (Insert) sull’asse x (X label), sull’asse y
(Y label), in alto (Title), . . . .
• Fare degli zoom (Tools -> Zoom In oppure icona con lentee segno +, per ingrandire; Tools -> Zoom Out oppureicona con lente e segno −, per rimpicciolire) il contenutodella figura. La scalatura assi cambia in accordo.
• Spostare l’intero contenuto in ogni direzione (icona conmano aperta). La scalatura assi cambia in accordo.
Ma le possibilità sono veramente numerose e ci siamo limitatia qualcuna di uso frequente, lasciando agli studentiinteressati di sperimentarle.
RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 191
Esercizio:
Dopo aver tracciato il grafico della funzioney = x2 −
√x+ 2+ sin3x nell’intervallo [a,b] = [−2,5], si salvi la
figura originale in formato Matlab ed in formato .pdf, siinserisca un titolo e delle scritte sugli assi. Dopo uno zoomnelle vicinanze dello zero, si sposti a piacimento la figura nelriquadro e si salvi la nuova figura ottenuta in formato Matlabed in formato .pdf. Si chiuda il Matlab e lo si riavvii.Si vogliono recuperare le due figure salvate nella sessioneprecedente. A tal fine, per fare aprire una finestra Figure 1, sidia nella finestra comandi il comando figure. Si proceda poicome indicato in precedenza.
RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 193
COME CREARE FIGURE DIFFERENTI:
Durante la stessa sessione, se si vogliono creare figuredifferenti su finestre diverse, è sufficiente, prima del comandoplot dare il comando figure. Ogniqualvolta viene dato talecomando (finestra comandi o M-file) viene aperta unanuova finestra con l’indicazione del numero di Figura (cheviene incrementato). Le finestre figure possono essere chiusemanualmente (tasto in alto a destra con la croce), una peruna, oppure con il comando close (esempio close([1,3])
chiude la finestra figura 1 e 3). A fine sessione vengonochiuse automaticamente tutte, oppure durante la sessione siusa il comando close all. Si provino i seguenti comandi>> x = linspace(0, 4*pi, 81); y = sin(x); plot(x,y)
>> figure
>> x1 = linspace(-2*pi, 2*pi, 81); y1 = cos(x1); plot(x1,y1)
>> figure
>> x2 = linspace(-pi/4, pi/4, 91); y2 = tan(x2); plot(x2,y2)
RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 195
FINESTRA FIGURA CORRENTE: La finestra corrente è l’ultimaaperta, oppure l’ultima in cui si è tracciato un grafico.
Nell’esempio precedente, la finestra figura corrente è laFigure 3. Quando viene dato un altro comando plot, ilgrafico viene prodotto nella finestra corrente. Infatti, si dianoi seguenti comandi
>> x3 = linspace(0, pi/4, 91); y3 = tan(x3); plot(x3,y3)
Il grafico verrà prodotto nella Figure 3, ed il precedentegrafico viene perso.
Per selezionare come figura corrente una determinatafinestra, è sufficiente indicare il suo numero. Ad esempio
>> figure(2)
>> x4 = linspace(-pi/4, 0, 91); y4 = tan(x4); plot(x4,y4)
In alternativa si può cliccare sulla finestra che si desiderautilizzare per il successivo comando plot.
RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 197
DISTINGUERE LE VARIE CURVE:
Di default il comando plot unisce i punti definiti dai vettoricongiungendoli con dei tratti di colore blu ('b'). È possibilecambiare il tipo di tratti e/o il colore degli stessi,aggiungendo un terzo parametro (stringa di caratteri).Chiudiamo tutte le finestre figure (close all), ripuliamo ilworkspace e diamo:
>> x = linspace(0, 4*pi, 81); y = sin(x); plot(x,y,'r')
>> figure
>> x1 = linspace(-2*pi, 2*pi, 81); y1 = cos(x1); plot(x1,y1,'b')
Chiudiamo ancora le finestre figure e diamo
>> plot(x,y,':')
>> figure
>> plot(x1,y1,'--')
Il colore resta uguale all’ultimo utilizzato, ma il tipo di tratto èdiverso.
RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 199
Possiamo anche decidere di evidenziare solo i punti con unsimbolo. Chiudiamo le figure e diamo
>> plot(x,y,'x'); figure; plot(x1,y1,'*')
Lista dei colori, simboli e tipi di trattob blue . point - solid
g green o circle : dotted
r red x x-mark -. dashdot
c cyan + plus -- dashed
m magenta * star (none) no line
y yellow s square
k black d diamond
w white v triangle (down)
^ triangle (up)
< triangle (left)
> triangle (right)
p pentagram
h hexagram
RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 201
E per finire, possiamo combinare assieme colori, tipo disimbolo e di tratto, indicando quanto si desidera in un’unicastringa di caratteri (se una delle scelte manca, vieneconsiderato l’ultimo valore di default). Ecco alcuni esempifatti sulla stessa finestra Figure 1 (quindi si eseguano uno allavolta e si guardi il risultato)
>> figure(1)
>> plot(x,y,'k+--') % uguale, ad es. a plot(x,y,'--+k')
>> plot(x,y,'g-.')
>> plot(x,y,'d--')
>> plot(x,y,'hr')
Esercizio:
Si producano, su due figure diverse, la stessa curva,individuata dai vettori x e y, la prima punteggiata, di coloremagenta, e la seconda di colore blu, con i punti evidenziatida un punto.
RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 203
COME CREARE UNA FIGURA CON CURVE DIFFERENTI:
Un primo modo consiste nell’utilizzare i comandi hold on(trattieni) e hold off (rilascia).
Riprendiamo gli esempi precedenti, ripuliamo workspace echiudiamo le finestre figure. Diamo i seguenti comandi
>> x = linspace(0, 4*pi, 81); y = sin(x); plot(x,y,'k-')
>> hold on
>> x1 = linspace(-2*pi, 2*pi, 91); y1 = cos(x1); plot(x1,y1,'b:')
>> hold off
I due grafici vengono effettuati sulla medesima figura. Glieventuali successivi comandi plot, avendo dato il comandohold off, verranno effettuati sulla stessa figura, cancellando iprecedenti due grafici. Infatti diamo
>> x2 = linspace(-pi/4, pi/4, 71); y2 = tan(x2); plot(x2,y2,'r--')
RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 205
Un secondo modo consiste nell’utilizzare un unico comandoplot per tutte le curve che si desidera tracciare nella stessafigura (due o più), separando gli argomenti con le virgole.
>> plot(x,y,'k-',x1,y1,'b:')
Non è obbligatorio specificare il colore, simbolo e/o tipo (intal caso viene preso il default, ovvero unisce i punti con tratti,ma si noti che, utilizzando un unico comando plot il colorecambia automaticamente). Infatti:
>> x2 = linspace(-pi/4, pi/4, 81); y2 = tan(x2);
>> plot(x,y,x1,y1,x2,y2)
Si noti anche che la scala degli assi viene automaticamenteimpostata in modo che tutte le curve possano esserevisualizzate. I comandi che seguono danno errore. Perchè?
>> plot(x,y,x,y1)
>> plot(x,x1,y,y1)
RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 207
Esercizi:
• Si disegni una figura che contenga unicamente l’assedelle x, y = 0 nell’intervallo −10 ≤ x ≤ 10. Quanti puntiservono? Che valori devono assumere i vettori x e y?
• Si disegni una figura che contenga unicamente labisettrice primo-terzo quadrante y = x nell’intervallo−10 ≤ x ≤ 10. Quanti punti servono? Che valori devonoassumere i vettori x e y?
• Si disegni una figura che contenga l’interpretazionegrafica delle soluzioni dell’equazione non lineare in forma
di punto fisso x = 3cos 5x√
x= g(x) nell’intervallo 0.5 ≤ x ≤ 5
(ovvero si disegni nella stessa figura la funzione y = g(x) ela bisettrice primo-terzo quadrante y = x).
RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 209
• Si scriva uno script Matlab che disegni le seguenti funzioninegli indicati intervalli su differenti figure e con diversicolori, stili e simboli:– y = 2 sin(4πx) usando 101 punti equispaziati
nell’intervallo 0 ≤ x ≤ 1.
– y =1
1 + x2usando 101 punti equispaziati nell’intervallo
−5 ≤ x ≤ 5 (attenzione agli operatori matematici nellascrittura della funzione!).
– y =sin 5x− sin 9x
cos 5x+ cos 9xusando 200 punti equispaziati
nell’intervallo −π/2 ≤ x ≤ π/2.
• Si disegni una figura che contenga l’interpretazionegrafica delle soluzioni dell’equazione non linearef(x) = 0.3x cosx = 0 nell’intervallo 0 ≤ x ≤ 40 (ovvero sidisegni nella stessa figura la funzione y = f(x) e l’assedelle x, y = 0).
RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 211
LA VARIABILE FUNZIONE
Sinora abbiamo visto come disegnare delle funzioniindicando esplicitamente l’espressione matematica dellestesse. Sarebbe certamente utile, soprattutto negli script enelle function del Matlab poter dare un nome generico aduna funzione e poterla cambiare in modo semplice. A talfine è possibile creare una variabile di tipo funzione.
Per far ciò, la funzione deve prima essere descritta come unastringa di caratteri e poi trasformata nel tipo inline function,utilizzando il comando inline. Riprendiamo il primo esempio:
>> a = -2; b = 5; n = 81; x = linspace(a, b, n);
>> funs = 'x.^2 - sqrt(x+2) + sin(3*x)'; fun = inline(funs)
>> % oppure direttamente fun = inline('x.^2-sqrt(x+2)+sin(3*x)')
>> y = fun(x);
>> plot(x,y)
LA VARIABILE FUNZIONE 213
Si guardi il workspace e si noti che funs è una stringa dicaratteri mentre fun è una variabile di tipo inline.
Attenzione: Matlab non controlla la sintassi dell’espressionedata come stringa per rappresentare la funzione. Attenzionequindi ad usare correttamente gli operatori aritmetici (inparticolare .*, ./ e .^ )!
Attenzione: La variabile x nelle inline function serve soloper la definizione e non ha alcuna relazione con il nomedella variabile con la quale verrà effettuata la valutazione!Esempio
>> valx = linspace(-2, 5, 91);
>> fun = inline('x.^2 - sqrt(x+2) + sin(3*x)');
>> valy = fun(valx); plot(valx,valy)
LA VARIABILE FUNZIONE 215
UN SEMPLICE SCRIPT PER DISEGNARE UNA SOLA FUNZIONE
Per un semplice grafico abbiamo bisogno di questeinformazioni:
• gli estremi dell’intervallo [a, b] dell’asse x che ci interessaconsiderare;
• la stringa che contiene l’espressione della funzione.
Il numero di punti n che desideriamo considerare deveessere assegnato, ma può essere lasciato fisso ad un valoreche abitualmente è sufficiente per tracciare una curva.Creiamo uno script file di nome dis.m contenente i seguenticomandi Matlab
UN SEMPLICE SCRIPT PER DISEGNARE UNA SOLA FUNZIONE 217
dis.m
% Script di prova per disegnare una sola funzione
%
% Parte da modificare
a = -2; b = 5;
funs = 'x.^2 - sqrt(x+2) + sin(3*x)';
%
% Parte da non modificare
n = 101;
disp(' Estremo sinistro'); disp(a)
disp(' Estremo destro'); disp(b)
disp(' Numero di punti'); disp(n)
fun = inline(funs);
disp(' Funzione'); disp(fun)
%
% Definisce il vettore delle ascisse
x = linspace(a, b, n);
%
% Definisce il vettore delle ordinate
y = fun(x);
%
% Disegna la curva nell'intervallo [a,b]
plot(x,y)
UN SEMPLICE SCRIPT PER DISEGNARE UNA SOLA FUNZIONE 219
Poi mettiamoci nella finestra comandi e diamosemplicemente
>> dis
Supponiamo di voler disegnare un’altra funzione. Nello scriptdis.m modifichiamo le prime due righe comandi inserendo
a = 0; b = pi/2;
funs = 'x.*cos(2*x)';
e nella finestra comandi diamo
>> figure; dis % oppure figure, dis
se vogliamo che il nuovo grafico vada in una nuova finestrafigura. Oppure solamente
>> dis
se vogliamo utilizzare la stessa finestra figura.
UN SEMPLICE SCRIPT PER DISEGNARE UNA SOLA FUNZIONE 221
UNA FUNZIONE UTILE PER SCRIPT: input
Anzichè modificare lo script ogniqualvolta vogliamocambiare gli estremi dell’intervallo e/o la funzione, possiamoutilizzare la funzione input che permette di inserire dellecostanti, di solito numeriche o stringa (ma è possibile inserireanche array, se necessario).Consideriamo ancora il nostro script dis.m, modifichiamo laparte iniziale in questo modo:
% Script di prova per disegnare una sola funzione
%
% Parte di ingresso dati
a = input(' Dammi l''estremo sinistro: ');
b = input(' Dammi l''estremo destro: ');
funs = input(' Dammi la stringa funzione: ');
%
% Parte da non modificare
...........
UNA FUNZIONE UTILE PER SCRIPT: input 223
e ripetiamo il comando di esecuzione dello script nellafinestra comandi, supponendo di voler tracciare il graficodella funzione x2 − 2ex/x nell’intervallo [−5, 5].Nella finestra comandi vedremo quanto segue (gli estremidell’intervallo e la stringa funzione devono essere inseritidall’utente!):
>> dis
Dammi l'estremo sinistro: -5
Dammi l'estremo destro: 5
Dammi la stringa funzione: 'x.^2-2*exp(x)./x'
Estremo sinistro
-5
Estremo destro
5
Numero di punti
101
Funzione
Inline function:
fun(x) = x.^2-2*exp(x)./x
>>
UNA FUNZIONE UTILE PER SCRIPT: input 225
Come ci si attende (qual’è il dominio della funzione?), perx = 0 vi è un asintoto verticale. Per evidenziaremaggiormente la curva nei pressi dell’asintoto possiamoaumentare il numero di punti portandolo a n = 501 (modificanello script) e riducendo l’intervallo a [−3, 3].Quanto segue invece genera un errore. Perchè?>> dis
Dammi l'estremo sinistro: -3
Dammi l'estremo destro: 3
Dammi la stringa funzione: x.^2-2*exp(x)./x
Estremo sinistro
-3
Estremo destro
3
Numero di punti
501
??? Error using ==> inline.inline at 47
Input must be a string.
Error in ==> dis at 13
fun = inline(funs);
UNA FUNZIONE UTILE PER SCRIPT: input 227
FUNCTION M-FILE
La function Matlab è un file esterno (come lo script Matlab)che contiene comandi che vengono eseguiti quando laFunction viene chiamata. Essa può essere creata emodificata dall’utente utilizzando l’Editor del Matlab e deveavere l’estensione di default di Matlab .m.
Ma quali sono allora le differenze tra script e function? Leprincipali sono:
• Le variabili definite e create nello script sono sempreglobali e restano nel workspace sino a quando nonvengono esplicitamente cancellate.Le variabili definite e create nella function sono semprelocali alla function stessa e quando ha ultimato dieseguire le sue istruzioni, le variabili non sono visibili nelworkspace.
FUNCTION M-FILE 229
• Lo script rappresenta il punto di partenza dell’esecuzionedei propri programmi ed esperimenti che vengonoeseguiti tramite l’esecuzione di comandi o funzioniproprie del Matlab, o presenti in biblioteche (toolbox) maanche funzioni sviluppate in proprio.La function è lo strumento principale con il qualevengono tradotti algoritmi o parte di essi, in modo dapoter essere facilmente riutilizzati in altri esperimenti,essendo svincolati dai nomi di variabili in esso definite econtenute. La function implementa il concetto di blackbox in cui il passaggio di informazioni tra function ecodice chiamante avviene solo attraverso i parametri diingresso e di uscita (quelli della function sono anchechiamati argomenti dummy o fittizi, e quelli del codicechiamante argomenti attuali).
FUNCTION M-FILE 231
Facciamo un esempio comparativo e consideriamo unaversione semplificata di nome diss.m del nostro script(abbiamo anche tolto tutti i commenti per semplicità dilettura) ed una function dissfun.m che, noto gli estremidell’intervallo, il numero di punti e la stringa funzione, effettuiil solo disegno dopo aver calcolato i valori dei due vettori x ey.
diss.m dissfun.m
% Script % Function
a = -2; b = 5; n = 101; function [ ] = dissfun (a, b, n, fun)
fun = inline('x.^2'); x = linspace(a, b, n);
x = linspace(a, b, n); y = fun(x);
y = fun(x); plot(x,y)
plot(x,y)
FUNCTION M-FILE 233
Ripuliamo il workspace (clear all) ed eseguiamo lo script:
>> diss
Che variabili vediamo nello workspace? Se diamo
>> if (n == length(x)), disp('ok'), end
ci accorgiamo, ad esempio, che conosce sia n che x. Oraripuliamo il workspace nuovamente ed eseguiamo lafunction, dopo aver definito gli argomenti attuali di ingresso(quelli entro parentesi rotonde).
>> a = -2; b = 5; n = 101;
>> fun = inline('x.^2');
>> dissfun (a, b, n, fun);
Guardiamo il workspace. I due array x e y costruiti nellafunction NON esistono, non sono nel workspace! E quindi seripeto l’istruzione seguente, mi da errore.
>> if (n == length(x)), disp('ok'), end
FUNCTION M-FILE 235
Ma vediamo perchè la struttura a black box, e l’utilizzo degliargomenti fittizi ed attuali porta grandi vantaggi. Abbiamocapito quali sono i dati che servono alla nostra funzione perfare la figura corrispondente. Ma non siamo obbligati adusare come argomenti attuali variabili che abbiano lo stessonome di quello indicato nel file function! E quindi i seguenticomandi mi permettono di utilizzare la stessa functiondissfun.m per creare tre grafici differenti (si noti come siaduttile la definizione degli argomenti attuali).
>> figure(1)
>> a0 = -2; b0 = 5; np = 81; funz = inline('x.^3');
>> dissfun (a0, b0, np, funz); % prima figura
>> figure(2)
>> dissfun (a0+3, b0-1, np, funz); % seconda figura
>> figure(3)
>> dissfun (3, 10, 101, inline('sin(x).^2-5')); % terza figura
FUNCTION M-FILE 237
ESERCIZI
1. Si scriva una function che disegni una figura checontenga l’interpretazione grafica di un’equazione nonlineare f(x) = 0 in un intervallo [a, b].
2. Si scriva una function che disegni una figura checontenga l’interpretazione grafica di un’equazione nonlineare in forma di punto fisso x = g(x) in un intervallo [a, b].
3. Data un’equazione non lineare f(x) = 0, si supponga diaver identificato due funzioni f1(x) ed f2(x) tali chef(x) = f1(x)− f2(x) e quindi le soluzioni possono essereinterpretate come le soluzioni dell’equazionef1(x) = f2(x). Si scriva una function che, disegni unafigura che contenga l’interpretazione grafica dif1(x) = f2(x) in un intervallo [a, b] (ovvero si disegni nellastessa figura la funzione y = f1(x) e la funzione y = f2(x)).
ESERCIZI 239
FUNCTION M-FILE (CONTINUA)
In generale la prima riga del file function deve essere del tipo
function [out1,out2, . . .] = nome_funzione (in1, in2, . . .)
• Gli argomenti fittizi di uscita out1, out2, . . . , e quelli diingresso in1, in2, . . . , devono essere obbligatoriamentedei nomi di variabile (variabili di qualsiasi tipo) e sarannoquesti i nomi che verranno utilizzati all’interno del filefunction. Possono anche mancare, ed in tal caso sipossono eliminare le parentesi quadre ed il segno =.
• Gli argomenti fittizi di uscita out1, out2, . . . , dovrannoessere assegnati all’interno della function ed alla finedell’esecuzione i valori finali ad essi assegnati, verrannoriassegnati agli argomenti attuali di uscita (che pertantodevono essere obbligatoriamente dei nomi di variabile).
FUNCTION M-FILE (CONTINUA) 241
• Gli argomenti fittizi di ingresso in1, in2, . . . , potrannoessere utilizzati all’interno della function in quanto i lorovalori verranno resi noti tramite gli argomenti attuali diingresso, durante la chiamata della funzione. Possonoanche mancare, ed in tal caso si possono eliminare leparentesi rotonde.
• nome_funzione è il nome che si vuole dare alla functionMatlab. Il nome del file esterno, deve avere lo stessonome, estensione .m e deve essere memorizzato neldirectory corrente in cui si sta lavorando. L’editor delMatlab per default propone di assegnare al file esterno ilnome indicato nella riga function.Attenzione: se i nomi sono diversi, ha la precedenza ilnome del file esterno.Attenzione: controllare con il comando exist se esiste giàuna funzione con lo stesso nome che non sia la nostra.
FUNCTION M-FILE (CONTINUA) 243
ESEMPIO: Si vuole scrivere una funzione di nome statistica
che, dati un certo numero di dati, memorizzati in un vettore x,restituisce la loro media e la deviazione standard. Vediamocome si dovrebbe scrivere in modo ben documentato:statistica.m
function [m, d] = statistica(x);
% STATISTICA Calcola la media e la deviazione standard
% dei dati contenuti nel vettore x
%
% Uso:
% [m, d] = statistica(x);
%
% Dati di ingresso:
% x vettore (riga o colonna)
%
% Dati di uscita:
% m media dei dati contenuti in x
% d deviazione standard dei dati contenuti in x
m = mean(x);
d = std(x);
FUNCTION M-FILE (CONTINUA) 245
COME “CHIAMARE” UNA FUNCTION: Chiamare una functionsignifica richiedere che venga eseguita utilizzando i dati diingresso che vengono forniti (argomenti attuali di ingresso) erestituendo i risultati nelle variabili (argomenti attuali diuscita) che vengono indicate in uscita.La struttura tipo di una chiamata è
[varout1, varout2, . . .] = nome_funzione (in1a, in2a, . . .)
Come si vede, la struttura della chiamata è simile (manca lascritta function).
Possiamo quindi eseguire la funzione statistica
precedentemente definita direttamente da una rigacomandi (o scrivendo la chiamata in uno script file), dopoaver definito un vettore argomento attuale ydat.
>> ydat = [22,41,42,42,41,39,64,48,30,25,43,27,52,33,60];
>> [med, sta] = statistica(ydat);
FUNCTION M-FILE (CONTINUA) 247
Domande: Nella finestra comandi dopo la chiamata non sivede nulla. Perchè? Se guardiamo il workspace cosanotiamo?
Esempio: Supponendo che i dati inseriti siano relativi allaquantità (µg/m3) di polveri respirabili PM10 rilevate da 15centraline di una grande città, vogliamo scrivere uno scriptche rappresenti graficamente l’analisi statistica effettuata,con un grafico a barre.
% Script PM10: Mostra una rappresentazione dell'analisi
% statistica delle polveri respirabili (micro-g/metro-cubo)
%
ydat = [22,41,42,42,41,39,64,48,30,25,43,27,52,33,60];
xdat = 1:length(ydat);
[m, d] = statistica(ydat);
bar(xdat,ydat,'b')
hold on
plot([0,16],[m,m], 'r')
plot([0,16],[m-d,m-d], 'r--'),plot([0,16],[m+d,m+d], 'r--')
hold off
FUNCTION M-FILE (CONTINUA) 249
ANCORA SULLE FIGURE
Le potenzialità grafiche del Matlab sono molto elevate.Riportiamo alcuni comandi che possono essere utili perdefinire o completare le proprie figure.
axis
La scala dell’asse x ed y in una figura vengonoautomaticamente calcolate da Matlab. È però possibiledefinire esplicitamente l’intervallo su x e su y che si desideraconsiderare. La sintassi è:
axis ([xmin xmax ymin ymax])
dove xmin e xmax sono gli estremi dell’intervallo sull’asse x eymin e ymax quelli sull’asse y. In pratica l’argomento è unvettore di 4 componenti. Il comando agisce sull’ultima figuradisegnata ovvero sulla finestra figura corrente.
ANCORA SULLE FIGURE 251
Esempio:
>> x = linspace(-1,1,101); y = cos(5*acos(x));
>> plot(x,y)
Diamo ora i comandi
>> axis([-2 2 -3 3]) % Corretto
>> axis(-2 2 -3 3) % Errato!
Con lo stesso comando è possibile chiedere che la figuravenga effettuata in un quadrato (anzichè un rettangolo),che gli assi abbiano la stessa scala, e molto altro. Si vedal’help ed il doc per approfondimenti su tale comando.Esempi:
>> x = linspace(0,pi,101); y = cos(x);
>> plot(x,y)
>> axis equal % Cosa cambia nella figura?
>> axis square % Cosa cambia nella figura?
>> axis normal % Cosa cambia nella figura?
ANCORA SULLE FIGURE 253
Esercizio (non banale): Si scriva una function che disegni unacirconferenza di raggio r e centro l’origine degli assi. Lacirconferenza deve avere l’aspetto “corretto” (non comeun’ellisse!), deve essere a distanza r da ogni lato del riquadroed il riquadro stesso deve essere quadrato (suggerimento:coordinate polari).
xlabel e ylabel
Sono i comandi per inserire delle sequenze di caratterinell’asse x e nell’asse y. Agiscono sulla finestra figuracorrente. Esempio:
>> x = linspace(0,pi,101); y = cos(x);
>> plot(x,y)
>> xlabel('Angolo in radianti x')
>> asy = 'cos(x)';
>> ylabel(asy) % oppure direttamente ylabel('cos(x)')
ANCORA SULLE FIGURE 255
title
Serve ad inserire una stringa di caratteri come titolo. Agiscesulla finestra figura corrente. Esempio:
>> x = linspace(0,pi,101); y = cos(x); plot(x,y)
>> titolo = 'Grafico di y=cos(x)';
>> title(titolo) % oppure direttamente title('Grafico di y=cos(x)')
text
Serve ad inserire orizzontalmente una stringa di caratteri inuna posizione qualsiasi della figura, identificata dallecoordinate del punto in cui deve iniziare ad esserevisualizzata. La sintassi è
text (x, y, stringa)
dove x ed y sono le coordinate e stringa è una variabile ouna costante stringa di caratteri. Agisce sulla finestra figuracorrente.
ANCORA SULLE FIGURE 257
Esempio:
>> x = linspace(0,pi,101); y = cos(x); plot(x,y)
>> text(1.3,0.4,'y=cos(x)')
gtext
Come text, ma anzichè indicare le coordinate, si posizionala scritta con il mouse direttamente nella figura (tasto sinistrodel mouse). Esempio:
>> x = linspace(0,pi,101); y = cos(x); plot(x,y)
>> gtext('y=cos(x)') % posizionarsi sulla finestra figura
grid
Disegna una griglia in corrispondenza delle suddivisionidell’asse x ed y. Agisce sulla finestra figura corrente.Esempio:
>> x = linspace(0,pi,101); y = cos(x); plot(x,y)
>> grid on
ANCORA SULLE FIGURE 259
Esercizio:
Utilizzando il comando text, si modifichi lo script PM10 sullarappresentazione dell’analisi statistica delle polveri respirabili,in modo che nella figura vengano inserite le scritte <�- m+d,<�- m e <�- m-d. Si veda nella figura seguente il risultatoatteso.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 150
10
20
30
40
50
60
70
<−− m
<−− m−d
<−− m+d
ANCORA SULLE FIGURE 261
legend
Viene utilizzata quando si vuole inserire una legenda peridentificare i simboli e i tipi di linea utilizzati in curve (due opiù) effettuate nello stesso grafico. Agisce sulla finestra figuracorrente. Esempio:>> x = linspace(0,pi,101); y1 = cos(x); y2 = sin(x);
>> plot(x,y1,x,y2)
>> legend('coseno','seno')
>> figure, y3 = cos(2*x); y4 = cos(3*x);
>> plot(x,y3,'r:'), hold on, plot(x,y4,'k--')
>> legend('coseno di 2x','coseno di 3x'), hold off
Si veda l’help ed il doc per approfondimenti. La legenda puòessere posizionata tramite dei parametri aggiuntivi delcomando. Ma è più semplice nella finestra figura selezionareTools –> Edit plot, cliccare sul riquadro della legenda espostarla con il mouse. Si provi con l’ultimo esempio.
ANCORA SULLE FIGURE 263
subplot
Talvolta si può desiderare che sulla stessa finestra venganorealizzati più riquadri con figure diverse. Questo comando hala sintassi:
subplot (m, n, p)
dove m ed n indicano, rispettivamente, il numero di righe diriquadri ed il numero di colonne dei riquadri. Il valore p è unintero che indica su quale riquadro si vuole venga eseguito ilsuccessivo comando (plot, axis, . . . ). I riquadri si contanoriga per riga, dalla prima all’ultima. Vediamo qualcheesempio per capire meglio. Supponiamo di voler avere sullastessa figura due riquadri. Diamo i comandi
>> x = linspace(0,pi,101); y1 = cos(x); y2 = sin(x);
>> subplot(2,1,1), plot(x,y1)
>> subplot(2,1,2), plot(x,y2)
ANCORA SULLE FIGURE 265
Se vogliamo modificare con il comando axis gli estremi degliassi che sono scelti automaticamente dal Matlab dovviamoancora utilizzare tale comando per selezionare il riquadro sucui vogliamo agire. Proviamo a dare il comando seguente evediamo cosa cambia nella figura
>> subplot(2,1,1), axis([0,pi,-1,1])
Proviamo ora
>> x = linspace(0,2*pi,101);
>> subplot(2,2,1), plot(x,sin(x))
>> subplot(2,2,2), plot(x,sin(2*x))
>> subplot(2,2,3), plot(x,sin(3*x))
>> subplot(2,2,3), plot(x,sin(4*x))
Esercizio: Si modifichi la figura precedente in modo chel’asse x rappresenti esattamente l’intervallo [0, 2π].
ANCORA SULLE FIGURE 267
Esercizio:
I polinomi di Chebyshev (del primo tipo) Tn(x) di grado n
sono definiti come
Tn = cos(n arccosx), −1 ≤ x ≤ 1.
Si scriva uno script che
• disegni, su di una stessa figura, i polinomi di Chebyshev digrado n = 3, 4, 5, 6, di colore, rispettivamente, blu, rosso,verde e magenta.
• disegni su di un’altra finestra figura, su quattro riquadridifferenti (subplot), gli stessi polinomi, con gli stessi coloridella figura precedente.
ANCORA SULLE FIGURE 269
Si scriva poi una funzione di nome Cheb.m che abbia
• come argomenti di ingresso un vettore x che contiene ivalori su cui si vuole valutare il polinomio, ed il valore n
che rappresenta il grado del polinomio desiderato;
• come argomento di uscita il vettore T che conterrà levalutazioni del polinomio effettuate sui valori del vettorex.
Si modifichi lo script precedentemente creato in modo chela valutazione dei quattro polinomi richiesti venga effettuatachiamando la funzione Cheb.
ANCORA SULLE FIGURE 271
GRAFICI CON SCALE DIFFERENTI SUGLI ASSI:
Il comando plot rappresenta con una scala lineare i valori diy rispetto ad i valori di x.
Esistono altri comandi per avere grafici con scale diverse:
semilogy log10(y) rispetto ad i valori di x
semilogx y rispetto ad i valori di log10(x)
loglog scala logaritmica (log10) in entrambi gli assi
Il primo comando è il più utilizzato.
Vediamo un esempio nel quale si vuole tracciare il graficodel residuo in valore assoluto |f(xn)| per le prime 6 iteratex0, x1, . . . , x5 del metodo di bisezione. Si confrontino le trefigure ottenute con i seguenti comandi, dopo aver chiusotutte le figure precedenti, e guardando in particolare cosacambia nelle tre curve e nella scala dell’asse y.
ANCORA SULLE FIGURE 273
>> n = (0:5)';
>> res = [-1.81730723e-3 7.99121959e-4 -2.89795424e-4 ...
-3.50736885e-5 9.23017949e-5 -2.86128353e-5]';
>> plot(n, abs(res), 'r*-')
>> figure, plot(n, log10(abs(res)), 'b*-')
>> figure, semilogy(n, abs(res), 'm*-')
Attenzione: se il o i vettori per i quali si considera il logaritmocontengono valori negativi o nulli, con i comandi precedentiviene segnalato errore ed il Matlab rappresenta sulla figurasolo il logaritmo delle componenti positive. Cosa accade sidiamo i comandi (si confrontino con le prime tre figure)?:
>> % Tale grafico (corretto sintatticamente) non ha senso
>> % (valori positivi e negativi di res) cfr Figure 1
>> figure, plot(n, res, 'r*-')
>> % Warning e poi calcola automaticamente il log10 del valore assoluto di res
>> % cfr Figure 2
>> figure, plot(n, log10(res), 'b*-')
>> % Mostra solamente le componenti positive di res di cui ha calcolato il log10
>> % cfr Figure 3
>> figure, semilogy(n, res, 'm*-')
ANCORA SULLE FIGURE 275
Esercizio:
Si costruiscano due figure diverse per disegnare,nell’intervallo [0, 3], la funzione 10e−2x, una con il comandoplot e l’altra con il comando semilogy.
Si confrontino i grafici e si giustifichi matematicamente laragione per la quale, con il secondo comando, si vede ilgrafico di una retta.Quale retta viene visualizzata?
Dopo averla calcolata matematicamente la si disegni in unaltra figura con il comando plot, nello stesso intervallo e siparagoni tale figura con quella ottenuta con il comandosemilogy.
ANCORA SULLE FIGURE 277
PROGRAMMARE: IL CICLO CON INDICE
LA STRUTTURA ITERATIVA CON INDICE: Oltre al ciclo concondizione while esiste un altro ciclo, detto ciclo fisso o ciclocon indice o ciclo for utilizzabile negli script o function file.Viene usato quando il numero di iterazioni da eseguire èprefissato e determinato dai valori assunti da una variabileindice.Si consideri il seguente esempio che mostra come calcolarela somma dei primi n numeri naturali (escluso lo zero):
n = 100 n = 100;
sumn = 0 sumn = 0;
for k = 1, . . . , n for k = 1:n
sumn = sumn + k sumn = sumn + k;
end for end
print La somma e‘ disp('La somma e`')
print sumn disp(sumn)
PROGRAMMARE: IL CICLO CON INDICE 279
Il blocco di istruzioni compreso tra for e end viene ripetutoassegnando alla variabile indice, uno alla volta, i valoridescritti con la struttura : (colon) (che sono un vettore dicostanti reali). Il numero di volte in cui il ciclo viene eseguitocorrisponde alla lunghezza del vettore implicitamentedefinito. Si guardi il workspace e si noti che k è una variabilesemplice e che il suo valore corrisponde a 100, ossia l’ultimovalore descritto dalla struttura colon e che non viene creatoesplicitamente il vettore corrispondente a 1:n.
Nota: L’esempio precedente è naturalmente solo esplicativoper mostrare la struttura di tale ciclo. Infatti per eseguire inMatlab la stessa operazione è sufficiente utilizzare i seguentisemplici comandi!
n = 100;
sumn = sum(1:n); % oppure sumn = sum([1:n]);
disp('La somma e`'), disp(sumn)
PROGRAMMARE: IL CICLO CON INDICE 281
Vediamo altre possibili variazioni del ciclo for, per realizzaredei cicli con incremento (detto anche passo positivo) nonunitario, con decremento (detto anche passo negativo) oaddirittura con incrementi o decrementi non interi. Cilimitiamo ad indicare solo alcuni comandi, assumendo diaver assegnato il valore di n.Domanda: Per ognuno dei cicli che seguono, si determiniquante volte viene eseguito?for k = 0, . . . , n step 2 for k = 0:2:n
. . . . . . ......
end for end
for k = n− 1, . . . , 1 step −1 for k = n-1:-1:1
. . . . . . ......
end for end
for a = 0, . . . , π step π/15 for a = 0:pi/15:pi
. . . . . . ......
end for end
PROGRAMMARE: IL CICLO CON INDICE 283
Domanda: Cosa succede con i seguenti cicli? Perchè?
% Ciclo 1
n = 10;
for k = n:0
disp(k)
end
% Ciclo 2
for k = 0:-2:n
disp(k)
end
% Ciclo 3
for a = 0:-pi/15:pi
disp(k)
end
Esercizio: Si scriva la funzione x = fibonacci(n) che, passatocome argomento un valore n > 0, restituisce nel vettore x iprimi n termini della successione di Fibonacci definita dallarelazione xk = xk−1 + xk−2, con k ≥ 3 e valori inizialix1 = x2 = 1.
PROGRAMMARE: IL CICLO CON INDICE 285
PREALLOCAZIONE ED INIZIALIZZAZIONE
Molti algoritmi prevedono l’utilizzo del ciclo for. Lavorandocon il Matlab, quando tale ciclo viene utilizzato per lavorarecon vettori e/o matrici (array in generale) bisogna averel’accortezza di preallocare lo spazio di memoria necessarioper le array. In effetti il Matlab ha un memory manager che èin grado di allocare lo spazio necessario durante lacreazione di un array definita elemento per elemento. Maquesto modo di operare è poco efficiente! Quando èpossibile conoscere in anticipo le dimensioni, è beneinizializzare (ad esempio, con la funzione zeros) l’array, e poiassegnare uno ad uno i suoi elementi.
PREALLOCAZIONE ED INIZIALIZZAZIONE 287
Supponiamo di voler creare un vettore x che contenga ivalori 1,2,...,n, con n=100.
n = 100;
for i = 1:n
x(i) = i;
end
Attenzione: i vettori creati con i cicli for utilizzando l’indicedella componente, sono sempre vettori riga, a meno che. . . (si veda la domanda che verrà posta in seguito).
In questo esempio sappiamo esattamente quantecomponenti verranno create. Pertanto possiamopreallocare lo spazio per il vettore x:n = 100;
x = zeros(1,n);
for i = 1:n
x(i) = i;
end
PREALLOCAZIONE ED INIZIALIZZAZIONE 289
Domanda: Cosa cambia se inizializziamo con il comandox = zeros(n,1), lasciando invariato il ciclo for?
Esercizio: Si crei lo stesso vettore x utilizzando il comandolinspace ed anche la notazione : (colon).
I COMANDI tic, toc E cputime:
Per poter valutare l’utilità della preallocazione possiamoutilizzare i comandi Matlab tic e toc i quali calcolano iltempo di esecuzione elapsed.
Con il comando tic viene fatto partire il tempo, si inserisconoi comandi di cui si vuole misurare il tempo di esecuzione epoi, con il comando toc viene visualizzato il tempo in secondiutilizzato.
Vediamo come utilizzare tali due comandi con il nostroesempio, ma aumentando considerevolmente il valore di n:
PREALLOCAZIONE ED INIZIALIZZAZIONE 291
clear all
n = 100000;
% Ciclo senza preallocazione
tic
for i = 1:n
x(i) = i;
end
toc
clear i x
% Ciclo con preallocazione
tic
x=zeros(1,n);
for i = 1:n
x(i) = i;
end
toc
Il risultato che otteniamo èElapsed time is 9.999143 seconds. % Ciclo senza preallocazione
Elapsed time is 0.001053 seconds. % Ciclo con preallocazione
Il tempo di esecuzione elapsed comprende le altre attivitàche vengono svolte in contemporanea nel computer.
PREALLOCAZIONE ED INIZIALIZZAZIONE 293
Proviamo ad utilizzare il comando cputime che misura iltempo impiegato dalla CPU.
clear all
n = 100000;
% Ciclo senza preallocazione
t1=cputime;
for i = 1:n
x(i) = i;
end
cputime-t1
clear i x ans t1
% Ciclo con preallocazione ripetuto 100 volte
t2=cputime;
for k = 1:100
x=zeros(1,n);
for i = 1:n
x(i) = i;
end
end
(cputime-t2)/100
PREALLOCAZIONE ED INIZIALIZZAZIONE 295
Il secondo ciclo viene ripetuto 100 volte per poter misurare iltempo medio impiegato (altrimenti mostra un valore nullo).Otteniamo
ans =
9.546875000000000e+000 % Ciclo senza preallocazione
ans =
9.375000000000000e-004 % Ciclo con preallocazione
con ancora un netto miglioramento nel caso dellapreallocazione.
Esercizio: Si modifichino i precedenti script per aggiungere ilcalcolo dei tempi per la creazione dello stesso vettore coicomandi linspace e : (colon).
Si è dunque visto quanto sia importante l’inizializzazione e lapreallocazione per rendere i programmi più efficienti.
PREALLOCAZIONE ED INIZIALIZZAZIONE 297
LA VETTORIZZAZIONE
Mantenendo il concetto che, ogniqualvolta sia possibile, sidevono preallocare gli array, vi è un’ulteriore operazione chedeve sempre essere eseguita quando si utilizza il Matlab:evitare il più possibile l’utilizzo dei cicli for e sostituirli con lenumerose operazioni e funzioni che il Matlab mette adisposizione.
Vediamo qualche semplice esempio:
% Non vettorizzato % Vettorizzato
x = [1 2 3 4]; x = [1 2 3 4];
for k = 1:length(x) y=x.^2./sin(x);
y(k) = x(k)^2/sin(x(k));
end
Domanda: Cosa accade se nella versione vettorizzata siscrive y=x.�2/sin(x)? Il risultato è corretto?
LA VETTORIZZAZIONE 299
% Non vettorizzato % Vettorizzato
A = [1 2 3; 4 5 6]; A = [1 2 3; 4 5 6];
B = [10 20 30; 40 50 60]; B = [10 20 30; 40 50 60];
for k = 1:size(A,1) B(:,2:end) = A(:,2:end);
for j = 2:size(A,2)
B(k,j) = A(k,j);
end
end
% Non vettorizzato % Vettorizzato
A = [1 2 3; 4 5 6; 7 8 9]; A = [1 2 3; 4 5 6; 7 8 9];
B = [10 20 30; 40 50 60]; B = [10 20 30; 40 50 60];
for k = 2:3 B(1,2:3) = A(2:3,3)';
B(1,k) = A(k,3);
end
Attenzione: Non tutti i cicli for sono sostituibili con comandicompatti e vettorizzati.
LA VETTORIZZAZIONE 301
SCRIPT E FUNCTION M-FILE
Come si è detto sono entrambi file esterni con estensione .m,ma il loro ruolo è differente.Lo Script file è il programma principale nel qualeabitualmente vengono realizzate le seguenti operazioni:
• Assegnazione dei valori alle variabili necessarie per larisoluzione del problema (con istruzione di assegnazioneoppure interattivamente nella finestra comandi conl’istruzione input).
• Chiamata di funzioni (ovvero richiedere la loroesecuzione fornendo gli argomenti di ingresso ericevendo, se esitono, i risultati negli argomenti di uscita)necessarie alla risoluzione del problema.
• Visualizzazione dei risultati su video e/o con figure.
SCRIPT E FUNCTION M-FILE 303
Il function file, invece, risolve un sottoproblema particolare(principalmente l’implementazione di un metodo numerico)e dovrebbe soddisfare alle seguenti regole di buonaprogrammazione:
• Non deve contenere istruzioni input per inserire i datiattuali che, invece, devono essere passati attraversol’istruzione di chiamata utilizzando gli argomenti diingresso.
• Non deve contenere istruzioni di visualizzazione (adesempio disp o fprintf) dei valori di variabili (a menoche non sia una function scritta a tal fine). I risultatidevono essere restituiti al programma chiamanteattraverso l’istruzione di esecuzione della function,utilizzando gli argomenti di uscita.
SCRIPT E FUNCTION M-FILE 305
• Possono essere inserite delle istruzioni disp unicamenteper visualizzare delle stringhe di segnalazione (warning).
• Nelle istruzioni di una certa function, se necessario,possono essere chiamate altre function.
Vediamo ora come procedere quando abbiamo unproblema semplice da risolvere. Prendiamo come esempiola determinazione di una soluzione di un’equazione nonlineare tramite il metodo di bisezione. Avremo bisogno di unafunzione che implementi tale metodo e di uno script che lautilizzi e che preveda l’inserimento dei dati di ingresso e diuscita. Gli algoritmi scritti in pseudocodice descrivonogenericamente quanto deve essere fatto. Ma vi possonoessere delle modifiche richieste.
SCRIPT E FUNCTION M-FILE 307
Supponiamo, ad esempio, che si voglia scrivere una functionbisezfun che debba avere come parametri in ingresso lafunzione (memorizzata come variabile inline function), gliestremi dell’intervallo, la tolleranza ed il numero massimo diiterazioni. Come parametri in uscita si vuole il vettore delleiterate xv che collezioni tutti i punti medi degli intervalligenerati, il vettore dei residui corrispondenti fxv ed il numeron corrispondente all’ultimo valore xn della successione (laprima iterata è x0).
Vediamo di seguito che, rispetto all’algoritmo inpseudocodice originale, abbiamo previsto delle variazioninegli argomenti di uscita con la definizione di due nuovevariabili array xv e fxv inizializzate ed assegnate all’internodella function, per conservare tutti i valori calcolati ememorizzati, rispettivamente, nelle variabili x e fx.
SCRIPT E FUNCTION M-FILE 309
ALGORITMO E function PER METODO DI BISEZIONE
[x, n]=Bisezione(f, a, b, toll, nmax) function[xv,fxv,n]=bisezfun(f,a,b,toll,nmax)
n = −1 n = -1;
amp = toll + 1 amp = toll+1;
xv = []; fxv = [];
fa = f(a) fa = feval(f,a);
while amp ≥ toll and n < nmax do while (amp >= toll) && (n < nmax)
n = n + 1 n = n+1;
amp = |b − a| amp = abs(b-a);
x = a + amp × 0.5 x = a + amp*0.5;
fx = f(x) fx = feval(f,x);
xv = [xv; x]; fxv = [fxv; fx];
if fa · fx < 0 then if fa*fx < 0
b = x b = x;
else if fa · fx > 0 then elseif fa*fx > 0
a = x a = x;
fa = fx fa = fx;
else else
amp = 0 amp = 0;
end if end
end while end
ALGORITMO E function PER METODO DI BISEZIONE 311
È molto importante, nella scrittura di una function, curareanche i commenti e la parte introduttiva. Vediamo dunqueche aspetto finale potrebbe avere la nostra function:function [xv, fxv, n] = bisezfun (f, a, b, toll, nmax)
%BISEZFUN Metodo di Bisezione
% Uso:
% [xv, fxv, n] = bisezfun(f, a, b, toll, nmax)
%
% Dati di ingresso:
% f: funzione (inline function)
% a: estremo sinistro
% b: estremo destro
% toll: tolleranza richiesta per l'ampiezza
% dell'intervallo
% nmax: massimo indice dell'iterata permesso
%
% Dati di uscita:
% xv: vettore contenente le iterate
% fxv: vettore contenente i corrispondenti residui
% n: indice dell'iterata finale calcolata
n = -1; % Inizializza il contatore n
amp = toll+1; % Inizializza amp ad un valore fittizio > toll
ALGORITMO E function PER METODO DI BISEZIONE 313
% per poter entrare nel ciclo while iterativo
% Inizializza i vettori xv e fxv
xv = [];
fxv = [];
% Calcola il valore f(a)
fa = feval(f,a);
% Ciclo iterativo del metodo
while (amp >= toll) && (n < nmax) % TEST DI ARRESTO
n = n+1; % incrementa il contatore delle iterate
amp = abs(b-a); % calcola l'ampiezza dell'intervallo
x = a + amp*0.5; % calcola il punto medio dell'intervallo
fx = feval(f,x); % Calcola il valore f(x)
xv = [xv; x]; % aggiunge al vettore la nuova iterata
fxv = [fxv; fx]; % aggiunge al vettore il nuovo residuo
% Seleziona le azioni in base a f(a)*f(x)
if fa*fx < 0
b = x;
elseif fa*fx > 0
a = x;
fa = fx;
else % caso fx = 0 (x e' la migliore approssimazione ottenibile)
amp = 0;
end
end
ALGORITMO E function PER METODO DI BISEZIONE 315
SCRIPT PER METODO DI BISEZIONE
Vediamo ora come potrebbe essere scritto uno script cheutilizzi la nostra function bisezfun. Si desidera uno script cherichieda a video (comando input) i dati, ovvero la funzione,gli estremi dell’intervallo iniziale, la tolleranza e il massimoindice dell’iterata permesso. Ottenuti gli argomenti di uscitadalla funzione (risultati), deve visualizzare (comando disp)l’ultima soluzione approssimata determinata dalla function, ilrelativo residuo, e l’indice dell’ultima iterata calcolata. Deveanche visualizzare una scritta di avviso qualora sia statoraggiunto l’indice massimo per le iterazioni, senza averraggiunto la tolleranza sull’ampiezza dell’intervallodesiderata. Si vuole poi che lo script preveda anche ungrafico che rappresenti (scala logaritmica sull’asse y) il valoreassoluto del vettore che contiene tutti i residui (fxv).
SCRIPT PER METODO DI BISEZIONE 317
Vediamo prima la versione base senza commenti, e poi,quella completa e migliorata.exprf = input('funzione (stringa) = ');
a = input('estremo sinistro a = ');
b = input('estremo destro b = ');
toll = input('tolleranza = ');
nmax = input('massimo indice dell''iterata = ');
f = inline(exprf);
[xv, fxv, n] = bisezfun (f, a, b, toll, nmax);
disp(xv(end));
disp(fxv(end));
disp(n);
if n == nmax
disp('Massimo indice dell''iterata raggiunto')
end
k=0:n;
semilogy(k,abs(fxv))
SCRIPT PER METODO DI BISEZIONE 319
%=============================================================
% Script per il Metodo di Bisezione
% Necessita delle Function bisezfun
%=============================================================
% Ingresso dati
disp('METODO DI BISEZIONE');
disp(' '); % lascia una riga bianca in uscita su video
exprf = input('funzione (stringa) = ');
a = input('estremo sinistro a = ');
b = input('estremo destro b = ');
toll = input('tolleranza = ');
nmax = input('massimo indice dell''iterata = ');
disp(' '); % lascia una riga bianca in uscita su video
% Parte esecutiva
% inline(exprf) trasforma la stringa exprf in inline function
f = inline(exprf);
SCRIPT PER METODO DI BISEZIONE 321
% chiede l'esecuzione della function che implementa
% il metodo di bisezione
[xv, fxv, n] = bisezfun (f, a, b, toll, nmax);
% Visualizza i risultati richiesti
disp('Ultima iterata calcolata');
format long; disp(xv(end)); format short;
disp('Residuo dell''ultima iterata');
disp(fxv(end));
disp('Indice dell''ultima iterata');
disp(n);
if n == nmax
disp('Massimo indice dell''iterata raggiunto')
end
% Grafico dei residui
k=0:n;
semilogy(k,abs(fxv))
title(['Residui Bisezione per funzione ', exprf ] );
SCRIPT PER METODO DI BISEZIONE 323
METODO DI NEWTON
Vogliamo scrivere una function newtonfun che abbia comeparametri in ingresso la funzione f, la derivata f1 (entrambevariabili inline function), il valore iniziale x0, la tolleranzatoll ed il numero massimo di iterazioni consentite nmax;come parametri in uscita, il vettore xv che contiene leiterate, approssimazioni successive della soluzione (incluso ilvalore iniziale x0), il vettore fxv dei residui calcolati nellecorrispondenti iterate, il numero n di iterazioni effettuate euna variabile di controllo flag che indichi un’eventualedivisione per zero della derivata prima nell’iterata corrente.
Mettiamo ancora a confronto l’algoritmo in pseudocodice ela funzione matlab.
METODO DI NEWTON 325
ALGORITMO E function PER METODO DI NEWTON
[xn, n, flag]=Newton(f, f ′, x0, toll, nmax) function[xv,fxv,n,flag] = ...
newtonfun(f,f1,x0,toll,nmax)
n = 0 n = 0;
flag = 0 flag = 0;
diff = toll + 1 diff = toll+1;
xv(1) = x0;
while diff ≥ toll and n < nmax and flag = 0 do while (diff>=toll)&&(n<nmax)&&(flag ==0)
f1x = feval(f1,xv(n+1));
if f ′(xn) = 0 then if f1x == 0
flag = 1 flag = 1;
else else
n = n+1;
fx = feval(f,xv(n));
fxv(n) = fx;
diff = −f(xn)/f′(xn) diff = -fx/f1x;
xn+1 = xn + diff xv(n+1)=xv(n)+diff;
diff = |diff| diff = abs(diff);
n = n + 1
end if end
end while end
fxv(n+1) = feval(f,xv(n+1));
ALGORITMO E function PER METODO DI NEWTON 327
Ecco la function correttamente documentata ecommentata:
function [xv, fxv, n, flag] = newtonfun (f, f1, x0, toll, nmax)
%NEWTONFUN Metodo di Newton
%
% Uso:
% [xv, fxv, n, flag] = newtonfun (f, f1, x0, toll, nmax)
%
% Dati di ingresso:
% f: funzione
% f1: derivata prima
% x0: valore iniziale
% toll: tolleranza richiesta per il valore assoluto
% della differenza di due iterate successive
% nmax: massimo numero di iterazioni permesse
%
% Dati di uscita:
% xv: vettore contenente le iterate
% fxv: vettore contenente i corrispondenti residui
% n: numero di iterazioni effettuate
% flag: Se flag = 1 la derivata prima si e' annullata
ALGORITMO E function PER METODO DI NEWTON 329
n = 0; % Inizializza il contatore n
flag = 0; % inizializza la variabile di seggnalazione
diff = toll+1; % Inizializza diff ad un valore fittizio > toll
% per poter entrare nel ciclo while iterativo
xv(1) = x0; % Definisce la prima iterata
% Ciclo iterativo del metodo
while (diff >= toll) && (n < nmax) && (flag ==0) % TEST DI ARRESTO
f1x = feval(f1,xv(n+1)); % Calcola il valore f'(x_n)
if f1x == 0
flag = 1;
else
n = n+1; % incrementa il contatore delle iterate
fx = feval(f,xv(n)); % Calcola il valore f(x_n)
fxv(n) = fx; % salva il residuo della precedente iterata
diff = -fx/f1x; % Calcola il valore -f(x_n)/f'(x_n)
xv(n+1)=xv(n)+diff; % Calcola il valore x_{n+1}
diff = abs(diff); % Calcola il valore |x_{n+1}-x_n|
end
end
% Calcola e salva l'ultimo residuo
fxv(n+1) = feval(f,xv(n+1));
ALGORITMO E function PER METODO DI NEWTON 331
SCRIPT PER newtonfun
%====================================================================
% Script per il Metodo di Newton
% NEWTONSCRIPT.M
% Necessita della Function newtonfun
%====================================================================
% Ingresso dati
disp('METODO DI NEWTON');
disp(' '); % lascia una riga bianca in uscita su video
exprf = input('funzione (stringa) = ');
exprf1 = input('derivata (stringa) = ');
x0 = input('valore iniziale = ');
toll = input('tolleranza = ');
nmax = input('numero massimo di iterazioni = ');
% Parte esecutiva
% trasforma le stringhe in funzioni
f = inline(exprf);
f1 = inline(exprf1);
SCRIPT PER newtonfun 333
% chiede l'esecuzione della function che implementa il metodo di Newton
[xv, fxv, n, flag] = newtonfun (f, f1, x0, toll, nmax);
if flag == 1 % controlla l'annullamento della derivata prima
disp('La derivata si annulla nell''iterata con indice');
disp(n);
disp('Ripetere l''esecuzione cambiando il valore iniziale');
elseif n ~= nmax % Controlla il raggiungimento del numero massimo di iterazioni
% visualizza i risultati
disp('Ultima iterata calcolata');
format long; disp(xv(end)); format short;
disp('Residuo dell''ultima iterata');
disp(fxv(end));
disp('Indice dell''ultima iterata');
disp(n);
% Grafico dei residui
k=0:n;
semilogy(k,abs(fxv))
title(['Residui Newton per funzione ', exprf ] );
else % Raggiunto il numero massimo di iterazioni
disp('Raggiunto il numero massimo di iterazioni possibili');
disp('Ripetere l''esecuzione aumentando le iterazioni');
end
SCRIPT PER newtonfun 335
DOMANDA E . . . RISPOSTA!
Domanda: I comandi x1 = 0:0.1:1 e x2 = linspace(0,1,11)
forniscono lo stesso risultato?
Risposta: Apparentemente sì! Ma . . . solo in apparenza.Infatti:
>> x1 = 0:0.1:1
>> x2 = linspace(0,1,11) % Punti equispaziati di h=0.1 in [0,1]
>> x1 == x2 % Confrontiamo le componenti corrispondenti
>> % La presenza di uno 0 nella posizione corrispondente alla
>> % componente 4 indica che x1(4) e` diverso da x2(4).
>> % Tutti gli altri sono uguali (presenza di 1). Infatti
>> ea = x1(4)-x2(4) % non e` uguale a zero!
I due comandi operano in modo diverso. Ovviamente ladifferenza non è rilevante (errore assoluto dell’ordine di10−17).
DOMANDA E . . . RISPOSTA! 337
Infatti se diamo
>> xx1 = x1(3)+0.1; xx1 == x1(4), xx2 = x2(3)+0.1; xx2 == x2(4)
>> er = (x1(4)-x2(4))/(x1(3)+0.1), eps
vediamo che la componente 4 del vettore x2 calcolato conlinspace non corrisponde esattamente al numero macchinaottenuto considerando la componente 3 ed aggiungendol’incremento 0.1. L’errore relativo è comunque inferiore allacostante macchina eps. Ma se diamo
>> xx1 = x1(4)+0.1; xx1 == x1(5), xx2 = x2(4)+0.1; xx2 == x2(5)
tutto ritorna a posto.
È solo una curiosità, che mostra come formule, algoritmi emetodi diversi, anche se matematicamente equivalenti,possono dare risultati diversi!
DOMANDA E . . . RISPOSTA! 339
ESERCIZI E . . . SOLUZIONI!
Esercizio: dato un intero n, ed un intervallo [a,b], si scriva uncomando che, utilizzando il carattere due punti :, e tenendoconto di come si deve calcolare il passo h, crei un vettoreriga di lunghezza n che contenga
[a, a+h, a+2h, ..., b]
La soluzione ottimale è costituita da quattro soli comandi (dicui il primi tre consistono nell’assegnazione dei valori allevariabili n, a e b).
Soluzione:
>> n = 10; a = 2; b = 6;
>> x = a:(b-a)/(n-1):b
ESERCIZI E . . . SOLUZIONI! 341
Esercizio: Come il precedente, ma costruendo un vettorecolonna.Anche in questo caso, la soluzione ottimale è costituita daquattro soli comandi.
Soluzione: Due possibili soluzioni.
>> n = 10; a = 2; b = 6;
>> x = (a:(b-a)/(n-1):b)'
>> % oppure
>> x = [a:(b-a)/(n-1):b]'
Si provi invece
>> x = a:(b-a)/(n-1):b'
Cosa si nota?
ESERCIZI E . . . SOLUZIONI! 343
Esercizio: Si scriva una function che disegni unacirconferenza di raggio r e centro l’origine degli assi. Lacirconferenza deve avere l’aspetto “corretto” (non comeun’ellisse!), deve essere a distanza r da ogni lato del riquadroed il riquadro stesso deve essere quadrato (suggerimento:coordinate polari).
Soluzione:
function cerchio(r)
theta = linspace(0,2*pi,200);
x = r*cos(theta);
y = r*sin(theta);
plot(x,y)
axis([-2*r,2*r,-2*r,2*r])
axis square
ESERCIZI E . . . SOLUZIONI! 345
Proviamo questa function e diamo
>> figure(1)
>> cerchio(10)
>> figure(2)
>> cerchio(3)
Che differenza si rileva nelle due figure?
Si provi ora con i comandi (ovviamente il secondosemanticamente non ha significato!)
>> figure(3)
>> cerchio(-2)
Si modifichi e corregga la function cerchio in modo che, sel’argomento è negativo, lo trasformi nel corrispondentevalore positivo (basta aggiungere un’istruzione diassegnazione!)
ESERCIZI E . . . SOLUZIONI! 347