matlab help e documentazione - math.unipd.italvise/cn_2017_info/esami/2016_2017_1/matlab/... · il...

348
M ATLAB , HELP E DOCUMENTAZIONE Il Matlab è un ambiente che permette in modo interattivo, senza la necessità di consultare corposi manuali, di ottenere informazioni e visualizzare documentazione ed esempi. È buona prassi utilizzare in modo intensivo tali funzionalità per l’autocorrezione e per l’apprendimento. Ecco alcune possibilità: Supponiamo di conoscere il nome del comando (funzione) Matlab o della variabile riservata Matlab su cui vogliamo acquisire informazioni dettagliate. Utilizziamo il comando o il comando . Esempi: Come si vede, le informazioni del comando vengono fornite nella finestra comandi, e quelle del comando , MATLAB , HELP E DOCUMENTAZIONE 1

Upload: lethien

Post on 18-Oct-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

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

NOTE:

MATLAB, HELP E DOCUMENTAZIONE 2

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

NOTE:

MATLAB, HELP E DOCUMENTAZIONE 4

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

NOTE:

COSTANTI NUMERICHE REALI 6

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

NOTE:

COSTANTI NUMERICHE REALI 8

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

NOTE:

VARIABILI 10

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

NOTE:

VARIABILI 12

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

NOTE:

VARIABILI 14

• 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

NOTE:

VARIABILI 16

• 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

NOTE:

VARIABILI 18

• 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

NOTE:

VARIABILI 20

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

NOTE:

VARIABILI 22

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

NOTE:

VARIABILI 24

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

NOTE:

VARIABILI 26

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

NOTE:

COMMENTI E DOCUMENTAZIONE 28

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

NOTE:

COMMENTI E DOCUMENTAZIONE 30

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

NOTE:

ANCORA SULLE VARIABILI E FUNZIONI 32

>> 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

NOTE:

ANCORA SULLE VARIABILI E FUNZIONI 34

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

NOTE:

ANCORA SULLE VARIABILI E FUNZIONI 36

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

NOTE:

ANCORA SULLE VARIABILI E FUNZIONI 38

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

NOTE:

ANCORA SULLE VARIABILI E FUNZIONI 40

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

NOTE:

ANCORA SULLE VARIABILI E FUNZIONI 42

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

NOTE:

ANCORA SULLE VARIABILI E FUNZIONI 44

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

NOTE:

ANCORA SULLE VARIABILI E FUNZIONI 46

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

NOTE:

ANCORA SULLE VARIABILI E FUNZIONI 48

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

NOTE:

ANCORA SULLE VARIABILI E FUNZIONI 50

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

NOTE:

VARIABILI STRINGA DI CARATTERI 52

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

NOTE:

VARIABILI STRINGA DI CARATTERI 54

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

NOTE:

VARIABILI STRINGA DI CARATTERI 56

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

NOTE:

VARIABILI STRINGA DI CARATTERI 58

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

NOTE:

SCRIPT M-FILE 60

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

NOTE:

SCRIPT M-FILE 62

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

NOTE:

SCRIPT M-FILE 64

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

NOTE:

SCRIPT M-FILE 66

• 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

NOTE:

SCRIPT M-FILE 68

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

NOTE:

SCRIPT M-FILE 70

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

NOTE:

ESERCIZIO 72

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

NOTE:

RIDEFINIZIONE DEL TIPO DI VARIABILI 74

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

NOTE:

RIDEFINIZIONE DEL TIPO DI VARIABILI 76

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

NOTE:

VETTORI E MATRICI 78

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

NOTE:

ARRAY 80

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

NOTE:

ARRAY 82

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

NOTE:

ARRAY 84

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

NOTE:

ARRAY 86

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

NOTE:

ARRAY 88

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

NOTE:

OPERAZIONI PER ARRAY 90

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

NOTE:

OPERAZIONI PER ARRAY 92

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

NOTE:

OPERAZIONI PER ARRAY 94

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

NOTE:

OPERAZIONI PER ARRAY 96

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

NOTE:

OPERAZIONI PER ARRAY 98

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

NOTE:

OPERAZIONI PER ARRAY 100

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

NOTE:

OPERAZIONI PER ARRAY 102

>> 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

NOTE:

OPERAZIONI PER ARRAY 104

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

NOTE:

OPERAZIONI PER ARRAY 106

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

NOTE:

OPERAZIONI PER ARRAY 108

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

NOTE:

OPERAZIONI PER ARRAY 110

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

NOTE:

OPERAZIONI PER ARRAY 112

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

NOTE:

OPERAZIONI PER ARRAY 114

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

NOTE:

OPERAZIONI PER ARRAY 116

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

NOTE:

OPERAZIONI PER ARRAY 118

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

NOTE:

ESERCIZIO 120

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

NOTE:

INIZIAMO A PROGRAMMARE 122

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

NOTE:

INIZIAMO A PROGRAMMARE 124

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

NOTE:

INIZIAMO A PROGRAMMARE 126

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

NOTE:

INIZIAMO A PROGRAMMARE 128

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

NOTE:

ESPRESSIONI LOGICHE 130

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

NOTE:

ESPRESSIONI LOGICHE 132

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

NOTE:

ESPRESSIONI LOGICHE 134

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

NOTE:

ESPRESSIONI LOGICHE 136

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

NOTE:

ESPRESSIONI LOGICHE 138

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

NOTE:

ESPRESSIONI LOGICHE 140

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

NOTE:

ESPRESSIONI LOGICHE 142

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

NOTE:

INIZIALIZZAZIONE DI ARRAY 144

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

NOTE:

INIZIALIZZAZIONE DI ARRAY 146

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

NOTE:

INIZIALIZZAZIONE DI ARRAY 148

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

NOTE:

INIZIALIZZAZIONE DI ARRAY 150

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

NOTE:

INIZIALIZZAZIONE DI ARRAY 152

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

NOTE:

FUNZIONI MATEMATICHE ED ARRAY 154

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

NOTE:

OPERAZIONI PER ARRAY, ELEMENTO PER ELEMENTO 156

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

NOTE:

OPERAZIONI PER ARRAY, ELEMENTO PER ELEMENTO 158

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

NOTE:

OPERAZIONI PER ARRAY, ELEMENTO PER ELEMENTO 160

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

NOTE:

OPERAZIONI PER ARRAY, ELEMENTO PER ELEMENTO 162

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

NOTE:

CONTINUIAMO A PROGRAMMARE 164

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

NOTE:

CONTINUIAMO A PROGRAMMARE 166

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

NOTE:

INDICIZZAZIONE DEGLI ARRAY 168

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

NOTE:

INDICIZZAZIONE DEGLI ARRAY 170

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

NOTE:

INDICIZZAZIONE DEGLI ARRAY 172

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

NOTE:

INDICIZZAZIONE DEGLI ARRAY 174

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

NOTE:

INDICIZZAZIONE AVANZATA 176

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

NOTE:

INDICIZZAZIONE AVANZATA 178

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

NOTE:

INDICIZZAZIONE AVANZATA 180

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

NOTE:

INDICIZZAZIONE AVANZATA 182

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

NOTE:

ARRAY CONCATENATI 184

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

NOTE:

RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 186

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

NOTE:

RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 188

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

NOTE:

RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 190

• 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

NOTE:

RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 192

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

NOTE:

RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 194

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

NOTE:

RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 196

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

NOTE:

RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 198

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

NOTE:

RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 200

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

NOTE:

RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 202

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

NOTE:

RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 204

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

NOTE:

RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 206

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

NOTE:

RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 208

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

NOTE:

RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 210

• 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

NOTE:

RAPPRESENTARE GRAFICAMENTE UNA FUNZIONE 212

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

NOTE:

LA VARIABILE FUNZIONE 214

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

NOTE:

LA VARIABILE FUNZIONE 216

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

NOTE:

UN SEMPLICE SCRIPT PER DISEGNARE UNA SOLA FUNZIONE 218

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

NOTE:

UN SEMPLICE SCRIPT PER DISEGNARE UNA SOLA FUNZIONE 220

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

NOTE:

UN SEMPLICE SCRIPT PER DISEGNARE UNA SOLA FUNZIONE 222

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

NOTE:

UNA FUNZIONE UTILE PER SCRIPT: input 224

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

NOTE:

UNA FUNZIONE UTILE PER SCRIPT: input 226

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

NOTE:

UNA FUNZIONE UTILE PER SCRIPT: input 228

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

NOTE:

FUNCTION M-FILE 230

• 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

NOTE:

FUNCTION M-FILE 232

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

NOTE:

FUNCTION M-FILE 234

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

NOTE:

FUNCTION M-FILE 236

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

NOTE:

FUNCTION M-FILE 238

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

NOTE:

ESERCIZI 240

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

NOTE:

FUNCTION M-FILE (CONTINUA) 242

• 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

NOTE:

FUNCTION M-FILE (CONTINUA) 244

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

NOTE:

FUNCTION M-FILE (CONTINUA) 246

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

NOTE:

FUNCTION M-FILE (CONTINUA) 248

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

NOTE:

FUNCTION M-FILE (CONTINUA) 250

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

NOTE:

ANCORA SULLE FIGURE 252

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

NOTE:

ANCORA SULLE FIGURE 254

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

NOTE:

ANCORA SULLE FIGURE 256

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

NOTE:

ANCORA SULLE FIGURE 258

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

NOTE:

ANCORA SULLE FIGURE 260

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

NOTE:

ANCORA SULLE FIGURE 262

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

NOTE:

ANCORA SULLE FIGURE 264

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

NOTE:

ANCORA SULLE FIGURE 266

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

NOTE:

ANCORA SULLE FIGURE 268

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

NOTE:

ANCORA SULLE FIGURE 270

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

NOTE:

ANCORA SULLE FIGURE 272

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

NOTE:

ANCORA SULLE FIGURE 274

>> 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

NOTE:

ANCORA SULLE FIGURE 276

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

NOTE:

ANCORA SULLE FIGURE 278

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

NOTE:

PROGRAMMARE: IL CICLO CON INDICE 280

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

NOTE:

PROGRAMMARE: IL CICLO CON INDICE 282

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

NOTE:

PROGRAMMARE: IL CICLO CON INDICE 284

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

NOTE:

PROGRAMMARE: IL CICLO CON INDICE 286

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

NOTE:

PREALLOCAZIONE ED INIZIALIZZAZIONE 288

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

NOTE:

PREALLOCAZIONE ED INIZIALIZZAZIONE 290

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

NOTE:

PREALLOCAZIONE ED INIZIALIZZAZIONE 292

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

NOTE:

PREALLOCAZIONE ED INIZIALIZZAZIONE 294

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

NOTE:

PREALLOCAZIONE ED INIZIALIZZAZIONE 296

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

NOTE:

PREALLOCAZIONE ED INIZIALIZZAZIONE 298

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

NOTE:

LA VETTORIZZAZIONE 300

% 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

NOTE:

LA VETTORIZZAZIONE 302

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

NOTE:

SCRIPT E FUNCTION M-FILE 304

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

NOTE:

SCRIPT E FUNCTION M-FILE 306

• 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

NOTE:

SCRIPT E FUNCTION M-FILE 308

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

NOTE:

SCRIPT E FUNCTION M-FILE 310

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

NOTE:

ALGORITMO E function PER METODO DI BISEZIONE 312

È 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

NOTE:

ALGORITMO E function PER METODO DI BISEZIONE 314

% 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

NOTE:

ALGORITMO E function PER METODO DI BISEZIONE 316

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

NOTE:

SCRIPT PER METODO DI BISEZIONE 318

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

NOTE:

SCRIPT PER METODO DI BISEZIONE 320

%=============================================================

% 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

NOTE:

SCRIPT PER METODO DI BISEZIONE 322

% 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

NOTE:

SCRIPT PER METODO DI BISEZIONE 324

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

NOTE:

METODO DI NEWTON 326

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

NOTE:

ALGORITMO E function PER METODO DI NEWTON 328

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

NOTE:

ALGORITMO E function PER METODO DI NEWTON 330

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

NOTE:

ALGORITMO E function PER METODO DI NEWTON 332

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

NOTE:

SCRIPT PER newtonfun 334

% 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

NOTE:

SCRIPT PER newtonfun 336

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

NOTE:

DOMANDA E . . . RISPOSTA! 338

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

NOTE:

DOMANDA E . . . RISPOSTA! 340

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

NOTE:

ESERCIZI E . . . SOLUZIONI! 342

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

NOTE:

ESERCIZI E . . . SOLUZIONI! 344

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

NOTE:

ESERCIZI E . . . SOLUZIONI! 346

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

NOTE:

ESERCIZI E . . . SOLUZIONI! 348