Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.)....

41
1 Ai blocchi di partenza Contenuto 1.1 Un giro di riscaldamento 1.2 Chi è Matlab? 1.3 Semplici operazioni in MATLAB 1.1 Un giro di riscaldamento A partire dal fortunato testo di riferimento di Kernighan e Ritchie sul linguaggio C molte in- troduzioni a linguaggi di programmazione iniziano proponendo un programma che produce la famosa scritta hello world. Nel caso di MATLAB l’equivalente del saluto al mondo po- trebbe essere la creazione di due vettori x, y ed il disegno del grafico della tabella di punti con ascisse contenute nel vettore x e ordinate contenute nel vettore y. Il lettore dovrebbe avere già familiarità con la nozione di vettore, in ogni caso si consideri, per ora, un vettore come una successione di numeri, detti elementi o componenti del vettore. Proviamo ad “avviare” MATLAB. In ambiente Windows solitamente occorre selezionare l’icona di MATLAB nel desktop o nella barra comandi, mentre se si usa il sistema operativo Unix (o qualche derivato come Linux) è necessario scrivere matlab, seguito da invio, in una fi- nestra al prompt dei comandi. Una volta avviato MATLAB vi offre diverse finestre; fissiamo la nostra attenzione sulla finestra dei comandi caratterizzata dal prompt >> se state utilizzan- do la versione Professional Edition o dal prompt EDU>> nel caso abbiate a disposizione la versione Student Edition 1 di MATLAB. Per comodità nel seguito utilizzeremo sempre >> per indicare il prompt della riga comandi della finestra principale di MATLAB. A questo punto creiamo un vettore x di ascisse >> x = [0 0.05 0.1 0.15 0.2 0.25 0.30 0.35 0.4 0.45 0.5] Riproducendo l’istruzione MATLAB precedente (facendo attenzione a separare i valori con uno spazio) seguita da invio, apparirà la “risposta” x= Columns 1 through 7 1 La versione Student Edition ha un costo piuttosto contenuto, ma presenta alcune limitazioni sulla lunghezza massima dei vettori e sulla disponibilità di Toolbox, cioè di applicazioni per problemi specifici.

Transcript of Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.)....

Page 1: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1 Ai blocchi di partenza

Contenuto

1.1 Un giro di riscaldamento

1.2 Chi è Matlab?

1.3 Semplici operazioni in MATLAB

1.1 Un giro di riscaldamento

A partire dal fortunato testo di riferimento di Kernighan e Ritchie sullinguaggio Cmolte in-troduzioni a linguaggi di programmazione iniziano proponendo un programma che producela famosa scrittahello world. Nel caso di MATLAB l’equivalente del saluto al mondo po-trebbe essere la creazione di due vettorix, y ed il disegno del grafico della tabella di punti conascisse contenute nel vettorex e ordinate contenute nel vettorey. Il lettore dovrebbe averegià familiarità con la nozione di vettore, in ogni caso si consideri, per ora, un vettore comeuna successione di numeri, dettielementio componentidel vettore.

Proviamo ad “avviare” MATLAB. In ambienteWindows solitamente occorre selezionarel’icona di MATLAB nel desktop o nella barra comandi, mentre se si usa il sistema operativoUnix (o qualche derivato comeLinux) è necessario scriverematlab, seguito dainvio, in una fi-nestra al prompt dei comandi. Una volta avviato MATLAB vi offre diverse finestre; fissiamola nostra attenzione sulla finestra dei comandi caratterizzata dal prompt>> se state utilizzan-do la versioneProfessional Editiono dal promptEDU>> nel caso abbiate a disposizione laversioneStudent Edition1 di MATLAB. Per comodità nel seguito utilizzeremo sempre>> perindicare il prompt della riga comandi della finestra principale di MATLAB.

A questo punto creiamo un vettorex di ascisse

>> x = [0 0.05 0.1 0.15 0.2 0.25 0.30 0.35 0.4 0.45 0.5]

Riproducendo l’istruzione MATLAB precedente (facendo attenzione a separare i valoricon uno spazio) seguita dainvio, apparirà la “risposta”

x =Columns 1 through 7

1 La versione Student Edition ha un costo piuttosto contenuto, ma presenta alcune limitazioni sulla lunghezzamassima dei vettori e sulla disponibilità di Toolbox, cioè di applicazioni per problemi specifici.

Page 2: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

2 Partenza

0 0.0500 0.1000 0.1500 0.2000 0.2500 0.3000Columns 8 through 11

0.3500 0.4000 0.4500 0.5000

Cosa è successo? Abbiamo generato un vettore di nomex con11 elementi (tutti numerireali), tale vettore è stato memorizzato nell’area di lavoro (Workspace) di MATLAB. Le pa-rentesi quadre servono quindi a delimitare l’inizio e la fine del vettore. Sorvoliamo per orasulle indicazioniColumns ... through ... che saranno riprese nel seguito.

Come individuare un elemento del vettorex? Il metodo più naturale consiste nell’usodi un indice che indica la componente del vettore, come avviene in tutti i linguaggi di pro-grammazione di alto livello (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLABci suggerisce l’insieme di valori assunti da tale indice nel caso del nostro vettorex: da1 a11. La sintassi per individuare un singolo elemento, per esempio il settimo elemento, dovràcoinvolgere il nome del vettore e la posizione. Nel caso di MATLAB, l’indice va racchiusotra parentesi tonde e il settimo elemento potrà quindi essere richiamato con l’istruzione

>> x(7)ans =

0.3000

Supponiamo ora di voler calcolare il valore della funzionef(x) = cos (4πx) nei puntix(1), x(2), x(3), x(4), x(5), x(6), x(7), x(8), x(9), x(10), x(11). Come possiamo fare?Se siete abituati a qualche linguaggio di programmazione probabilmente starete pensando piùo meno a una sequenza del tipo

• dichiarazione di un vettore, per esempio di nomey, con11 elementi;

• definizione della variabilePI contenete una approssimazione diπ;

• ciclo in cui si aggiorna di volta in volta l’indice, per esempio dettok tale indice, sicalcola il valorey(k)= cos(4*PI*x(k)) perk = 1, 2, . . . , 11.

In MATLAB possiamo semplicemente agire come segue

>> y = cos(4*pi*x)

L’espressione dovrebbe essere intuitiva, si noti l’uso di* per indicare l’operazione di molti-plicazione di un numero per un vettore e dipi variabile predefinita in MATLAB che contieneuna approssimazione del valoreπ. Adesso l’ambiente di lavoro di MATLAB, per la sessioneappena aperta, contiene due vettorix e y, ciascuno con11 elementi.

Concludiamo il paragrafo con un’ultima operazione: disegnamo il grafico approssimatodella funzionef(x) = cos (4πx), conx ∈ [0, 0.5], utilizzando i due vettorix e y appenagenerati. Scriviamo

>> plot(x,y)

per ottenere un risultato grafico come in Figura 1.1. Il grafico viene realizzato congiungendocon segmenti di retta i punti consecutiviPk = (x(k),y(k)) perk = 1, 2, . . . , 11 ottenendo co-sì una “linea spezzata”. Le scale e le etichette degli assi cartesiani sono stati automaticamentepredisposti da MATLAB.

Page 3: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.2 Chi è Matlab? 3

0 0.05 0.1 0.15 0.2 0.25 0.3 0.35 0.4 0.45 0.5−1

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1

Figura 1.1. Grafico della funzionef(x) = cos (4πx) utilizzando11 punti.

Quanto detto per presentare questo “hello world” alla MATLAB sarà approfondito nelseguito. Il lettore è invitato a proseguire utilizzando i comandiintro (che produce una breveintroduzione a MATLAB) edemo (che consente di analizzare più programmi dimostrativiconsiderando sia le proprietà di base di MATLAB che alcune applicazioni particolari). Perterminare la sessione possono essere utilizzati i comandiexit oppurequit.

1.2 Chi è Matlab?

MATLAB è un linguaggio di supporto per il calcolo scientifico. Senza avere la pretesa di for-nire una definizione rigorosa potremmo dire che il calcolo scientifico si occupa dello svilup-po, della implementazione e della analisi degli algoritmi numerici (e non) utili per l’impiegodi modelli matematici. Sintetizzando potremmo dire

Modelli + Algoritmi + Programmi= Calcolo Scientifico

La storia di MATLAB inizia negli anni settanta con le librerie matematiche (scritte inizial-mente in linguaggio FORTRAN)LINPACK e EISPACK riguardanti la soluzione numerica diproblemi in algebra lineare (sistemi lineari, fattorizzazione di matrici, minimi quadrati linea-ri, autovalori e autovettori ecc.). Intorno al 1980 Cleve B. Moler scrisse la prima versionedi MATLAB allo scopo di sviluppare, sempre in FORTRAN, un “calcolatore matriciale inte-rattivo”. Infatti MATLAB è l’acronimo di MAT rix LAB oratory e inizialmente non era altroche una sofisticata “calcolatrice scientifica” operante su matrici. Nel 1985, con la fondazionedella società Mathworks2, MATLAB è diventato un linguaggio orientato alle matrici con im-portanti aggiunte per l’analisi dei dati e per la visualizzazione scientifica. Da allora a oggi sisono avuti continui sviluppi e nuove potenzialità sono state aggiunte. In particolare, partendoda MATLAB, sono stati sviluppati diversiTOOLBOX, ovverosia librerie per applicazioni speci-fiche (statistica, reti neurali, ottimizzazione, analisi di immagini, controllo e identificazionedi sistemi, logica fuzzy, equazioni alle derivate parziali, matematica finanziaria...). Inoltre per

2 Una visita al sito http://www.mathworks.com è d’obbligo.

Page 4: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

4 Partenza

agevolare la modellizzazione e la simulazione di sistemi complessi è stato costruitoSIMULINKche permette una “programmazione grafica”.

In breve possiamo dire che MATLAB si compone di cinque parti principali

• il linguaggio MATLAB (con la relativa gestione delle principali strutture diprogrammazione);

• la gestione dell’ambiente di lavoro MATLAB (The MATLAB Working Environment);

• la gestione dell’ambiente grafico (Handle Graphics);

• libreria di funzioni matematiche (Mathematical Functions Library);

• libreria per permettere di far interagire programmi scritti in C o FORTRAN conMATLAB ( API, Application Program Interface).

In Tabella 1.1 si riportano ledirectorycorrispondenti alle varie parti del sistema MATLAB.Tale struttura è indipendente dal tipo di computer che si sta utilizzando e dalla versione MAT-LAB (basta che sia successiva alla versione 4). In particolare le directory riportate in Tabella1.1 sono contenute nella directory/toolbox/matlab a sua volta contenuta nella directory prin-cipale di MATLAB (la cui posizione all’interno delfile systemdipende dal sistema operativoutilizzato).

Riassumendo, MATLAB è nato come calcolatrice per matrici e questa parte è divenu-ta il nucleo centrale attorno a cui è stato costruito il software attuale. Diverse specificheapplicazioni sono state affrontate partendo da questo blocco principale, usufruendo quindidi implementazioni affidabili ed allo stato dell’arte di molti algoritmi di base dell’analisinumerica.

Lo sviluppo di applicazioni nell’ambito del calcolo scientifico richiede solitamente uncerto numero di iterazioni tra determinazione del modello matematico opportuno, scritturadegli algoritmi, implementazione degli stessi, valutazione e test. Questo vuol dire che quasisempre non è mai “buona la prima” perché la costruzione di un prototipo potrebbe far ripen-sare il modello o il metodo utilizzato per la simulazione, oppure l’implementazione potrebbeessere rivista o l’algoritmo rifatto. Varie necessità e difficoltà vanno affrontate in un percorsodel tipo trial and error. MATLAB permette di accelerare questo procedimento riducendoi tempi di codifica e di verifica degli algoritmi. Molti metodi numerici sono già efficace-mente implementati in MATLAB e per l’utente è semplice usufruirne per costruire algoritmianche complessi ma potendosi concentrare sui fatti più essenziali. Un esempio elementare:per sommare due matrici ci si può disinteressare di cicli, gestione della memoria, controllodell’input o altro. Basta avere memorizzato le due matrici, che indicheremo conA e B, esommarle tramite l’istruzioneC=A+B. Anche per la visualizzazione e l’analisi dei dati (aspettidi una certa rilevanza nel calcolo scientifico) semplici comandi comeplot possono produrrequanto serve.

Page 5: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.2 Chi è Matlab? 5

Nome Contenuto

Linguaggio MATLAB

ops Operatori e caratteri specialilang Costrutti linguaggio di Programmazionestrfun Stringhe di caratteriiofun input/output da Filetimefun Tempo e datadatatypes Tipi di dato e strutture

Ambiente di lavoro MATLAB

general Comandi di carattere generale

Grafica e Visualizzazione

graph2d Grafica bidimensionale 2Dgraph3d Grafica tridimensionale 3Dspecgraph Grafici specializzatigraphics Handle Graphicsuitools Tool di interfaccia grafica

Funzioni Matematiche

elmat Matrici elementari e manipolazione di matricielfun Funzioni matematiche elementarispecfun Funzioni speciali e altre funzioni matematichedatafun Analisi di dati e trasformata discreta di Fourierpolyfun Interpolazione e manipolazione di polinomifunfun Ottimizzazione, zeri di funzioni, integrazione, equazioni differenzialimatfun Algebra lineare numericasparfun Matrici sparse

Tabella 1.1.Struttura delle directory di MATLAB

Il concetto di algoritmo non è ristretto al solo ambito numerico. Per questo è ormaicompreso nella versioneProfessional Editiondi MATLAB, e in parte nella versione studenti,un Toolbox di calcolo simbolico:Symbolic Math Toolbox. Accenneremo più avanti nel testoad alcune possibilià di manipolazione simbolica in MATLAB.

Page 6: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

6 Partenza

1.3 Semplici operazioni in MATLAB

La modalità più semplice per utilizzare MATLAB consiste nel considerarlo come una calcola-trice scientifica. Un aspetto importante di MATLAB consiste nella possibilità di un approcciodi tipo vettoriale a molti problemi. Nel paragrafo precedente il calcolo della funzione cosenoin alcuni puntix(k) non è stato eseguito componente per componente ma “tutto in una volta”;lo stesso discorso vale nel caso della somma di matrici. Abbiamo quindi introdotto da subitoquesto aspetto che è alla base di una programmazione MATLAB più efficiente e sul qualetorneremo successivamente.

MATLAB può essere utilizzato in modo diretto per calcolare semplici espressionimatematiche

>> 7 - 2 + 4ans =

9>> 1/sqrt(37)ans =

0.1644

La funzionesqrt è una funzione matematica elementare di MATLAB che calcola la ra-dice quadrata del suo argomento. La risposta è del tipoans=..., doveans è una variabile ge-nerata automaticamente da MATLAB quando un’espressione non è assegnata a una variabiledefinita dall’utente. In questo secondo caso dobbiamo specificare il nome di una variabileil cui valore sarà uguale all’espressione calcolata. Le variabili definite dall’utente possonoessere utilizzate in altre espressioni matematiche

>> c = 7 - 2 + 4c =

9>> b = 5b =

5>> a = b + ca =

14

Nei precedenti semplici esempi abbiamo sempre visualizzato il risultato. Per evitarequesto basta concludere l’operazione, istruzione o espressione con un punto e virgola;.

Quindi con

>> c = 7 - 2 + 4;>> b = 5;>> a = b + c;

si eseguono le stesse operazioni di prima definendo e assegnandoa = 14, b = 5 e c = 9 masenza visualizzazione dei risultati. Per visualizzare il contenuto di una variabile è sufficientescriverne il nome, mentre per visualizzare il contenuto di più variabili i nomi vanno separaticon una virgola,

Page 7: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 7

>> a,b,ca =

14b =

5c =

9

Più espressioni o più istruzioni MATLAB possono convivere sulla stessa riga, basta chesiano separate da un punto e virgola (se vogliamo sopprimere la visualizzazione di qualcherisultato) oppure da una virgola (se vogliamo visualizzare il risultato). Per esempio

>> a=3+4/7, b=a+10; c=a*ba =

3.5714c =

48.4694

Dagli esempi precedenti appare chiaro che le variabili non devono essere dichiarate primadel loro utilizzo, come avviene per esempio nel linguaggio C, ma sono create automatica-mente da MATLAB. Se una variabile non esiste è creata non appena compare nel termine disinistra di una uguaglianza (intesa come assegnamento, il valore del termine di destra vieneassegnato al termine di sinistra). Nel caso di vettori o matrici, soprattutto se di grandi dimen-sioni, come vedremo è preferibile dichiararli prima dell’uso, si migliorano così le prestazionidel proprio codice MATLAB.

I nomi delle variabili3 possono essere lunghi un massimo di31 caratteri con la distinzionetra lettere maiuscole e minuscole, ad esempio le variabilia e A sono distinte. La prima letteradi una variabile deve essere un carattere alfabetico (a-z, A-Z), mentre dalla seconda lettera inavanti possiamo utilizzare un qualsiasi carattere alfanumerico incluso il simbolounderscore“_”.

Alcune variabili sono predefinite in MATLAB per la memorizzazione di valori speciali.Parte di queste variabili sono riportate in Tabella 1.24. Nonostante sia ammesso assegnarevalori diversi a queste variabili, in generale è buona regola evitare di farlo, fatta eccezione perle variabili i e j spesso usate come indici interi in cicli e iterazioni. Il significato delle va-riabili eps, realmax, realmin, Inf e NaN è strettamente legato all’aritmetica e all’insiemedei numeri macchina utilizzato.

Osservazione 1.1Fino alla versione5 di MATLAB (release R11) era disponibile anche lavariabile flops che poteva essere utilizzata per contare il numero di operazioni in virgolamobile eseguite. Dalla versione6 tale variabile non esiste più.

I principali operatori disponibili in MATLAB sono indicati in Tabella 1.3. Vi sono gliusuali operatori aritmetici e altri operatori preceduti da un punto, vedremo in seguito ilsignificato delle operazioni corrispondenti. Consideriamo adesso la semplice espressione

3 Ci possono essere alcune differenze a seconda della versione MATLAB utilizzata, qui ci riferiremo alla versione5.3 (R11.1) che è attualmente una delle più diffuse.

4 In realtà va precisato che alcune di queste variabili sono vere e proprie funzioni MATLAB (ad esempiocomputere version).

Page 8: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

8 Partenza

Variabile Significato

ans valore ultima operazione eseguita e non assegnata a una variabilei,j unità immaginaria,

√−1

pi approssimazione diπ, 3.14159265...eps precisione macchinarealmax massimo numero macchina positivo rappresentabilerealmin minimo numero macchina positivo rappresentabileInf ∞, ossia un numero maggiore direalmaxNaN Not a Number, tipicamente il risultato di un’espressione0/0computer tipo di computerversion versione di MATLAB

Tabella 1.2.Alcune variabili predefinite in MATLAB

Operatore Significato

+ addizione- sottrazione* moltiplicazione/ divisioneˆ elevamento a potenza.* moltiplicazione termine a termine per vettori./ divisione termine a termine per vettori.ˆ elevamento a potenza termine a termine per vettori

Tabella 1.3.Principali operatori aritmetici in MATLAB

>> 1+3/4*5ans =

4.7500

Come è stato ottenuto il risultato? Un esempio semplice ma che richiede la conoscenzadelle priorità che MATLAB adotta nell’eseguire le diverse operazioni. In ordine di prioritàMATLAB valuta

• espressioni contenute tra parentesi;

• elevamenti a potenza (3 + 24 ⇒ 3 + 16 = 19);

• moltiplicazioni e divisioni, valutandole da “sinistra verso destra” (3/4∗5 ⇒ 0.75∗5 =3.75);

• somme e sottrazioni, valutandole da “sinistra verso destra” (4 + 3− 5 ⇒ 7− 5 = 2).

Tornando alla nostra espressione, MATLAB quindi calcola (aggiungiamo le parentesi perevidenziare la priorità)1 + 3/4 ∗ 5 = 1 + (3/4) ∗ 5 = 1 + 3.75 = 4.75.

Page 9: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 9

I numeri reali non sono l’unico tipo di dato numerico ammesso. Un altro tipo di dato utilein varie applicazioni e presente in MATLAB sono i numeri complessi e le operazioni conquesti. Se non si sono ridefinite le variabilii e j un numero complessoz, in forma algebricaz = Re z + iIm z (conRe z, Im z parte reale e parte immaginaria, due valori reali), puòessere scritto in modo simile anche in MATLAB

>> a=5+2i;>> b=3.1+2.7i;>> a+bans =

8.1000 + 4.7000i>> a*bans =

10.1000 +19.7000i

Ricordiamo che l’unità immaginaria, rappresentata dalle variabilii e j, è tale chei2 = j2 = −1. Le formea=5+2i, a=5+2*i, a=5+2j, a=5+2*j sono accettate e sono equi-valenti.Oltre alle operazioni di base, molte delle funzioni comunemente disponibili per una calcola-trice scientifica sono presenti in MATLAB. Abbiamo già incontrato la funzione radice qua-dratasqrt. In generale, una funzione necessita di alcuni parametri in ingresso, elencati traparentesi tonde, e solitamente restituisce un risultato che può essere assegnato a una variabileoppure utilizzato in una espressione aritmetica. Per esempio

>> y=cos(pi/4)+sin(pi/4)y =

1.4142

utilizza le funzioni trigonometriche cosenocos e senosin, con argomentoπ/4, somma talivalori e infine assegna il risultato alla variabiley. Al contrario uncomandoMATLAB èutilizzato con almeno uno spazio tra il nome del comando stesso e il suo argomento, peresempio

>> help sinSIN Sine.

SIN(X) is the sine of the elements of X.

visualizza una descrizione rapida della funzione seno in MATLAB5.Il comandohelp consente di avere una descrizione immediata di qualche componente MAT-LAB (funzioni, comandi, operatori, variabili speciali,...) utilizzando il nome dell’oggetto cheinteressa come argomento. La descrizione è in lingua inglese, in quanto non esistono versio-ni MATLAB in lingua italiana. L’help on lineè facilmente raggiungibile anche dalla finestracomandi di MATLAB (finestra principale) selezionando il menu corrispondente. Usualmentel’ help di MATLAB è disponibile in vari formati, i più frequenti (oltre al formato testo) sonoil formato PDF ed il formato HTML.

5 La distinzione tra funzioni e comandi è puramente formale in quanto molti comandi possono essere usati in formadi funzioni e viceversa quando l’argomento è una stringa opportuna di caratteri. Ad esempio è possibile scriverehelp(’sin’) al posto dihelp sin.

Page 10: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

10 Partenza

Per un aiuto sul comandohelp basta digitarehelp help.Si noti che il risultato dell’espressionecos (π/4) + sin (π/4) è visualizzato utilizzando soloquattro cifre decimali. Questa è l’impostazione di formato standard di MATLAB. È possibilemodificarla tramite il comandoformat. Per esempio

>> format long>> cos(pi/4)+sin(pi/4)ans =

1.41421356237309>> format short

abilita prima il formato a14 cifre decimali (format long), calcola il risultato, poi riatti-va il formato standard a4 cifre decimali (format short). Per altre versioni di formato divisualizzazione è, al solito, consigliabile provare l’aiuto in linea,help format.

Osservazione 1.2È importante evidenziare che la modifica della visualizzazione di un ri-sultato tramiteformat non ha nulla a che vedere con l’effettiva precisione con cui MATLABeffettua il calcolo. In particolare tutte le operazioni MATLAB sono fatte in doppia precisione(nell’ambito dello standard IEEE6 questo vuol dire avere almeno15 cifre decimali significati-ve). Per numeri molto piccoli o molto grandi è comoda la notazione esponenziale scientifica(notazione “e”) in cui si esprime un valore numerico come un numero (maggiore di1 eminore di10 dettomantissa) moltiplicato per una opportuna potenza di10 (dettaesponen-te). Per esempio il numero31415000000 sarà rappresentato come3.1415e+010 che significa3.1415× 1010, mentre il numero0.000001234 come1.2340e-006, ossia1.234× 10−6.

Funzione Significato

sin senocos cosenoasin arcosenoacos arcocosenotan tangenteatan arcotangenteexp esponenzialelog logaritmo naturale, baseelog2 logaritmo in base2log10 logaritmo in base10sqrt radice quadrataabs valore assolutosign funzione segno

Tabella 1.4.Alcune funzioni matematiche predefinite in MATLAB

Alcune funzioni matematiche elementari predefinite in MATLAB, sono riportate in Tabella1.4, per una lista più ampia si provi il comandohelp elfun.

6 Si provi help isieee per sapere se si sta operando con una macchina che adotta lo standard IEEE.

Page 11: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 11

Un altro comando di particolare utilità èlookfor che consente di identificare le funzionirelative a un particolare argomento. Essenzialmente il comando identifica tutte le funzio-ni all’interno della cui descrizione compare l’argomento passato al comandolookfor. Peresempio

>> lookfor exponentialEXP Exponential.

EXPINT Exponential integral function.

EXPM Matrix exponential.

EXPM1 Matrix exponential via Pade approximation.

EXPM2 Matrixexponential via Taylor series.

EXPM3 Matrix exponential via eigenvalues and eigenvectors.

restituisce una lista di funzioni (in maiuscolo) con una breve descrizione delle stesse (il risul-tato chiaramente dipende da quali Toolbox sono stati installati).Prima di passare alla prossima sezione siete invitati a utilizzare i comandi

>> help ans>> help help>> help format>> help lookfor

per avere un sommario di alcune delle caratteristiche di MATLAB viste fino ad ora. Inoltre,per rilassarvi, potreste eseguire lademo di MATLAB, selezionareGames sotto il menuMATLABe provare uno dei giochi proposti, ad esempio il gioco del15 o il classicoMinesweeper.

Esempio 1.1 (Calcolo approssimato della derivata prima in un punto)È noto che la de-rivata prima di una funzione realef : (a, b) → R, con(a, b) ⊆ R, in un puntox0 ∈ R, siottiene come limite (se esiste) del rapporto incrementale

f ′(x0) = limx→x0

f(x)− f(x0)x− x0

ovverosia del limite del rapporto tra la variazione subita dalla funzionef passando dax0 ax rispetto alla distanza dix dax0. Esistono interpretazioni meccaniche (velocità istantanea)e geometriche (retta tangente) di tale nozione, noi ci limiteremo a considerare tale rappor-to incrementale come un modo (il più immediato) per il calcolo numerico approssimato dif ′(x0). Indichiamo conδ = x − x0 la distanza tra i due punti,x0 il valore in cui vogliamostimare numericamente la derivata prima ex il valore che fissiamo per calcolare il rapportoincrementaler(x, δ)

r(x, δ) =f(x0 + δ)− f(x0)

δ.

Consideriamo, per esempio, la funzionef(x) = sin (x) e il puntox0 = 2π, da cuif ′(x0) =cos (2π) = 1 (stiamo prendendo un caso semplice come test del nostro procedimento, illettore dovrebbe abituarsi alla costruzione di semplici test numerici per i propri algoritmi). Ilcalcolo della derivata prima approssimata in MATLAB può essere effettuato come

Page 12: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

12 Partenza

>> x0=2*pi; delta = 0.01;>> x=x0+delta; derivata=(sin(x)-sin(x0))/deltaderivata =

1.0000

Tutto sembra funzionare alla perfezione e il valore didelta non sembra nemmeno troppopiccolo. In realtà un certo errore è stato commesso (ricordiamo che si visualizzano soloalcune cifre significative del risultato perché usualmente è attiva l’opzioneformat short),infatti

>> 1 - derivataans =

1.6667e-005

Spinti dall’entusiasmo rifacciamo l’esperimento condelta = 1.0e-10, ottenendo an-cora1.0000 come risposta e un errore1-derivata = -8.2740e-008. Insistiamo,delta =1.0e-15, questa volta il risultato deterioraderivata = 0.8882 con errore0.1118. Infinecon delta = 1.0e-20 si ottienederivata = 0 e quindi un risultato del tutto inaffidabile.Questo fenomeno è fortemente legato al fatto che stiamo facendo i calcoli aritmetici non connumeri con infinite cifre decimali esatte ma con numeri con un numero prefissato di cifre. Ilfenomeno in gioco si chiamacancellazione. Anche in questo esempio si sente la necessità dipoter memorizzare i vari risultati numerici, eventualmente generare una tabella riassuntiva oun grafico. Inoltre si potrebbe pensare di scrivere unaroutine (sottoprogramma, subroutine,funzione) che possa ricevere in ingresso la funzionef , il punto x0 e sperimentare (o accet-tare anche questo parametro in ingresso) con un o più valori diδ. Vedremo come soddisfarequesta esigenza utilizzando MATLAB come linguaggio di programmazione.Dal punto di vista numerico potrebbe essere anche interessante valutare l’errore che sicommette non solo in modo assoluto,

errore = valore vero− valore approssimato,

ma anche in modo relativo (cioè riferito all’ordine di grandezza della quantità che si staapprossimando),

errorerel = (valore vero− valore approssimato)/(valore vero)

sempre che ilvalore vero non sia nullo.Infine, MATLAB vi potrebbe aiutare con ilCalcolo Simbolicoper il calcolo della derivata diuna funzione, per esempio nel nostro semplice caso

>> s1=sym(’sin(x)’);>> diff(s1)ans =

cos(x)

dove la prima espressione genera una variabile simbolica mentre la seconda esegue laderivata.

Page 13: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 13

Esempio 1.2 (Formula di Taylor) Uno dei metodi più utilizzati per sostituire una funzione“complicata” con una più semplice consiste nell’utilizzare laformula di Taylor tramite laquale si approssima una funzione mediante un polinomio. Siaf : (a, b) → R una funzionereale sufficientemente regolare (in questo contesto significa che deve ammettere un certonumero di derivate successive) exo ∈ (a, b). Dato un intero positivon, il polinomio diTaylorTn(x), di gradon è il seguente

TN (x) = f(x0) + f ′(x0)(x− x0) +f ′′(x0)

2(x− x0)2 + ... +

f (n)

n!(x− x0)n,

dovef (k)(x0) indica la derivatak − esima nel puntox0. La notazionek! indica il fattorialedel numero interok, definito ricorsivamente come0! = 1, k! = k(k− 1)! perk = 1, 2, . . .. Ilfattoriale di un numero può essere calcolato in MATLAB tramite la funzionefactorial chefa parte del gruppo delle “funzioni speciali”specfun. Per esempio

>> factorial(10)ans =

3628800

naturalmente equivale a10*9*8*7*6*5*4*3*2*1. Con ipotesi di regolarità abbiamo

f(x) = Tn(x) + E(f, x, x0, n)

doveE(f, x, x0, n) rappresenta l’errore (differenza) che si commetterebbe sostituendo al po-sto del valore verof(x) il valoreTn(x). Supponiamo di trascurare tale errore e consideriamoTn(x) una “buona” approssimazione dif(x). Ovviamente tutto questo ha un valore forte-mente locale, ci muoviamo nelle vicinanze del puntox0 (in fondo stiamo utilizzando soloinformazioni dellaf relative al puntox0, non è ragionevole aspettarsi buone cose lontanodallo stesso puntox0).Nel caso dif(x) = ex ex0 = 0 si può calcolare

Tn(x) = 1 + x +x2

2!+

x3

3!+ . . . +

xn

n!.

Traduciamo in formule e quindi in MATLAB, scegliendox = 0.1, n = 2

>> x=0.1;>> f= exp(x)f =

1.1052>> T2 = 1 + x + x^2/2T2 =

1.1050>> errore=f-T2errore =

1.7092e-004

si commette quindi un errore sulla quarta cifra decimale. Prendendo il puntox più vicino ax0

Page 14: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

14 Partenza

>> x=0.01;>> f= exp(x);>> T2 = 1 + x + x^2/2;>> errore=f-T2errore =

1.6708e-007

l’errore che commettiamo è solo sulla settima cifra decimale. Provate a fare altri esperimen-ti7, cambiando anche la funzionef(x), il puntox0 e, naturalmente il polinomioTn(x).Certamente nasce l’esigenza di organizzare le semplici istruzioni in modo opportuno, gene-rando magari una tabella della sperimentazione numerica effettuata. Nel seguito si parleràdel modo di fare questo in MATLAB.

1.3.1 Vettori e matrici

La struttura dati principale di MATLAB è l’array ovverosia una tabella multidimensionale.Vi sono poi sei tipi fondamentali di dati che possono comporre unarray: char, double,sparse, uint8, cell, struct.

L’utente MATLAB potrebbe definire un diverso tipo di dati, potrebbe creare unUserObject. Esempi dei vari tipi di dati sono riportati in Tabella 1.5.

Negli esempi del paragrafo precedente le variabili utilizzate apparentemente erano quanti-tà scalari, ossia contenevano un solo valore numerico. In realtà ogni variabile è per MATLABuna struttura di tipoarray. Più precisamente un array è un insieme di valori ordinati, secondouno o più indici, cui ci si riferisce con un singolo nome di variabile. Dalla versione5 diMATLAB, e successive, è possibile utilizzare array con più di due indici. Un array a un indi-ce è detto vettore, e un array a due indici è chiamato matrice. Matrici e vettori in MATLABrispettano le regole dell’algebra lineare8.

Esempio 1.3 (Array a uno e due indici) La sequenza di numeri interi{1, 3, 5, 7, 9, 11, 13,15} può essere rappresentata in forma di arrayx a un solo indice in due modi differenti

x︷ ︸︸ ︷1 3 5 7 9 11 13 15 x

13579111315

L’array di sinistra è dettovettore riga, quello di destravettore colonna, entrambi i vettorihanno lunghezza otto (hanno otto elementi). Tramite l’uso degli indici, la cui numerazionenel nostro esempio va da 1 a 8 e da sinistra a destra nel vettore riga e dall’alto verso il bassonel vettore colonna, possiamo accedere a un dato valore all’interno dell’array.

7 Si noti che non occorre riscrivere tutte le espressioni ma basta richiamarle utilizzando i tasti cursore con la frecciain su↑ e in giù↓ della tastiera.

8 Assumiamo che il lettore abbia un minimo di familiarità con le operazioni tra matrici e vettori dell’algebra lineare.

Page 15: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 15

Classe Esempi Nota

char ’Hello World’ Tabelle di caratteri (ogni carattere oc-cupa 16 bit), nel caso unidimensionalela sequenza di caratteri si chiama anchestringa

double [1 2 3 4] 2+3i 3.14 Tabelle di numeri reali o complessi indoppia precisione

sparse speye(7) sprand(100) Tabelle bidimensionali sparse di numeri indoppia precisione, sparso significa che visono pochi elementi diversi da zero men-tre la maggior parte degli elementi è zero.La sparsità solitamente è associata a pro-blemi di grandi dimensioni nei quali unaopportuna struttura dati è indispensabile.

cell {5 ’matrice random’rand(7)}

Tabella dicell, ogni elemento può conte-nere altre tabelle in modo da ottenere unacollezione di dati di diversa grandezza etipo

struct libroe =struct(’titolo’,’MATLAB’, ’autori’, ’G.Naldi, L.Pareschi’,’anno’, 2001)libroe.anno=2001

Tabelle di strutture (simili a quelle del lin-guaggio C), ogni struttura è composta davari campi che è possibile utilizzare tramiteil carattere “.”

uint8 uint8(magic(5)) Tabelle di interiunsigneda 8 bit. Un in-tero di questo tipo può assumere i valorida0 a 255 e occupa un ottavo di spazio dimemoria rispetto ai valori in doppia preci-sione. Dati di questo tipo solitamente so-no utilizzati nell’ambito dell’analisi delleimmagini

UserObject inline(’cos(x)’) Tipo dato definito dall’utente.

Tabella 1.5.Tipi di dati in MATLAB

Ad esempio ax(3) corrisponderà il valore5, così come ax(5) il valore 9.La stessa sequenza di numeri può anche essere memorizzata come arrayA a due indici, cioèuna matrice

Page 16: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

16 Partenza

A︷ ︸︸ ︷1 3 5 79 11 13 15

A︷ ︸︸ ︷1 93 115 137 15

La matrice di sinistra è detta di tipo2 × 4, dove il primo valore,2, indica il numero dirighe mentre3 indica il numero di colonne. Conseguentemente quella di destra è detta ditipo 4 × 2. Il numero di righe per il numero di colonne fornisce il numero di elementi dellamatrice, ossia8. In questo caso avremo bisogno di due indici per individuare ogni singoloelemento della matrice, il primo indice riferito alle righe della matrice, il secondo riferito allecolonne. Entrambi iniziano da uno, la numerazione del primo indice (righe) va dall’alto albasso e quella del secondo indice (colonne) da sinistra a destra. Per la matrice di sinistra aA(1,3) corrisponde il valore5, a A(2,4) il valore 15. Per la matrice di destraA(2,1) cor-risponde3 e l’elementoA(3,2) vale13. Osserviamo che stiamo utilizzando le matrici solocome raccolta di valori senza alcun riferimento a significati algebrici o geometrici. Infine sot-tolineiamo che, anche se i dati sono di tipo intero la loro memorizzazione (se non si intervienealtrimenti) viene fatta da MATLAB utilizzando la codifica dei numeri in doppia precisione:non lasciatevi ingannare dalle apparenze.

I vettori possono essere considerati casi particolari di matrici. Per esempio i vettorix del-l’esempio appena fatto nella forma riga o colonna sono, rispettivamente, una matrice di tipo1 × 8 (una riga e otto colonne) o8 × 1 (otto righe e una colonna). Questo è esattamente ilmodo in cui MATLAB definisce i vettori. Non solo, per MATLAB anche le quantità scalarisono semplici matrici di tipo1 × 1. Ricordatevi, tutto è array (con dati di tipo diverso comecomponenti) in MATLAB.Per memorizzare il precedente vettorex nella forma riga in MATLAB possiamo utilizzare laseguente espressione

>> x = [1 3 5 7 9 11 13 15]x =

1 3 5 7 9 11 13 15

analoga a quella utilizzata all’inizio di questo capitolo. Le parentesi quadre delimitano glielementi del vettore, mentre gli spazi bianchi (uno o più) le singole componenti del vettoreriga. Il vettore colonna può invece essere ottenuto come segue

>> x = [1;3;5;7;9;11;13;15]x =

13579

111315

Page 17: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 17

Le componenti in questo caso sono delimitate da un punto e virgola che serve per indicarela fine della riga. Per visualizzare il valore di una componente del vettore (riga o colonna)basta scrivere il nome del vettore e indicare l’indice tra parentesi tonde

>> x(4)ans =

7

Se cambiamo il valore di una componente del vettore dobbiamo ricordarci di usare il pun-to e virgola, altrimenti MATLAB visualizzerà l’intero vettore e la cosa può risultare noiosanel caso di vettori molto lunghi

>> x(2)=1x =

11579

111315

Per passare da vettori riga a vettori colonna si utilizza il simbolo di apostrofo, per esempio

>> x = [1 3 5 7 9 11 13 15]’x =

13579

111315

Dal punto di vista dell’algebra lineare l’operazione che si effettua è esattamente latrasposizione, solitamente indicata conxT .

La funzionelength in MATLAB consente di determinare la lunghezza di un vettore9

>> length(x)ans =

8

Se ora vogliamo inserire la matrice2×4 vista nell’esempio precedente, possiamo scrivere

>> A = [1 3 5 7 ; 9 11 13 15]A =

1 3 5 79 11 13 15

9 In generale se applicata a matrici fornisce la dimensione massima tra righe e colonne.

Page 18: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

18 Partenza

Anche in questo caso gli spazi separano gli elementi per colonna e il punto e virgolasepara le righe. La stessa matrice può anche essere inserita utilizzando il tastoInvio perseparare le righe

>> A = [1 3 5 79 11 13 15]A =

1 3 5 79 11 13 15

Potremo accedere agli elementi della matrice in maniera naturale utilizzando icorrispondenti indici

>> A=(1,3)ans=

5

Se vogliamo quindi cambiare l’elementoA(1,3) basta scrivere (attenzione, senza puntoe virgola viene visualizzata l’intera matrice)

>> A=(1,3)=4A =

1 3 4 79 11 13 15

La funzione MATLAB che ci consente di determinare le dimensioni di una matrice èsize(che ritorna un vettore riga con due elementi: il numero di righe e il numero di colonne),

>> size(A)ans =

2 4

Possiamo utilizzare la funzionesize per avere conferma del modo in cui MATLABconsidera quantità scalari e vettori

>> a=5;>> size(a)ans =

1 1>> b=1+3i;>> size(b)ans =

1 1>> x=[1 3 5 7 9 11 13 15];>> size(x)ans =

1 8>> size(x’)ans =

8 1

Page 19: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 19

Può forse meravigliare che il numero complesso memorizzato inb sia del tipo1 × 1,ma si ricordi che di fatto è una tabella con un solo elemento (di tipo complesso) e non unatabella con due reali (parte immaginaria e parte reale del numero complesso in questione).Se vogliamo controllare le variabili che attualmente MATLAB ha memorizzato nell’area dilavoro,Workspace, possiamo usare i comandiwho e whos. Il primo comando,who, elenca inomi delle variabili attualmente presenti mentrewhos aggiunge informazioni riguardanti iltipo di variabile e l’occupazione di memoria

>> whoYour variables are:

A a b x

>> whosName Size Bytes Class

A 2x4 64 double arraya 1x1 8 double arrayb 1x1 16 double array (complex)x 1x8 64 double array

Grand total is 18 elements using 152 bytes

Come si può notare una variabile reale, per esempioa, occupa8 byte di memoria, mentreuna variabile complessa, comeb, occupa16 byte. Conseguentementex e A, entrambi costi-tuiti da8 elementi non complessi, occupano8× 8 = 64 byte. Per rimuovere le variabili dallamemoria lavoro di MATLAB si utilizza l’istruzioneclear

>> clear a x>> whos

Name Size Bytes Class

A 2x4 64 double arrayb 1x1 16 double array (complex)

Grand total is 9 elements using 80 bytes

Si noti che i nomi delle variabili da eliminare sono separati dal carattere spazio.

%>> clear a ; x%x =% 1 3 5 7 9 11 13 15%

Il lettore provihelp clear per avere una descrizione approfondita dell’uso del comandoper rimuovere singole variabili e funzioni.

1.3.2 La notazione due punti

Naturalmente in MATLAB non si è costretti a definire matrici o vettori elencandone tuttigli elementi, altrimenti il software sarebbe poco più che una calcolatrice scientifica. Per

Page 20: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

20 Partenza

la costruzione di vettori e matrici MATLAB ha diverse funzioni predefinite e operatori; unoperatore di fondamentale importanza per costruire vettori equispaziati e per operare coninsiemi di indici è la notazione due punti. La sintassi di base di tale notazione è la seguente

Vettore=Inizio:Passo:Fine,

doveVettoreè il vettore (riga) generato,Inizio e Fine indicano il valore iniziale e finale delvettore ePassoè un parametro opzionale che indica l’incremento relativo o la spaziatura tragli elementi (se omessoPasso=1). Il vettorex utilizzato nel paragrafo precedente,x = [1 35 7 9 11 13 15], potrebbe per esempio essere generato come

>> x = 1:2:15;

Altri esempi sono dati da

>> y=1:9y =

1 2 3 4 5 6 7 8 9>> z=10:-2:2z =

10 8 6 4 2

Per costruire vettori colonna basterà racchiudere l’espressione tra parentesi tonde eutilizzare l’operatore apostrofo

>> x=(1:5)’x =

12345

Se il valore iniziale è maggiore di quello finale e il passo è positivo viene creato un vettorenullo

>> x=7:1x =

[]

Si noti che il vettore nullo (tabella vuota) si denota in MATLAB con[]. Il medesimorisultato (vettore nullo) si ha chiaramente anche se il valore iniziale è minore di quello finalee l’incremento è negativo. Il vettore nullo ha lunghezza zero, dimensione0×0. La notazionedue punti, “funziona” anche con valori non interi, ad esempio

>> x=0:0.2:1x =

0 0.2000 0.4000 0.6000 0.8000 1.0000

Nel caso in cui il passo non sia intero può risultare difficile l’uso dell’operatore due punti,per esempio se vogliamo creare un vettore con un numero prefissato di punti equispaziatiall’interno di un dato intervallo. In questo caso è preferibile utilizzare il comandolinspacela cui sintassi è

Page 21: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 21

linspace(Inizio, Fine, Numero di Punti)

dove il parametroNumero di Puntiè opzionale e, se omesso, viene preso uguale a100. Le dueistruzionix=linspace(a,b) e x=linspace(a,b,100) sono quindi equivalenti. Per esempio

>> a = 0; b=1; n=8;>> x = linspace(a,b,n)x =

Columns 1 through 70 0.1429 0.2857 0.4286 0.5714 0.7143 0.8571

Column 81.0000

restituisce un vettore rigax di lunghezzan con la proprietà che l’elemento di indicei vale

x(i) = a + (i− 1)(b− a)(n− 1)

.

Si noti che MATLAB visualizza le matrici (vettori) colonna per colonna quando non riesce avisualizzare tutti gli elementi sulla stessa riga. Anche in questo caso vettori colonna possonoessere costruiti tramite l’operatore apostrofo di trasposizione

>> a = 0; b=1; n=8;>> x = linspace(a,b,n)’;>> x =

00.14290.28570.42860.57140.71430.85711.0000

È anche possibile adottare una spaziatura logaritmica dei valori utilizzando la funzionelogspace(a,b,n) che genera i punti

10a+(i−1)(b−a)/(n−1), i = 1, 2, ..., n.

Per esempiox=logspace(-2,3,6) genera il vettorex=[0.01 0.1 1 10 10 1000], il lettoreche provi il comando stia attento a come MATLAB visualizza il risultato perché se in unamatrice l’elemento più grande in modulo è maggiore di103 o l’elemento più piccolo in mo-dulo è minore di10−3 viene scelto un fattore di scala (che deve essere applicato a tutti glielementi della matrice stessa) per la generazione dell’output.Un uso particolarmente efficace della notazione due punti si ha nella gestione di indici di vet-tori e matrici. In particolare tale notazione consente di identificare facilmente un’intera rigao colonna di una matrice e quindi identificare facilmente sottotabelle. Per esempio utilizzarei due punti “:” singolarmente significa selezionare ogni elemento di una data riga o colonna

Page 22: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

22 Partenza

>> A = [1 2 3; 4 5 6; 7 8 9];>> A(:,1)ans =

147

>> A(3,:)ans =

7 8 9

Naturalmente è possibile specificare un intervallo di indici ed estrarre così parti di vettori(o matrici)

>> x=0:0.2:1.0;>> x(2:5)ans =

0.2000 0.4000 0.6000 0.8000>> A = [1 2 3 ; 4 5 6 ; 7 8 9];>> A(:,1:2)ans =

1 24 57 8

o parti di righe e colonne in matrici e sottomatrici

>> A = [1 2 3; 4 5 6; 7 8 9];>> A(3,1:2)ans =

7 8>> A(2:3,1:2)ans =

4 57 8

La notazione due punti può essere usata anche per assegnare in modo rapido nuovi valoria righe e colonne di matrici

>> A = [1 2 3; 4 5 6; 7 8 9];>> A(2,:)=2:2:6A =

1 2 32 4 67 8 9

Un operazione che può risultare utile è quella di cancellare alcuni elementi in una matriceo in un vettore cambiandone, allo stesso tempo, la dimensione

>> x = 1:10;>> x(2:5)=[]x =

1 6 7 8 9 10>> A = [1 2 3; 4 5 6; 7 8 9];

Page 23: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 23

>> A(1,:)=[]A =

4 5 67 8 9

Concludiamo questo paragrafo osservando è possibile convertire dati memorizzati in uncerto tipo di array in un array di tipo differente, ma con lo stesso numero di elementi. Èpossibile in sostanza ridimensionare una tabella di valori, utilizzando la funzionereshape

>> A = 1:12;>> B = reshape(A,2,6)B =

1 3 5 7 9 112 4 6 8 10 12

Si noti che il riempimento della nuova matrice viene fatto colonna per colonna (questa èuna caratteristica comune di MATLAB: essere “orientato” alle colonne per le varie funzionioperanti con matrici). La sintassi del comandoreshape è quindi

reshape(Matrice, Righe, Colonne)

dove il parametriRighee Colonnesi riferiscono alla nuova matrice prodotta come risultato.Esiste una forma molto compatta per convertire matrici in un unico vettore colonna

>> A = [1 2 3; 4 5 6; 7 8 9];>> x = A(:)x =

147258369

Chiaramente qualora si abbia la necessità di trasformare una matrice in un unico vettoreriga basterà considerare il trasposto della precedente espressione. Si noti che, se applicata adun vettorex, l’espressionex(:) restituisce sempre un vettore colonna, indipendentemente daltipo originale del vettore, a differenza dell’operatore di trasposizionex’ che invece cambiavettori colonna in vettori riga e viceversa. Questo risulta di notevole utilità pratica in diversecircostanze: per esempio facilita la scrittura di funzioni MATLAB che utilizzino vettori per-ché indipendentemente dalla forma dei vettori in ingresso ci si può sempre ricondurre ai solivettori colonna o riga.

1.3.3 Andar per matrici

Esistono molte funzioni MATLAB che consentono di costruire particolari matrici e vettori,alcune di queste sono riportate per convenienza in Tabella 1.6; si invita il lettore a consultarel’help per una descrizione dettagliata di tali funzioni.

Page 24: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

24 Partenza

Funzione Azione

linspace vettore riga di elementi equispaziatilogspace vettore riga di elementi equispaziati in scala logaritmicazeros matrice contenente solo elementi uguali a zeroones matrice contenente solo elementi uguali a unorand matrice contenente numeri pseudo-casuali in[0, 1]eye matrice identitàdiag matrice diagonalemagic matrice a valori interi con somme uguali per righe e colonnepascal matrice costruita con il triangolo di Pascalhilb matrice di Hilbert,H(i,j)=1/(i+j-1)hadamard matrice di Hadamard con elementi+1 e−1, H’*H = N*eye(N)toeplitz matrice di Toeplitz (le diagonali hanno elementi uguali)vander matrice di Vandermondehankel matrice di Hankel

Tabella 1.6.Alcune funzioni predefinite per la costruzione di particolari matrici in MATLAB

Le funzioni MATLAB possono essere utilizzate con un diverso numero di parametri (ab-biamo già visto questa caratteristica parlando della funzionelinspace). A seconda di cosapresentiamo alla funzione possiamo aspettarci azioni differenti. Per esempiozeros può esse-re utilizzata per generare matrici nulle (utili soprattutto quando si vuole inizializzare qualchevariabile) in due forme:zeros(n,m) genera una matricen×m con soli elementi nulli, mentrezeros(n) genera una matrice nullan × n (matrici con numero di righe uguale al numero dicolonne si chiamanomatrici quadrate). Ad esempio

>> B=zeros(2,3)B =

0 0 00 0 0

>> Z = zeros(2)Z =

0 00 0

Analogamente per altre funzioni qualiones, rand, eye. Proviamo un’altra funzione

>> P=pascal(4)P =

1 1 1 11 2 3 41 3 6 101 4 10 20

Page 25: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 25

che restituisce gli elementi del triangolo di Pascal (e Tartaglia)

11 1

1 2 11 3 3 1

1 4 6 4 1. . . . . . . . .

che appare in vari problemi di analisi combinatoria, per esempio nello sviluppo del binomio(a+ b)n. Ogni elemento è ottenuto sommando i due elementi adiacenti nella riga precedente.Si noti che la matriceP ottenuta non cambia se si scambiano gli indici di riga con gli indicidi colonna,P (i, j) → P (j, i): matrici reali di questo tipo si diconomatrici simmetriche(ovviamente il lettore può verificare confrontandoP conP’). Attenzione, nel caso la matriceabbia elementi complessi la trasposizione non si limita a scambiare righe con colonne, maapplica l’operazione di coniugazione a ogni componente

>> A=[1+3i 2+5i ; 6+7i 1-4i]A =

1.0000 + 3.0000i 2.0000 + 5.0000i6.0000 + 7.0000i 1.0000 - 4.0000i

>> A’ans =

1.0000 - 3.0000i 6.0000 - 7.0000i2.0000 - 5.0000i 1.0000 + 4.0000i

Quindi, nel caso complesso,A=A’ significa scambiare righe con colonne e passare alcomplesso coniugato (cambio di segno nella parte immaginaria).La funzioneeye genera invece la matrice identità ovverosia una matrice con elementi sulladiagonale principale (cioè gli elementi con indice di riga uguale all’indice di colonna) ugualiad1

>> I3 = eye(3)I3 =

1 0 00 1 00 0 1

>> I32 = eye(3,2)I32 =

1 00 10 0

Ancora: esiste la possibilità di utilizzare la funzione MATLAB con un diverso numero diparametri in ingresso.Abbiamo naturalmente evitato gli aspetti formali di definizione delle funzioni MATLAB (ciritorneremo in seguito parlando della programmazione in MATLAB), ma crediamo sia abba-stanza intuitivo l’uso delle funzioni proposte come “scatole nere” in cui entra qualche dato ene escono altri.

Page 26: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

26 Partenza

1.3.4 Operazioni vettoriali e operazioni puntuali

La maggior parte delle funzioni predefinite in MATLAB accettano come argomenti arraya più indici. Questa caratteristica di MATLAB è molto importante in quanto consente discrivere in forma molto chiara e compatta parte di codice. Per esempio si evitano sequenzedi istruzioni organizzate in cicli che agiscono a livello scalare.

Esempio 1.4 (Tabella di valori di seno e coseno)Abbiamo già visto nel paragrafo di apertu-ra di questo capitolo un tentativo di generazione di una tabella di valori per la funzione cosenoe il relativo grafico. Basandoci sulle funzioni MATLAB precedentemente descritte possiamocostruire una semplice tabella di valori delle funzioni seno e coseno in punti appartenentiall’intervallo [0, π]. Ad esempio

>> n = 7;>> x = linspace(0,pi,n);>> c = cos(x);>> s = sin(x);>> [x’ c’ s’]ans =

0 1.0000 00.5236 0.8660 0.50001.0472 0.5000 0.86601.5708 0.0000 1.00002.0944 -0.5000 0.86602.6180 -0.8660 0.50003.1416 -1.0000 0.0000

L’istruzione c=cos(x) applicata a un vettorex restituisce un vettorec di uguali dimen-sioni e tipo (valori reali in doppia precisione) con la proprietà che l’elemento di indicei valec(i) = cos(x(i)). Tale istruzione risulta quindi equivalente ac = [cos(x(1)) cos(x(2))cos(x(3)) cos(x(4)) cos(x(5)) cos(x(6)) cos(x(7))]. Analogo discorso per l’istru-zione vettoriales=sin(x). Più “delicata” l’istruzione[x’ c’ s’] che crea una matrice le cuicolonne sono i vettori traspostix’, c’ e s’. Scrivendo invece[x c s] si ottiene un unicovettore riga in cui prima compaiono gli elementi del vettorex, poi quelli del vettorec e diseguito quelli del vettores. Naturalmente nel caso di vettore riga i tre vettori componentipossono non avere la stessa lunghezza, mentre se costruiamo una matrice per colonne, comefatto nell’esempio, i tre vettori devono avere la stessa lunghezza, in caso contrario vi sarà unasegnalazione di errore. A titolo esemplificativo

>> [x’ c’ s(1:5)’]??? All matrices on a row in the bracketed expression must have the

same number of rows.>> [x(1:2) c(1:3) s(1)]ans =

0 0.5236 1.0000 0.8660 0.5000 0

Si raccomanda attenzione ai programmatori C perché gli indici in MATLAB vanno traparentesi tonde e non quadre, come in C, e inoltre gli indici iniziano dal valore1 e non da0.Alcuni errori possono essere difficili da scovare perché non producono una segnalazione dierrore, per esempio datoa=[2 1], scriverec=[3 a[2]] intendendo aggiungere al valore3 la

Page 27: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 27

seconda componente del vettorea non genera un errore ma il vettorec = [3 2 1 2] perchéequivale ac=[3 a [2]] con [2] ovviamente matrice1 × 1. Utilizzare l’indice zero invececonduce a un errore

>> a(0)??? Index into matrix is negative or zero. See release notes onchanges to logical indices.

Oltre alla maggiore “pulizia” nei codici MATLAB, uno dei vantaggi principali dell’uso difunzioni vettoriali si ha in termini di velocità di esecuzione delle operazioni rispetto alla cor-rispondente esecuzione in forma scalare. Una delle regole principali è quindi:evitare i ciclie usare la notazione vettoriale. È essenziale quindi abituarsi fin dal principio all’uso vetto-riale di MATLAB. Consideriamo alcune operazioni che coinvolgono array a più indici e cheagiscono simultaneamente su tutte le componenti dell’array stesso (si veda Tabella 1.3). Inaltre parole, vogliamo eseguire la stessa operazione (per esempio moltiplicazione per il fatto-re4) in modo identico a tutte le componenti di una certa matrice (o array multidimensionale).Alcune di queste operazioni non hanno un corrispondente nell’ambito dell’algebra linearema risultano estremamente efficaci nella programmazione MATLAB. Vediamo subito degliesempi, il lettore cerchi di comprendere il “funzionamento” delle varie espressioni.

>> x = [1 3 5 7 9];>> y = [50 40 20 30 10];>> 4*xans =

4 12 20 28 36>> x+yans =

51 43 25 37 19>> y-xans =

49 37 15 23 1>> x.*yans =

50 120 100 210 90>> y./xans =

50.0000 13.3333 4.0000 4.2857 1.1111>> x.^2ans =

1 9 25 49 81

Le prime tre operazioni appartengono all’algebra lineare e sono la moltiplicazione di unvettore per uno scalare, la somma e la differenza tra vettori. Analizziamo meglio tali istru-zioni: l’espressione4*x moltiplica ogni componente del vettorex per la quantità scalare4;il vettore risultato ha esattamente la stessa lunghezza del vettorex; l’espressionex+y sommale rispettive componenti dei vettorix e y e può essere utilizzato solo su vettori che hanno lastessa dimensione. Non solo la medesima lunghezza ma anche numero di righe e numerocolonne, infatti l’espressione

Page 28: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

28 Partenza

>> x+y’??? Error using ==> +Matrix dimensions must agree

genera una segnalazione di errore. Analogamente l’espressioney-x sottrae dal vettoreyle corrispondenti componenti del vettorex. Entrambe le operazioni restituiscono vettoriaventi la stessa dimensione dei vettori coinvolti. In maniera del tutto analoga le precedentioperazioni agiscono su matrici

>> A = [ 1 2 3 ; 4 5 6 ; 7 8 9];>> B = [ 1 1 1 ; 2 2 2 ; 3 3 3];>> C = A+BC =

2 3 46 7 8

10 11 12>> 2*Bans =

2 2 24 4 46 6 6

Al contrario le operazioni puntuali, ossia la moltiplicazione puntuale e la divisione pun-tuale, sono tipiche dell’ambiente MATLAB e possono essere applicate solo a vettori o matriciaventi le stesse dimensioni e restituiscono un vettore o una matrice di uguali dimensioni. Nonhanno necessariamente un corrispondente dal punto di vista dell’algebra lineare in quanto agi-scono su vettori e matrici intesi come strutture di dati più che entità matematiche. L’istruzionex.*y utilizza la moltiplicazione puntuale tra vettori e fornisce un vettore con la proprietà cheogni sua componente è uguale al prodotto delle corrispondenti componenti dei singoli vettorix e y. Allo stesso modo agisce la divisione puntualey./x restituendo un vettore le cui com-ponenti sono il risultato della divisione delle corrispondenti componenti diy per quelle dix(Provate ad assegnare il valore zero a una componente dix per vedere il risultato10). Infinel’espressionex.ˆ2 eleva ogni componente del vettorex al quadrato. Per vettorix, y con lestesse dimensioni è anche possibile l’operazione puntualey.ˆx, ogni componente del vettorey è elevato alla potenza determinata dalla corrispondente componente del vettorex

>> y.^xans =

1.0e+010 *0.0000 0.0000 0.0003 2.1870 0.1000

Attenzione al formato di uscita, infatti la prima componente non è nulla ma vale50.Le stesse operazioni possono essere applicate nel caso di vettori colonna o più in generalenel caso di matrici. È essenziale che gli operandi siano dello stesso tipo e abbiano le stesse

10 Si osserverà che l’esecuzione non si interrompe ma c’è un avvertimentoWarning: Divide by zero.. Sesi è verificata una divisione di un elemento diverso da zero per zero il risultato saràInf, mentre la divisione0/0produceNaN, cioèNot-a-Number.

Page 29: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 29

dimensioni. Le uniche eccezioni a questa regola si verificano quando le precedenti opera-zioni vengono applicate coinvolgendo una matrice e una costante. In tal caso MATLABconsidererà la costante come un vettore di pari dimensioni avente tutte componenti costanti

>> x = 1:7;>> x+2ans =

3 4 5 6 7 8 9>> 2-xans =

1 0 -1 -2 -3 -4 -5>> 2./xans =

2.0000 1.0000 0.6667 0.5000 0.4000 0.3333 0.2857

Esempio 1.5 (Vettorizzare il calcolo di una funzione) Consideriamo ora il problema delcalcolo e della visualizzazione di una tabella di valori di una funzione non predefinita inMATLAB, per esempio la funzione razionale

f(x) =120− 60x + 12x2 − x3

120 + 60x + 12x2 + x3

sull’intervallo [0, 1]. Tale funzione è una particolare approssimazione, detta di Padé, del-la funzionee−x. Per costruire una tabella di 5 valori possiamo utilizzare la sequenza diistruzioni

>> x = linspace(0,1,5);>> y = (120-60*x+12*x.^2-x.^3)./(120+60*x+12*x.^2+x.^3);>> [x’ y’]ans =

0 1.00000.2500 0.77880.5000 0.60650.7500 0.47241.0000 0.3679

Utilizzando le operazioni vettoriali i valori della funzione in corrispondenza della suc-cessione di punti definita dal vettorex sono creati con una singola istruzione vettoriale eassegnati al vettorey. A fine esemplificativo riportiamo parte del programma in C (non siusa la funzionepowdella libreria matematica) che esegue la costruzione dei vettorix e y informa scalare senza visualizzazione

...double x[5], y[5], dx;int i;

dx=1.0/4.0;for (i=0; i<5 ; i++)

{x[i]=i*dx;y[i]=(120.0 +x[i]*(-60.0 + x[i]*(12.0-x[i])))/

(120.0 + x[i]*(60.0 + x[i]*(12.0+x[i])));}

Page 30: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

30 Partenza

Spesso si preferisce rendere più leggibile il codice MATLAB spezzando l’espressione,per esempio

>> num = 120-60*x+12*x.^2-x.^3;>> den = 120+60*x+12*x.^2+x.^3;>> y = num ./ den;

Nel codice C invece abbiamo utilizzato, per la valutazione dei polinomi al numeratoree denominatore l’algoritmo di Horner-Ruffini con successivi raccoglimenti della variabilex(questo algoritmo è più efficiente rispetto a mantenere la forma solita dei polinomi per la lorovalutazione).

Prima di passare alla prossima sezione osserviamo che in MATLAB dalla versione 5 inpoi è possibile utilizzare anche array a tre indici, ossia tabelle in tre dimensioni. A tale riguar-do va detto che in realtà tali array non sono altro che successioni di matrici bidimensionalirispetto al terzo indice. Per cui avremo

>> A=[1 2 3; 4 5 6; 7 8 9];>> B(:,:,2)=AB(:,:,1) =

0 0 00 0 00 0 0

B(:,:,2) =1 2 34 5 67 8 9

In questo caso viene generato automaticamente un array a tre indici formato da una suc-cessione di due matrici3 × 3 di cui la prima ha valori nulli e la seconda è uguale adA. Seinvece scriviamo

>> clear B>> B(:,2,:)=AB(:,:,1) =

0 10 40 7

B(:,:,2) =0 20 50 8

B(:,:,3) =0 30 60 9

automaticamente MATLAB genera una successione di tre matrici3 × 2 dove le colonnedi A vengono memorizzate come ultime colonne delle matrici della successione. Si proviB(2,:,:)=A dopo aver cancellatoB dalla memoria per evitare di ottenere un messaggio dierrore. Come viene memorizzataA?

Page 31: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 31

1.3.5 Cenni di grafica

Uno dei punti di forza di MATLAB è la sua capacità grafica che consente di rappresentaredati memorizzati in vettori e matrici in molti modi differenti. È possibile anche visualizzareimmagini (memorizzate nei formati più comuni) e realizzare filmati visualizzabili tramite ilcomandomovie. Grafici bidimensionali vengono utilizzati per visualizzare la variazione diuna variabile rispetto a un’altra, ad esempio il grafico di una funzioney = f(x).

Esempio 1.6 (Un semplice grafico bidimensionale)Consideriamo un esempio simile aquello trattato in apertura di capitolo: vogliamo visualizzare in forma grafica una successionedi valori della funzionesin(x) sull’intervallo [0, 2π]. Per prima cosa dovremo creare due vet-tori x e y contenenti rispettivamente la successione di valori delle ascisse e i corrispondentivalori della funzione (ordinate). Possiamo per esempio scrivere

>> n = 31;>> x = linspace(0,2*pi,n);>> y = sin(x);

dove abbiamo scelto31 punti equispaziati. Per realizzare il grafico basta aggiungerel’istruzione

>> plot(x,y)

In questo modo otteniamo una rappresentazione grafica della tabella di valori ottenu-ta semplicemente raccordando con segmenti di retta nel piano cartesiano(x, y) i vertici(x(i), y(i)) in modo ordinato al variare dii da1 a 31. La scelta della scala di visualizzazio-ne è automatica. Se vogliamo evidenziare i vertici della poligonale così costruita possiamoutilizzare l’istruzione

>> plot(x,y,’-o’)

che disegna una linea con un circoletto in corrispondenza dei vertici. Non cambia la funzionema i parametri in ingresso, in questo caso i parametri aggiunti specificano lo stile della lineadel grafico.

La sintassi di base del comandoplot per i grafici bidimensionali è quindi

plot(Vettore1, Vettore2, Opzioni),

doveVettore1e Vettore2sono i vettori di dati (ascisse e ordinate dei punti) eOpzioniè unastringa opzionale che definisce il tipo di colore, di simbolo e di linea usato nel grafico. Esi-stono molte possibilità per personalizzare un grafico come quello creato nell’esempio prece-dente, in Tabella 1.7 riportiamo le opzioni principali. Al solito si vedahelp plot per ulterioripossibilità legate alla versione MATLAB in uso. Si noti che se il comando viene usato nellasemplice formaplot(Vettore), MATLAB realizza il grafico del vettore rispetto ai propriindici. Possiamo inoltre commentare il grafico aggiungendo delle scritte sugli assi coordinatie mettendo un titolo

>> title(’Grafico della funzione sin(x)’)>> xlabel(’asse x’)>> ylabel(’asse y’)

Page 32: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

32 Partenza

Colore Simbolo Linea

y giallo . punto - linea continuam magenta o circoletto : linea punteggiatac ciano x per -. linea puntor rosso + più - - linea tratteggiatag verde * asteriscob blu s quadratinow bianco d diamantek nero v triangolo

Tabella 1.7.Alcune opzioni del comandoplot in MATLAB

Se vogliamo produrre un risultato visivamente privo di “spigoli”, sarà sufficiente aumen-tare il numero di puntin in modo tale che i segmenti di raccordo siano così corti da fornirel’impressione di una curva continua. Il risultato finale è riportato in Figura 1.2 in cui si so-no utilizzati differenti numeri di punti e stili di linea. È possibile cambiare scala nei graficitramite la funzioneaxis che permette di stabilire la grandezza della finestra in cui vedere ilgrafico. Per esempio

>> x = linspace(0,2*pi);>> y = sin(x);>> plot(x,y);>> a = axisa =

0 7 -1 1>> axis([a(1) pi a(3) a(4)]);

0 1 2 3 4 5 6 7−1

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1

asse x

asse

y

Grafico della funzione sin(x)

0 1 2 3 4 5 6 7−1

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1Grafico della funzione sin(x)

asse

y

asse x

Figura 1.2. Rappresentazione grafica dei valori della funzionesin(x) in [0, 2π] con31 puntie101 punti.

Page 33: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 33

per ottenere solo la parte di grafico sull’intervallo[0, π]. La funzioneaxis([xmin xmax yminymax]) impone che l’intervallo di valori dix sia compreso traxmin exmax e quello diy traymin e ymax. Il comandoaxis usato da solo fornisce un vettore contenete i valori attualidella finestra grafica. È possibile comunque sovrapporre grafici di più funzioni nella stessafinestra grafica.

Esempio 1.7 (Grafici sovrapposti) Ci poniamo il problema di realizzare i grafici delle fun-zioni seno e coseno sull’intervallo[0, 2π] nella stessa finestra grafica. Per fare questo abbiamodue possibilità. Innanzitutto dobbiamo costruire i vettori di valori per le due funzioni

>> x = linspace(0,2*pi);>> y1 = cos(x);>> y2 = sin(x);

Per disegnarne i grafici sovrapposti possiamo scrivere (utilizzando due tratti di lineadiversi)

>> plot(x,y1,’-’)>> hold on>> plot(x,y2,’--’)>> hold off

Il comandohold on mantiene l’attuale contenuto della finestra grafica in modo tale che igrafici successivi si sovrappongano nell’attuale finestra grafica. Il comandohold off ritornaall’impostazione originale in cui la finestra grafica viene ripristinata a ogni nuovo grafico.Lo stesso risultato può essere ottenuto in forma più compatta tramite la singola funzioneplotper grafici multipli

>> plot(x,y1,x,y2)

che utilizza in modo automatico linee di colore differente per i diversi grafici. Infine sevogliamo realizzare i due grafici evidenziando ad esempio i punti di intersezione delle duecurve possiamo scrivere

>> plot(x,y1,’-’,x,y2,’--’,[1 5]*pi/4,[1 -1]/sqrt(2),’o’);

Per aggiungere una legenda all’interno del grafico possiamo infine utilizzare la funzionelegend

>> legend(’Coseno’, ’Seno’, ’Intersezione’)

In Figura 1.3 si mostra il risultato, si noti che automaticamentelegend associa le scritteal tipo di linea (secondo l’ordine in cui sono state disegnate). È stata aggiunta anche unagriglia sottostante tramite la funzionegrid. Per aggiungere la grigliagrid on, per toglierlagrid off. Come per la funzionehold, scrivere sologrid permette di passare daon a off eviceversa.

In Tabella 1.8 riportiamo le principali funzioni che consentono di aggiungere commentia un grafico. Ulteriori funzioni possono essere sperimentate utilizzando il comandohelpgraph2d.

Page 34: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

34 Partenza

0 1 2 3 4 5 6 7−1

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1Coseno Seno Intersezione

Figura 1.3. Sovrapposizione dei grafici delle funzioni seno e coseno con una legenda.

Funzione Significato

axis prescrive i valori minimi e massimi sugli assix eytitle inserisce un titolo nel graficoxlabel inserisce un nome per l’assexylabel inserisce un nome per l’asseyzlabel inserisce un nome per l’assezgrid inserisce una griglia sugli assix eylegend inserisce una legenda per identificare i diversi graficitext inserisce una stringa di testo in una posizione specificatagtext inserisce una stringa di testo posizionandola con il mouse

Tabella 1.8.Alcune funzioni per “abbellire” grafici in MATLAB

1.3.6 Sottografici e grafici multidimensionali

Spesso ci si pone il problema di disegnare diversi grafici separati in una stessa finestra grafica.L’obiettivo può essere raggiunto facilmente utilizzando la funzionesubplot la cui sintassi è

subplot(Righe, Colonne, Sottofinestra)

doveRigheeColonnedefiniscono la struttura della matrice di sottofinestre grafiche all’inter-no della finestra grafica principale eSottofinestraindica il numero della sottofinestra graficaattiva. Consideriamo a titolo di esempio l’istruzionesubplot(3,2,4). Tale istruzione suddi-vide la finestra in una matrice3×2 di sottofinestre e attiva la quarta sottofinestra grafica. I va-lori numerici possono anche essere raggruppati per cuisubplot(324) equivale al precedentesubplot(3,2,4). Le sottofinestre sono numerate e disposte come segue

Page 35: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 35

1 2

3 4

5 6

In generale la numerazione procede da sinistra a destra e dall’alto verso il basso. Dopo che siè individuata la sottofinestra si può procedere con i comandi di grafica che agiranno in quellasottofinestra.

Esempio 1.8 (Grafici in sottofinestre) Se vogliamo disegnare in diverse sottofinestre graficidi diverse funzioni dobbiamo selezionare le sottofinestre e disegnare in ognuna di esse. Peresempio consideriamo la famiglia di funzioni

fk(x) = e−x2sin(kπx),

sull’intervallo [−1, 1] al variare del parametro interok. Ecco un esempio in cui si creanoquattro sottofinestre per disegnare il grafico difk(x), k = 1, 2, 3, 4

>> x=linspace(-1,1);>> y=exp(-x.^2).*sin(pi*x);>> subplot(2,2,1);>> plot(x,y); title(’k=1’);>> y=exp(-x.^2).*sin(2*pi*x);>> subplot(2,2,2);>> plot(x,y); title(’k=2’);>> y=exp(-x.^2).*sin(3*pi*x);>> subplot(2,2,3);>> plot(x,y); title(’k=3’);>> y=exp(-x.^2).*sin(4*pi*x);>> subplot(2,2,4);>> plot(x,y); title(’k=4’);

Il risultato è riportato in Figura 1.4.

Le capacità grafiche di MATLAB consentono di produrre grafici di funzioni in più variabili,ossia rappresentazioni grafiche di array a più indici. Così come una funzione di una variabiley = f(x) definisce una curva nel piano, il grafico di una funzione di due variabili indipendentiz = f(x, y) definisce una superficie nello spazio tridimensionale. Esistono numerosi metodidi rappresentazione grafica di superfici, in questo paragrafo presenteremo solo le funzioniprincipali. Il procedimento per produrre il grafico di una funzione in due variabili consistenel preparare i dati, dominio(x, y) e valoriz = f(x, y), selezionare la finestra o sottofinestragrafica, utilizzare un comando di grafica.

Esempio 1.9 (Esempio di grafico di superficie)Consideriamo la funzione

f(x, y) = (1− y) cos(x2) + (x− 1) cos(y2),

Page 36: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

36 Partenza

−1 −0.5 0 0.5 1−1

−0.5

0

0.5

1k=1

−1 −0.5 0 0.5 1−1

−0.5

0

0.5

1k=2

−1 −0.5 0 0.5 1−1

−0.5

0

0.5

1k=3

−1 −0.5 0 0.5 1−1

−0.5

0

0.5

1k=4

Figura 1.4. Quattro sottografici della funzionefk(x) = e−x2sin(kπx) al variare dik =

1, 2, 3, 4.

nel dominio quadrato−1 ≤ x ≤ 2, −2 ≤ y ≤ 2. Per costruirne il grafico della superficiedobbiamo innanzitutto definire la griglia di valori(x, y) nei quali valuteremo la nostra fun-zionez = f(x, y). Per costruire la griglia di valori possiamo utilizzare la funzionemeshgridnella forma

>> n=7;m=n;>> x=linspace(-2,2,n);>> y=linspace(-2,2,m);>> [X,Y]=meshgrid(x,y)X =

-2.0000 -1.3333 -0.6667 0 0.6667 1.3333 2.0000-2.0000 -1.3333 -0.6667 0 0.6667 1.3333 2.0000-2.0000 -1.3333 -0.6667 0 0.6667 1.3333 2.0000-2.0000 -1.3333 -0.6667 0 0.6667 1.3333 2.0000-2.0000 -1.3333 -0.6667 0 0.6667 1.3333 2.0000-2.0000 -1.3333 -0.6667 0 0.6667 1.3333 2.0000-2.0000 -1.3333 -0.6667 0 0.6667 1.3333 2.0000

Y =-2.0000 -2.0000 -2.0000 -2.0000 -2.0000 -2.0000 -2.0000-1.3333 -1.3333 -1.3333 -1.3333 -1.3333 -1.3333 -1.3333-0.6667 -0.6667 -0.6667 -0.6667 -0.6667 -0.6667 -0.6667

0 0 0 0 0 0 0

Page 37: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 37

0.6667 0.6667 0.6667 0.6667 0.6667 0.6667 0.66671.3333 1.3333 1.3333 1.3333 1.3333 1.3333 1.33332.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.000

La funzione costruisce due matricim× n del tipo

X =

x(1) x(2) . . . x(n)x(1) x(2) . . . x(n)

: : :x(1) x(2) . . . x(n)

Y =

y(1) y(1) . . . y(1)y(2) y(2) . . . y(2)

: : :y(m) y(m) . . . y(m)

Per creare il grafico della superficie è sufficiente aggiungere le istruzioni

>> Z=(1-Y).*cos(X.^2)+(X-1).*cos(Y.^2);>> mesh(X,Y,Z);>> xlabel(’x’);ylabel(’y’);zlabel(’z’);

Si noti come la costruzione della matrice che caratterizza i valori della funzione possaessere eseguita in forma compatta tramite l’uso vettoriale di MATLAB basato sull’operazionedi prodotto puntuale. La matriceZ avrà la proprietà

Z(i, j) = f(X(i, j), Y (i, j)), i = 1, . . . ,m j = 1, . . . , n.

Il risultato ottenuto scegliendom = 31 en = 31 è riportato in Figura 1.5 assieme al graficodelle curve di livello. Le curve di livello, linee nel piano che corrispondono a valori costantif(x, y) = costante (geometricamente consiste nel “tagliare” il grafico della funzione a unaaltezza prefissata con un piano parallelo al piano(x, y) e proiettando la curva che si ottiene),si possono avere tramite la funzionecontour(X,Y,Z).

−2

−1

0

1

2

−2

−1

0

1

2−5

0

5

xy

z

−2 −1.5 −1 −0.5 0 0.5 1 1.5 2−2

−1.5

−1

−0.5

0

0.5

1

1.5

2

Figura 1.5. Grafico di superficie e curve di livello dif(x, y) = (1 − y) cos(x2) + (x −1) cos(y2).

Page 38: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

38 Partenza

La funzione principale è quindimesh che ha la seguente sintassi

mesh(Matrice1, Matrice2, Matrice3)

doveMatrice1 e Matrice2 sono matrici quadrate definite a partire dai vettorix e y, mentreMatrice3 è una matrice quadrata tale che l’elemento di indicii, j è dato daf(x(i), y(j)).Esistono inoltre altre forme per utilizzare la funzione e si rimanda al solito all’help in linea.La rappresentazione grafica dimesh è l’analogo in più dimensioni del comandoplot. Inquesto caso si raccordano i punti a quattro a quattro con “pezze” piane (parti di piano chepassano per i quattro punti). Utilizzando invece la funzionesurf le varie pezze vengono co-lorate opportunamente. Se non si varia la mappa dei colori, MATLAB colora con tonalità dirosso i “picchi” della superficie, mentre con tonalità di blu le “valli” della superficie. Anchele linee di livello conservano questa colorazione. Il comandosurfl permette di abbinarel’ombreggiatura immaginando di illuminare la superficie con la luce da un dato punto di vista(selezionarehelp surfl per maggiori dettagli). È anche possibile agire sull’ombreggiaturae sulla mappa di colori utilizzata tramite i comandishading e colormap.In generale il grafico di superfici può essere personalizzato in diversi modi. Oltre alle opzioniprecedentemente discusse, ossiaaxis, title, xlabel, ylabel e zlabel, è possibile cam-biare il colore, l’angolo di visualizzazione e realizzare grafici di tipo differente. In Figura 1.6il risultato grafico disurf(X,Y,Z) e di

>> surfl(X,Y,Z);>> shading interp;>> colormap(pink);

in cui si ombreggia la superficie in base a un algoritmo di tipo interpolatorio e si è selezionatauna mappa di colori comprendente sfumature del rosa. In Tabella 1.9 sono riassunte le prin-

−2

−1

0

1

2

−2

−1

0

1

2−5

0

5

uso di surf

−2

−1

0

1

2

−2

−1

0

1

2−5

0

5

uso di surfl

Figura 1.6. Grafico di superficie consurf e surfl.

cipali funzioni grafiche “tridimensionali”, che possono essere ulteriormente esplorate tramitel’uso dell’help, tramite il comandohelp graph3d.

Esempio 1.10(Matrici a colori) Tramite pcolor è possibile rappresentare una matricen ×m riempiendo una “scacchiera” con le stesse dimensioni della matrice data e colorando

Page 39: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 39

Funzione Significato

view cambia l’orientamento del graficocolormap cambia il colore del graficoshading cambia l’ombreggiatura del graficomesh disegna un grafico a grigliacontour disegna un grafico a curve di livellocontourf disegna un grafico a curve di livello riempitesurf disegna un grafico di superficiesurfl disegna un grafico di superficie con ombreggiaturaplot3 disegna punti e linee nello spazio tridimensionalepcolor disegna una scacchiera colorando le caselle

Tabella 1.9.Alcune funzioni per grafici di superfici in MATLAB.

ogni casella con indicii, j in base al valore dell’elemento corrispondente della matrice. Il piùpiccolo e il più grande valore della matrice sono assegnati al primo e ultimo elemento dellatabella dei colori. Nel caso di default, opzionefaceted, ogni casella è uniformemente colo-rata utilizzando la tabella dei colori, inoltre l’ultima riga e colonna della matrice non vengonoutilizzate. Tramite l’ombreggiatura con l’opzione di interpolazione,shading interp, ognicasella è colorata tramite una interpolazione bilineare dei colori assegnati ai quattro verticidella casella stessa. In Figura 1.7 si mostra un esempio predisponendo una matriceZ conte-nete i valori della funzionef(x, y) = x2 + y2 con(x, y) ∈ [−2, 2]× [−2, 2] e valutando talefunzione su una griglia regolare di31 punti

>> x=linspace(-2,2,31); [X,Y]=meshgrid(x,x);>> Z=X.^2+Y.^2;

Nella figura si confrontano i casi con le due opzionifaceted e interp. Nel primo casoabbiamo utilizzatopcolor(Z), mentre nel secondo caso abbiamo aggiuntoshading interp.Potete riprodurre l’esperimento e cambiare tavola di colori consultandohelp colormap.

Osserviamo che la visualizzazione grafica tridimensionale descritta finora si basa sull’assuntoche i valori delle variabilix ey siano equispaziati e ordinati in una matrice. Come possiamovisualizzare il grafico bidimensionale di una funzione di cui siano noti una serie di valoridisposti casualmente? Evitando per il momento di addentrarci nell’uso di tecniche di tipointerpolatorio, terminiamo il capitolo con un “semplice” modo di ovviare questa difficoltà.

Esempio 1.11(Grafici e punti casuali) Supponiamo di volere realizzare il grafico dellafunzione

f(x, y) = exp(−5x2 − 5y2), x, y ∈ [−1, 1],

di cui è noto il valore su un insieme di punti disposti a caso nel piano11.In MATLAB possiamo simulare una tabella20×20 di valori casuali sul quadrato[−1, 1]×

[−1, 1] tramite i comandi

11 Lasciamo, per ora, all’intuizione del lettore il concetto di “caso”.

Page 40: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

40 Partenza

5 10 15 20 25 30

5

10

15

20

25

30

pcolor(Z)

5 10 15 20 25 30

5

10

15

20

25

30

pcolor(Z) e shading

Figura 1.7. Con pcolor si ottiene una rappresentazione bidimensionale di una superficie,l’informazione della dimensione mancante viene tradotta in colore.

>>X=1-2*rand(20,20);>>Y=1-2*rand(20,20);

Dove abbiamo utilizzato la trasformazione lineare

b− (b− a)rand(m,n),

per estrarre una tabellam×n di valori pseudo-casuali in[a, b]. Infatti la funzionerand generanumeri pseudo-casuali distribuiti uniformemente nell’intervallo[0, 1]. Questo significa chese0 < α < β < 1, allora la frazione di valori che cade nell’intervallo[α, β] è circaβ − α.

Se ci accontentiamo di visualizzare i valori assunti dalla funzione come punti nello spaziotridimensionale possiamo utilizzare la funzioneplot3 nella forma

>>Z=exp(-5*X.^2-5*Y.^2);>>plot3(X,Y,Z,’.’);

Per realizzare un grafico più dettagliato della funzione si può creare una triangolazioneassociata all’insieme pseudo-casuale di punti che consente di costruire una serie di “pezze”passanti per i vertici di ogni triangolo. Senza entrare nei dettagli matematici del problema,tale triangolazione, detta di Delaunay può essere realizzata tramite il diagramma di Voronoi12

associato all’insieme dei punti, vedi Figure 1.8 e 1.9.In MATLAB possiamo scrivere

>>TRI=delaunay(X,Y);>>trisurf(X,Y,Z);>>figure;>>voronoi(X,Y);

12 Dato un insiemeP di punti nel piano, una cella di Voronoi del puntop ∈ P contiene tutti i punti del piano chesono più vicini ap che ad ogni altro punto dell’insiemeP . L’unione dei bordi delle celle di Voronoi si chiamadiagramma di Voronoi. La triangolazione di Delaunay dell’insiemeP ha la proprietà che il cerchio circoscitto aogni triangolo non contiene nessun punto dell’insiemeP . Matematicamente è la struttura duale del diagrammadi Voronoi.

Page 41: Contenuto - Apogeo Editore · una successione di numeri, ... (C/C++, Fortran, Ada, Pascal, ecc.). La risposta di MATLAB ... portanti aggiunte per l’analisi dei dati e per la visualizzazione

1.3 Semplici operazioni in MATLAB 41

−1

−0.5

0

0.5

1

−1

−0.5

0

0.5

10

0.2

0.4

0.6

0.8

1

−0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

Figura 1.8. Visualizzazione tramiteplot3 della funzioneexp(−5x2 − 5y2) su un insiemepseudo-casuale di punti in[−1, 1]× [−1, 1] e corrispondente diagramma di Voronoi.

−1 −0.8 −0.6 −0.4 −0.2 0 0.2 0.4 0.6 0.8 1−1

−0.8

−0.6

−0.4

−0.2

0

0.2

0.4

0.6

0.8

1

−1

−0.5

0

0.5

1

−1

−0.5

0

0.5

10

0.2

0.4

0.6

0.8

1

Figura 1.9. Esempio di triangolazione di Delaunay un insieme pseudo-casuale di punti in[−1, 1]× [−1, 1] e grafico della funzioneexp(−5x2 − 5y2).

per visualizzare in due differenti finestre il grafico della funzione tramitetrisurf analogo disurf nel caso di triangolazioni e il corrispondente digramma di Voronoi usato per costruirela triangolazione tramite i comandidelaunay e voronoi. La funzionefigure consente diaprire una nuova finestra grafica che automaticamente diventa la nuova finestra grafica attiva.Con l’opzionefigure(n) è inoltre possibile etichettare con un numero interon la finestragrafica. Ripetendo la stessa istruzione verrà selezionata la finestra grafican e l’output graficoindirizzato sulla stessa. Si rimanda al comandohelp specgraph per approfondimenti sullefunzioni grafiche avanzate.