MatLab Slides

121
Metodi matematici per Metodi matematici per l’ottimizzazione dinamica l’ottimizzazione dinamica Introduzione a MATLAB Introduzione a MATLAB Giovanni Di Bartolomeo Giovanni Di Bartolomeo Università di Teramo Università di Teramo email: email: [email protected] [email protected]

description

breve guida

Transcript of MatLab Slides

Metodi matematici per Metodi matematici per l’ottimizzazione dinamical’ottimizzazione dinamica

Introduzione a MATLABIntroduzione a MATLABGiovanni Di BartolomeoGiovanni Di BartolomeoUniversità di TeramoUniversità di Teramoemail: email: [email protected]@unite.it

Programma dell’introduzione a MATLABProgramma dell’introduzione a MATLAB

I. Introduzione alla programmazione e struttura di MATLABII. Algebra matriciale e linguaggio matriciale in MATLAB III. Funzioni matematico - statisticheIV. Importazione ed esportazione di datiVI. M- files: creazione delle funzioniVII. Cicli (loop), espressioni if e relazioni logicheVIII. Grafici e funzioni plotIX. Funzioni di ottimizzazione di MATLAB

Nota: Questi lucidi sono liberamente tratti da quelli pubblicati sul web dal professor Alberto Plazzi (Università di Verona)

I. Introduzione alla programmazione

Ambito di applicazione

Nell’analisi dei fenomeni economici e finanziari è indispensabile conoscere e saper programmare software econometrico –statistici, che siano in grado di risolvere problematiche di carattere matematico e statistico più o meno complesse, altrimenti impossibili da trattare per la loro difficoltà computazionale.

La programmazione

ProgrammareProgrammare significa scrivere in un particolare linguaggio un testo in grado di essere “letto” dal software, che contenga delle istruzioni che il software dovrà eseguire al fine di produrre un risultato numerico.

Per questo motivo la fase di programmazione potrebbe in linea di principio essere eseguita su un qualsiasi editor di testo (es. Word, txt,..), per poi essere letta con il programma prescelto.

Importanza dell’algebra matriciale

I fenomeni finanziari ed economici vengono analizzati soprattutto mediante lo studio di datidati , che possono riguardare:

una stessa variabile osservata in momenti diversi => campione in time time seriesseries (serie storica); es. la serie storica giornaliera dei prezzi del petrolio.diverse variabili osservate in uno stesso momento => campione in cross cross sectionsection; es. il valore di più indici azionari osservati in un momento.Entrambe le situazioni precedenti => panel; es. il valore di più indici azionari osservati per un certo periodo di tempo.

Importanza dell’algebra matriciale

Indipendentemente dal tipo di dati con cui stiamo lavorando, questi sono raccolti in matricimatrici, sulle quali noi lavoriamo per esaminare il fenomeno in oggetto

Per questo motivo è indispensabile conoscere sia l’algebra matriciale sia il linguaggio matriciale che è alla base dei principali software di programmazione.

Concentriamo l’attenzione su MATLAB

MATLAB: interfaccia più vicina a Windowscapacità di lavorare congiuntamente con Excel, grande facilità di programmazione e buone capacità computazionali

trade off tra duttilità del software e precisione computazionale

II. Struttura di MATLAB

Struttura di MATLAB

Matlab può venir utilizzato per:

Applicazioni matematiche e calcoli numericiProcedureSimulazioni Analisi di datiGrafici…..

Struttura di MATLAB

All’apertura di MATLAB ci troviamo sulla finestra del commandcommand: questo significa che sulla riga in cui lampeggia l’indicatore ditesto possiamo digitare le operazioni, che verranno immediatamente recepite dal programma ed eseguite premendo INVIO.

Quanto scritto nel command durante tutta la sessione di lavoro può essere ripreso durante la stessa ponendosi su una linea e premendo la freccia in altofreccia in alto; premendo tale tasto in continuazione viene visualizzato quanto digitato precedentemente.

Quando la finestra di command su cui sono state eseguite le operazioni risulta troppo piena e si vuole cancellarla, si digita clcclc e si preme invio. La cancellazione non preclude l’utilizzo della funzione precedente (freccia in su).

Struttura di MATLAB

Le operazioni immesse nel command vengono immediatamente eseguite da MATLAB, che fornisce il risultato premendo il tasto INVIO al termine della operazione da eseguire: es. >> 7/5 (INVIO)ans=

1.400000Oppure, nella stragrande maggioranza dei casi, abbiamo bisogno di definire delle variabilidefinire delle variabili che rimarranno in memoria in MATLAB per tutta la sessione di lavoro poiché vengono da questo immagazzinate in una memoria temporanea: es.>> A=7.5Da questo momento in poi ad A sarà associato il valore 7.5. Quindi se digitiamo >> A*2ans=

15

Struttura di MATLAB

Qualora digitassimo:>> A=6 ans=

6.000000d’ora in poi ad A sarà associato il valore 6 e verrà riscritto sul valore precedente.

ATTENZIONE:1. MATLAB distingue tra lettere maiuscole e lettere

minuscole, per cui se avessimo per sbaglio digitato prima>> a*2??? Undefined function or variable ‘a’

2. Non si può nominare una variabile come pi, cui è associato il numero 3.1416

Struttura di MATLAB

Qualora nel command si voglia effettuare una operazione senza che MATLAB ne stampi a video il risultato bisogna porre alla fine della riga un punto e virgola “;;”. Ovviamente questo ha senso solo se sto lavorando con variabili definite, altrimenti rende inutile l’operazione. Es. se digito:>> 1+2;>>MATLAB ha calcolato 1+2 ma siccome non è coinvolta nessuna variabile non abbiamo visto il risultato dell’operazione e non èsuccesso nulla, non possiamo usare il risultato in quanto ad esso non è associata alcuna variabile utilizzabile nelle righe successive. Se invece digito:>>r=3+4;>>r*2ans=

14e qui ho utilizzato (ma non stampato a video) il risultato di 3+4.

Struttura di MATLAB

Qualora il testo da inserire risultasse troppo lungo per essere visualizzato su una riga, è possibile scrivere un testo su più righe utilizzando uno spazio e i tre punti “…” sulla riga su cui poi si va a capo. Quindi scrivere:>> r=3+4/2-7+9r=

7è lo stesso di scrivere>> r=3+4/2 …-7+9r=

7Volendo che MATLAB stampi a video una stringa di lettere (delle parole) e non numeri, ad es. la parola “ciao”, basta racchiudere la stessa tra apostrofiapostrofi ‘‘. Es:>> ‘ciao’ans=

ciao

Struttura di MATLAB

Volendo introdurre un testo che non sia invece considerato dal programma lo si deve racchiudere tra %. Es.>> 4+2 %ciao%ans=

6e il programma lo ignora. (Questa funzione risulterà molto utilenell’edit.)

Command & Edit

Quando scriviamo operazioni sul command abbiamo tuttavia diversi inconvenienti: principalmente la difficoltà di gestire una serie piuttosto lunga di operazioni da far eseguire al computer in successione logica. La sconvenienza del command deriva dal fatto che essendo le operazioni eseguite subito, possono comparire messaggi di errore, etc. Inoltre, il testo della finestra del command non può essere salvato in un file a parte, se non selezionando il testo, facendo copia e incolla su un edit tipo Word, ma vengono compresi anche i messaggi di errore o i risultati.

È opportuno invece che il testo contenente le operazioni da fareseguire in successione sia scritto in una finestra di edit di testo, e dopo tale file venga letto dal command, che fornisca il risultato delle operazioni contenute nel file di testo, che contiene tutte e sole le operazioni.

Edit

L’opportunità di lavorare sull’edit risiede nella possibilità di salvare quanto scritto su un file di estensione “.m.m”, che poi in qualsiasi altro momento può essere recuperato e modificato. Tali files vengono pertanto definiti M-files.

Quindi:Per codici che coinvolgono un breve numero di operazioni si può agire direttamente sul commandcommand;Per codici che vogliono essere salvati per poi essere riutilizzati o per codici che consistono in parecchie operazionidobbiamo lavorare sull’editedit

Edit

Per quanto detto, 3 sono le operazioni possibili all’apertura diMATLAB:

Lavorare direttamente sulla finestra aperta (il command);Aprire un nuovo file di edit digitando

File > New > M-file

che apre una nuova finestra di edit su cui possiamo lavorareAprire un file di edit precedentemente creato digitando

File > Open > …

che va nella cartella workwork, la cartella destinata ad accogliere tutti i personali m-files.

Edit

Una volta aperto il file di edit, possiamo su di esso digitare tutte le operazioni che vedremo in seguito (manipolazione di matrici, loop,…).

Se vogliamo vedere il risultato delle operazioni, dobbiamo far “correre”, girare il programma premendo nell’edit, dopo aver salvato il file:

Debug (o Tools) > Run

o più semplicemente premendo il tasto F5. In questo modo otterremo nel command i risultati delle operazioni della finestra di edit, che non verrà così “toccata” dai risultati.

Possiamo durante la sessione passare sempre da edit a command e viceversa: sull’edit abbiamo il testo delle operazioni, sul command il risultato.

Edit

Una volta scritto nell’edit un codice completo e volendo salvarlo per averlo a disposizione in futuro, possiamo digitare nell’edit:

File > Save as…

che va a salvare il file con estensione .m nella cartella work, dove sarà possibile riaprirlo in futuro digitando come detto File > Open >…Il percorso o path nel quale MATLAB legge e salva i files può essere visto digitando nel command il comando path.

Tale percorso può essere modificato inserendo o eliminando le cartelle nelle quali MATLAB cerca le funzioni e i files digitando

File > Set Path…

Cosa sono le librerie o toolbox

MATLAB consiste di una serie di funzioni di base, es. creazione di matrici, funzioni matematiche, … attraverso le quali è possibile svolgere un’infinità di funzioni.

Tuttavia sono state create delle librerie apposite, ovvero delleraccolte di funzioni, specifiche per argomento. Es. librerie di ottimizzazione, finanza, simulazione, derivati …. Si tratta quindi di raccolte di funzioni che l’utilizzatore ha a disposizione immediatamente, essendo già state create.

Le librerie sono immediatamente utilizzabili nell’edit e nel command, e inoltre andando nella directory di MATLAB possiamo aprire i singoli file delle librerie e osservare i codici associati ad ogni funzione.

Aiuti nella programmazione

Il tasto help è il principale aiuto nell’utilizzo di MATLAB. Digitando nel command

helphelp

si apre un elenco che costituisce l’insieme di librerie presenti in Matlab. Digitando help seguito dal nome della libreria scelta otteniamo la serie di funzioni associate alla libreria, con una indicazione della loro utilità. Ad es. se digitiamo help vediamoche la libreria “matlabmatlab\\elmatelmat” si occupa di matrici, e digitando help matlab\elmat abbiamo un’indicazione di tutte le funzioni presenti in questa libreria.

Aiuti nella programmazione

Digitando poi help seguito dal nome della funzione otteniamo una descrizione dell’utilizzo della funzione stessa.

es. help mean

ci dice come funziona questa funzione che calcola la somma facendoci anche un esempio. Inoltre se andiamo a recuperare ed aprire il file “mean.m” (file associato alla funzione mean) all’interno della directory di MATLAB, vediamo che quanto stampato a video corrisponde alle righe racchiuse tra % presenti all’inizio della funzione. Riprenderemo questo discorso più avanti parlando delle funzioni.

Aiuti nella programmazione

Un altro comando che permette di visualizzare le funzioni che riguardano lo stesso argomento di una funzione nota è lookfor. Ad es. digitando

lookfor diag

otteniamo tutti i comandi analoghi al comando di estrazione della diagonale principale di una matrice.

In MATLAB esiste inoltre una guida che può essere in ogni momento consultata premendo Help > MATLAB Help

Aiuti nella programmazione

Nella creazione di funzioni risulta utilissima la presenza nell’editdel Debug, ossia di un meccanismo che permette all’utilizzatore di avere i risultati delle operazioni che il programma svolge o meglio sta svolgendo, all’interno di una funzione, controllando che calcoli esattamente ciò che si voleva esso facesse. Vedremo più avanti la sua utilità nell’abito della creazione di funzioni.

Altri comandi video

Who e whos: digitati nel command, forniscono rispettivamente il nome delle variabili utilizzate (who) e il nome delle variabili utilizzate + la loro dimensione , cioè se matrici, numeri, … (whos).

Clear: digitato nel command azzera tutte la variabili temporaneamente presenti.

Attenzione!: mentre clc cancella quanto è scritto ma non la memoria temporanea, clear azzera proprio quest’ultima!

Il comando format gestisce l’aspetto grafico con il quale vengono visualizzati i risultati. In sintesi possiamo usare nel command

format shortformat long

III. Algebra matriciale e linguaggio matriciale in MATLAB

Linguaggio matriciale

Come detto, il linguaggio matriciale costituisce il nucleo essenziale della programmazione. Vediamo ora i comandi principali che riguardano creazione e manipolazione delle matrici.

Va tenuta a mente una cosa fondamentale: MATLAB lavora su matrici e in tutte le operazioni in cui è possibile utilizzarlo il linguaggio matriciale, anziché codici con loop, if…., risulta di gran lunga il modo più veloce ed efficiente di programmare.

Le matrici possono essere registrate:› Introducendo un elenco di numeri› Creando le matrici in M-files› Caricando i dati da files esterni› Facendo generare i dati da MATLAB

Linguaggio matriciale

Consideriamo l’inserimento manualel’inserimento manuale di dati nel command di MATLAB; sono tre le indicazioni da seguire:

Gli elementielementi della matrice devono essere racchiusi tra parentesi quadre []parentesi quadre []Gli elementi di una stessa rigastessa riga vanno separati da uno spaziospazioIl passaggiopassaggio da una riga all’altra avviene con il punto e il punto e virgolavirgola

Quindi per registrare la matrice 1 2 -64 -4 5

che chiamiamo “A” va digitato nel commandA=[1 2 -6; 4 -4 5] e invio.

Linguaggio matriciale

Per ottenere un elemento della matrice, va indicata tra parentesi tonde la posizione dello stesso nel modo seguente:

m = A(2,2) e invioottenendo così l’elemento che occupa la posizione 2,2 nella

matrice A. Se commettessimo l’errore di digitare n = A(2,6) e invio

avremmo un messaggio di errore, date le dimensioni della nostra matrice.

Linguaggio matriciale

Il comportamento di MATLAB non è invece lo stesso se si immagazzina un nuovo numero in una posizione che, per le dimensioni di partenza della matrice, non dovrebbe esistere. Se infatti digitiamo:

A(2,4)=7 e invioattribuiamo valore 7 all’elemento di posizione (2,4), che non

esisterebbe date le dimensioni (2x3) della matrice. MATLAB

allora “allarga” la matrice, inserendo l’elemento 7 nellaposizione scelta e ponendo zeri nella colonna (o riga) che è

stata aggiunta.

Linguaggio matriciale

Tra gli operatori matriciali, ruolo importante è attribuito ai due punti “:” , che indica

Tutta la riga o colonna

A(1,:) e invio

fornisce come output tutti gli elementi della prima rigaTutte le colonne/righe da .. a …

A(1 , 2:3) e invio

fornisce come output tutti gli elementi della prima riga e delle colonne dalla seconda alla terza

Linguaggio matriciale

Un utilizzo altrettanto fondamentale è quello di servire per costituire una sequenzasequenza, nel modo

start:step:stop

ossia viene creata in un vettore riga una sequenza di numeri che iniziano dal numero start, vengono incrementati del valore step e si fermano quando raggiungono lo stop.Ad esempio

1:2:20 e invio

crea una sequenza di valori che partono da 1 e vengono incrementati di 2 fino ad arrivare a 20: 1 3 5 …… 19. Se non indicato, il passo di default è 1.

Operazioni con le matrici

Data una qualsiasi matrice, possiamo facilmente trasporla con l’apostrofol’apostrofo:

B=A’ e invioData una matrice quadrata, possiamo ottenere il suo determinante con la funzione detdet()():

d = det(matr) e invioL’operatore diagdiag()() estrae invece gli elementi della diagonale principale:

v=diag(A) e inviotale operazione è applicabile anche a matrici non quadrate.

Operazioni con le matrici

Un operatore di fondamentale utilizzo è sumsum()(), che somma gli elementi della matrice. L’operazione di somma avviene di default per colonna, ma è altresì possibile effettuarla per riga specificando sum(matrice,2). Analogo è il comando prod, che applica il prodotto.

L’operatore inv() inverte una matrice quadrata non singolare

Quindi se definiamo la matrice Z:2 5 -37 -2 48 -5 6

possiamo trasporla,estrarne la diagonale principale, calcolarne il determinante e ottenere un vettore che sommi per riga e uno che contenga la somma per colonna con i seguenti comandi:

Operazioni con le matrici

Ztr=Z’Dt = det(Z)V = diag(Z)Vs1=sum(Z)Vs2=sum(Z,2)Le operazioni di somma e sottrazione tra matrici si ottengono con i simboli “+” e “–” e consistono nella somma e sottrazione degli elementi di una matrice con il corrisponente elemento dell’altra, nell’ipotesi che le dimensioni delle matrici coincidano altrimenti il messaggio di errore è ??? Errar using => + Matrix dimension must agree

Operazioni con le matrici

L’operazione di prodotto tra matrici si effettua con “*”, e può avvenire solo se il numero di colonne della prima matrice = numero di righe della seconda. Se la condizione non viene rispettata il messaggio di errore è ??? Errar using => * Inner matrix dimension must agree

L’operazione di prodotto tra matrici elemento per elemento si effettua con “.*”, e può avvenire solo se le due matrici hanno uguale dimensione, poiché moltiplica ogni elemento della prima per il corrispondente della seconda.

L’elevamento a potenza di un elemento si ha con “^”. Applicato ad una matrice quadrata la moltiplica per sé stessa.

L’elevamento a potenza elemento per elemento di una qualsiasi matrice si ha con “.^”. Con esso si eleva ogni elemento della matrice alla potenza.

Concatenazione di matrici

Due matrici con ugual numero di righe possono essere concatenate orizzontalmente, cioè affiancate orizzontalmente per formare una matrice unica. Definite A (2x3) e B (2x4), possiamo definire C (2x7) come la matrice che otteniamo affiancandole con le parentesi quadre e lo spazio. Quindi le trattiamo come gli elementi di una matrice:>> C=[A B];

Due matrici con ugual numero di colonne possono essere concatenate verticalmente, cioè affiancate verticalmente per formare una matrice unica. Definite D (2x3) e F (4x3), possiamo E (6x3) come la matrice che otteniamo affiancandole con le parentesi quadre e il punto e virgola. Quindi scriviamo:>> E=[D ; F];

Matrici fondamentali

Le tre matrici più importanti per la programmazione sono le matrici di zeri e di uno, ottenibili con i comandi:

zeroszeros(i,j)(i,j), che permette di creare una, che permette di creare una matrice di zeri con i matrice di zeri con i righe e j colonnerighe e j colonne

onesones(i,j)(i,j), che permette di creare una, che permette di creare una matrice di tutti uno con i matrice di tutti uno con i righe e j colonnerighe e j colonne

eyeeye(i,j)(i,j), che permette di creare una, che permette di creare una matrice di i righe e j matrice di i righe e j colonne con uno sulla diagonale principale e zero altrovecolonne con uno sulla diagonale principale e zero altrove

Matrici fondamentali

Se per esempio dobbiamo creare una matrice 3x4 con tutti 5, possiamo applicare la moltiplicazione scalare ed usare il comando precedente digitando:>> M=5*ones(3,4);

Altri comandi fondamentali

Length(v): calcolato su di un vettore o su una serie, ne dà la lunghezza

Size(m): calcolato su di una matrice, ne dà numero di righe e di colonne; in particolare

size(m) => numero righe e colonne

size(m,1) => numero di righe

size(m,2) => numero di colonne

Altri comandi fondamentali

È possibile cancellare righe e colonne di una matrice utilizzando le parentesi quadre [], attribuendole alla riga/colonna che si vuole cancellare.Facendo >> m = ones(3,4);>> m(:,4) = []ho cancellato la quarta colonna di m.Ovviamente non è possibile scrivere>> m(2,2)=[]altrimenti starei cancellando un solo elemento e m non sarebbe più una matrice!

Reshape(X,M,N) considera una matrice X e dà come output unamatrice di MxN elementi presi da X partendo dalla prima colonna. Se X non ha ugual numero di elementi (MxN) fornisceun messaggio di errore.

Altri comandi

Altri comandi utilizzabili in ambito matriciale sono:

abs() => calcola il valore assoluto di un numero o la matrice contenente i valori assoluti della matrice cui èapplicato

fix() => tronca un numero all’intero

round() => calcola l’arrotondamento per eccesso/difetto

max() e min()=> calcola di un vettore il max o min elemento; di una matrice produce un vettore con il max o min degli elementi per colonne

fliplr() => inverte l’ordine degli elementi di un vettore

Altri comandi

norm() => calcola la norma 2 di un vettore o matrice

eig() => calcola gli autovalori di una matrice quadrata

rank(), che calcola il rango di una matrice

trace(), che calcola la traccia di una matrice

cumprod(x) restituisce un vettore o una matrice con il prodotto cumulato per colonna

cumsum(x) restituisce un vettore o una matrice con la somma cumulata per colonna

Funzioni matematico – statistiche

I comandi matematici di più comune utilizzo, applicabili a scalari e matrici, sono:

Sqrt(x), che calcola la radice quadrata di xsign(x), che 1,0 o -1 a seconda che x sia positivo, nullo o negativoexp(x), che calcola l’esponenziale di xlog(x), che calcola il logaritmo naturale di xmean(x), che calcola la mediacov(x), che calcola la matrice di varianza - covarianzamedian(x), che calcola la mediana della distribuzionevar(x) che calcola la varianza

Generazione di numeri casuali

Molto importanti sono i comandi relativi alla generazione di generazione di numeri casualinumeri casuali, che sono tali grazie ad algoritmi interni che garantiscono la non regolarità dei dati:

Rand(r,c) genera una matrice rxc di numeri estratti da una distribuzione continua uniforme (e quindi compresi tra zero ed uno)

Randn(r,c) genera una matrice rxc di numeri estratti da una distribuzione continua normale di media zero e varianza uno

Possiamo fissare il numero di partenza dal quale parte l’algoritmo di MATLAB per generare i numeri casuali (o meglio pseudo – casuali) digitando nel command:

>> rand(‘seed’,k)>> randn(‘seed’,k)

Generazione di numeri casuali

Le funzioni statistiche comprendono il campionamento da numerose variabili, tra cui citiamo normale, uniforme, chi – quadro, gamma, poisson, beta.Oltre alla generazione di numeri casuali, esistono numerosissime funzioni statistiche, osservabili digitando

help toolbox\stats

Tra le funzioni statistiche di maggior utilità, citiamo in generale:Le funzioni che calcolano, dato il valore della ascissa, la probabilità della parte sinistra = 1- pvalue finiscono in –cdfpreceduto dal nome della distribuzione, es. chi2cdf;Le funzioni che calcolano, data la probabilità, il valore dell’ascissa finiscono in –inv preceduto dal nome della distribuzione, es. chi2pdf;

Funzioni, cicli, operatori logici e grafici

La creazione di funzioni

Quando scriviamo nell’edit di MATLAB noi digitiamo una serie di operazioni che poi, alla riapertura del file, possono essere riutilizzate.

La maggior utilità dell’edit risiede nella possibilità di creare funzioni, allo stesso modo delle funzioni create da MATLAB stesso e presenti nei vari toolbox.

Una funzione, come ad esempio i comandi relativi alla manipolazione di matrici, consta di una serie di operazioni racchiuse in un file .m che vengono effettuate su di un input richiamando un comando che dà poi un output numerico.

Le funzioni risiedono in files .m denominati con lo stesso nome della funzione stessa es. mean.m

La creazione di funzioni

Ad es. la funzione sqrt(m) è una funzione che richiede 1 input (la matrice o il vettore) e fornisce 1 output

Caratterizzanti delle funzioni sono:Il nome della funzione, che è interno a MATLABIl numero di inputIl numero di output (se desiderati)

L’importante è che una volta salvato il file contenente la funzione, essa è immediatamente e per sempre utilizzabile sia nel command che nell’edit, senza bisogno di caricare il file.

Ad esempio se creo e salvo in una directory di MATLAB una mia funzione, potrò d’ora in poi sempre usarla.

La creazione di funzioni

Le funzioni vengono dunque create in M-files, consistono in una serie di operazioni e richiedono necessariamente argomenti di entrata (ossia input) e se desiderati anche argomenti di uscita (output).

La sintassi per creare una funzione nell’edit è:

functionfunction[output1,output2,..]= nome funzione(input1, input2,..)[output1,output2,..]= nome funzione(input1, input2,..)

La creazione di funzioni

quindi:Il nome funzione è il nome che noi attribuiamo alla funzione e con la quale essa verrà richiamata (es. mean), che dovrà coincidere con il nome del file

Gli input devono essere racchiusi tra parentesi tonde () e devono essere separati da virgole; gli input sono locali, cioè non dipendono dal nome che avrà poi in concreto la variabile quando applicherò la funzione!

Gli output devono essere racchiusi tra parentesi quadre [] e devono essere separati da virgole

La creazione di funzioni

Qualora non fosse necessario indicare un output, la sintassi è

functionfunction[]= nome funzione(input1, input2,..)[]= nome funzione(input1, input2,..)

Qualora non venga assegnato nessun output non sarà possibile richiamare il risultato quando calcoliamo la funzione

Proviamo ad esempio a creare una funzione che chiamiamo areacer che dato il raggio del cerchio me ne calcoli l’area; quindi

Esiste un input: il raggio del cerchioPosso o meno decidere che mi stampi semplicemente a video il risultato del calcolo oppure posso ad esso associare una variabile di output

La creazione di funzioni

Se vogliamo che la funzione dia un output (il valore numerico dell’area) scriveremo:function[area]=areacer(r) altrimentifunction[]=areacer(r)

Il codice più semplice da scrivere è 1- function[area]=areacer(r)2- area=pi*r^2;

Una volta salvato il file, denominato areacer.m, la funzione areacer() darà come risultato il quadrato dell’input moltiplicato per pi greco, ossia l’area del cerchio con quell’input.

La creazione di funzioni

Se non inserisco variabili di output, non posso richiamare la funzione attribuendole una funzione, altrimenti mi segna errore.Ad es. se il mio codice è: 1- function[]=areacer(r) 2- area=pi*r^2in questo caso la variabile area è locale, cioè interna alla funzione! Essa è stampata a video in quanto al termine della riga non compare il “;” ma non è indicata come variabile di output, in quanto è function[]. Quindi se io scrivessi nel command, dopo aver salvato il file con la funzione,

>> y=areacer(3)

mi darebbe errore in quanto per definizione la funzione areacernon ammette variabili output.

La creazione di funzioni

Quando io digito help seguito da il nome della funzione mi compare, come detto in precedenza, una serie di indicazioni circa l’uso della funzione stessa. Come detto queste righe coincidono con le righe di commento che seguono immediatamente la definizione della funzione racchiuse tra %. Per cui se scrivevo:

1- function[]=areacer(r) 2- % serve per calcolare 3- % l’area di un cerchio di raggio r 4- area=pi*r^;

salvando e digitando poi help areacer otterrei la stampa a video delle righe tra %. Attenzione che ogni riga di commento deve iniziare con la %.

La creazione di funzioni

Se abbiamo una funzione con più di 1 output, ad es.

1- function[ac,aq]=areacerq(r) 2- % serve per calcolare 3- % l’area di un cerchio di raggio r 4- % e l’area di un quadrato di lato l=r5- ac=pi*r^2;6- aq=r^2;

quando nel command richiamo la funzione, avendo 2 output devo scrivere

>> [a,b] = areacerq(5)

oppure se mi interessa solo il primo input posso scrivere solo

>> a = areacerq(5)

La creazione di funzioni

Proviamo ora a definire altre funzioni, per esempio in ambito dell’algebra matriciale. Considerata una matrice che presenti elementi solo sulla diagonale principale, il suo determinante per il teorema di Laplace coincide con il prodotto degli elementi sulla diagonale stessa. Per questo, avvalendoci dei comandi diag e prod presenti nel toolbox matematico, possiamo definire una funzione del tipo:

function[dd]=mydd(A)di=diag(A);dd=prod(di);

Quindi estraiamo la diagonale principale e moltiplichiamo gli elementi del vettore di. La funzione non è completamente precisa: dovremmo verificare che la matrice sia quadrata e che sia diagonale! Vedremo come questo sarà possibile con il comando if.

Importazione di dati

Nell’ambito dell’utilizzo di qualsiasi software statistico una necessità è quella di importare dati esterni forniti dall’utilizzatore per analizzarli.Se i dati sono contenuti in un file .txt separati da spazi vuoti è possibile caricarli in MATLAB attraverso il comando loadload, utilizzandolo nel modo seguente:

load + percorso del filee la matrice di dati viene salvata in MATLAB con il nome del file. È poi possibile ridenominarla come una qualsiasi matrice.Se i dati sono contenuti in un file .m salvato nella directory work di MATLAB basta semplicemente digitarne il nome sul commanddi MATLAB che automaticamente lo leggeràPossiamo quindi creare una matrice di dati in un file .m, salvarlo nella directory work affinché questa matrice venga per sempre associata da MATLAB alla variabile.

Esportazione di dati

Il comando savesave salva i dati in un file con estensione .mat nella directory work utilizzandolo nel modo seguente:save + nome del file + nome della variabile da salvare Tale variabile può essere ripresa con il comando load oppure riaprendo il file dalla cartella work.È possibile in alternativa aprire un file, scrivergli sopra e poi richiuderlo con una serie di comandi. Poniamo di voler porre la nostra matrice P di 2 colonne in un file di percorso c:\outp.txt:

nomeint = fopen(‘file.txt’, ‘wt’)dove nomeint è un nome interno che diamo noi (quindi poteva esserci scritto al suo posto qualsiasi altra cosa), fopen è il comando di MATLAB e ‘wt’ sta per to write, perché apriamo il file per scrivergli sopra;fprintf(nomeint, ‘%g %g’, P)dove ogni %g fa salvare la colonna di P, P è la nostra matricefclose(nomeint)per chiudere il file aperto con nome interno nomeint.

Cicli

Molto spesso abbiamo bisogno nell’ambito della programmazione di cicli basati su contatori; si tratta di meccanismi che permettono di indicizzare alcune variabili in modo da creare operazioni per un numero determinato di volte.

Ad esempio, poniamo di avere una matrice e di voler calcolare lamedia di ogni riga, elevarle alla seconda e porle in un vettore. Ci serve un modo per selezionare la prima riga, calcolare la media, elevarla al quadrato e porre il risultato nel primo elemento del vettore; selezionare la seconda riga, calcolare la media, elevarla al quadrato e porre il risultato nel secondo elemento del vettore, etc. Vediamo come fare.

Cicli: for

Il ciclo con il for sfrutta la seguente sintassi:

for i = start:step:stop;……. comandi che contengono i ….end;

Il contatorecontatore è ii e il suo nome non è fisso, è determinato dall’utilizzatore (poteva essere a,b,c,d…). Quando il programma gira succede questo:

1. i parte dal valore start, viene immesso nei comandi in cui i compare, poi i viene incrementato dello step e così via

2. quando si arriva al valore stop il programma si ferma ed esce dal ciclo

Cicli: for

Vediamo in concreto il meccanismo scrivendo il codice di prima. Prima di tutto creiamo un vettore di zeri con tante righe quante quelle della matrice (m) che accoglierà i quadrati delle medie per riga. Poi scriviamo il ciclo:

1. v=zeros(size(m,1),1)2. for k=1:length(v); k va da 1 alla lunghezza di v3. v(k)=mean(m(k,:))^2 nel posto k-esimo la media

della riga k-esima ^24. end;

Quando il loop gira k vale 1, viene immesso nel comando che calcola la media della riga k della matrice, la eleva alla seconda e la pone nel posto k del vettore, poi k viene aumentato di 1 e così via fino a finire le righe.

Cicli: while

Il ciclo con il while usa la seguente sintassi:

p = startwhile p <= stop;……. comandi che contengono p ….p= p+stepend;

il codice precedente sarebbe

1. k=1; k va da 12. While k<= length(v) alla lunghezza di v3. v(k)=mean(m(k,:))^2 nel posto k-esimo la media

della riga k-esima ^24. k=k+1 k lo aumento di 1 alla volta5. End;

Cicli

I cicli for sono generalmente più efficienti dei cicli while, in termini di velocità di calcolo.

Entrambi i tipi di cicli (for e while) possono essere bloccati all’interno con il comando break. Questo comando risulta particolarmente utile utilizzandolo con if (v. dopo). La struttura del ciclo sarebbe del tipo:

for / while

if … (se succede questo)….. (continua il loop e calcola questo)elseif … (se invece succede quest’altro)break (termina il ciclo)

end;

Uso dei cicli

Un uso dei cicli può essere quello di creare una serie storica per cui

yytt=c+=c+ttyytt--11+e+e

dove poniamo c e t scalari ed e~N(0,1). Realizzare questoprocesso con un ciclo è immediato e ovviamente richiede dipredefinire c e theta, la numerosità n e il primo valore, dal qualefar partire la serie.

n=30;v=zeros(n,1);v(1)=2.1;theta=0.6;for i=2:n;

v(i)=v(i-1)*theta+randn(1,1);end;

Uso dei cicli

Va ricordato che nel ciclo il “passo” del contatore non è necessariamente 1 e inoltre può non essere un numero fisso ma collegato ad una variabile; poniamo ad esempio che abbiamo una matrice quadrata di ordine nxm costruita a blocchi, ossia a blocchi quadrati nxn sui quali vogliamo. Pertanto in una matrice 6x6 possiamo identificare 6 sottomatrici 2x2 sulle quali costruire un loop. Poniamo di aver creato con il comando rand una matrice 6x6 di numeri casuali; considerata ora una matrice della stessa dimensione, vogliamo che essa presenti solo i blocchi situati sulla diagonale. Per ottenere questo risultato dobbiamo, come al solito, predeterminare la dimensione della matrice che accoglierà i blocchi sulla diagonale e poi impostare il passo del loop.

Uso dei cicli

Il codice, posto m=3 e n=2 può essere il seguente:n=2;m=3;r=rand((m*n),(m*n));d=zeros((m*n),(m*n));for i=1:n:(m*n);

d(i:i+n-1,i:i+n-1)=r(i:i+n-1,i:i+n-1);end;

Notiamo che la matrice d ha uguali dimensioni di r, e che il passo di i è determinato da n, in quanto devo saltare di n in n per poi considerare le sottomatrici nxn.

Uso dei cicli

Proviamo ora in modo analogo a costruire un codice che trasferisca tutti i blocchi usando un doppio loop:n=2;m=3;c=rand((m*n),(m*n));z=zeros((m*n),(m*n));for i=1:n:(m*n);

for k=1:n:(n*m);z(i:i+n-1,k:k+n-1)=c(i:i+n-1,k:k+n-1)

end;end;Nel caso di doppio loop il programma esegue prima il loop interno e finito il ciclo aggiorna il loop esterno e quindi riinizia con il loop interno. Questo significa che l’ordine con il quale MATLAB attribuisce i valori a i (contatore che agisce sulle righe) e k (contatore che agisce sulle colonne) è:

Uso dei cicli

i=1;k=1;

i=1;k=3=1+n;

i=1;k=5=1+n+n;

i=3=1+n;k=1;

i=3=1+n;k=3=1+n;

i=3=1+n;k=5=1+n+n;

i=5=1+n+n;k=1;

i=5=1+n+n;k=3=1+n;

i=5=1+n+n;k=5=1+n+n;

Uso dei cicli

Quindi inizia il ciclo delle righe, si esaurisce il ciclo delle colonne, si aggiorna il ciclo delle righe, …

Supponiamo ora di volerci cimentare in un loop più complesso: presa una matrice casuale quadrata di ordine n*m, poniamo di voler trasportare su di un’altra matrice i blocchi della prima presi in senso antiorario, e quindi vogliamo che l’ultima sottomatrice2x2 diventi la prima nella nuova matrice e così via.

Il grado di complessità risiede solamente nel modificare gli elementi presi in considerazione:

Uso dei cicli

n=2;m=3;t=rand((m*n),(m*n));g=zeros((m*n),(m*n));for i=1:n:(m*n);

for k=1:n:(n*m);g(i:i+n-1,k:k+n-1)=t((m*n)-i:(m*n)-i+1,(m*n)-k:(m*n)-k+1);end;

end;

A differenza del loop precedente ora gli indici degli elementi presi delle due matrici sono differenti! Ovviamente consideriamo sempre sottomatrici quadrate, ma a sx partiamo dall’ultima sottomatricementre a dx partiamo dalla prima!

Cicli

I cicli for sono generalmente più efficienti dei cicli while, in termini di velocità di calcolo.

Entrambi i tipi di cicli (for e while) possono essere bloccati all’interno con il comando break. Questo comando risulta particolarmente utile utilizzandolo con if (v. dopo). La struttura del ciclo sarebbe del tipo:

for / while

if … (se succede questo)….. (continua il loop e calcola questo)elseif … (se invece succede quest’altro)break (termina il ciclo)

end;

If statement

Il comando if valuta quando una certa condizione è vera e in tal caso esegue il comando. La struttura del comando è:

if (se) …… (succede questo)…. (fai questo)elseif (se invece) …. (succede quest’altro)…. (fai questo)elseif (se invece) …. (succede quest’altro)…. (fai questo)….else (se non è successo niente delle precedenti cose)…. (fai questo)end

If statement

I comandi if ed end (che termina l’if) devono necessariamente esserci, elseif ed else possono o meno esserci.

Facciamo un esempio. Possiamo scrivere un codice che mi dia come output la parola “quadrata” se una matrice è nxn, la parola “rettangolare” se la matrice è rxc, con r diverso da c.Riprendendo la struttura di prima e considerando che una matrice o è quadrata o è rettangolare (per cui posso usare else)la struttura (non il codice!) è la seguente:

if n° righe di A = n° colonne di Astampa a video “quadrata”elsestampa a video “rettangolare”end

If statement

Associando al codice una funzione che chiamo cm (da checkmatrix) potrebbe essere

function[] = cm(A);if size(A,1) == size(A,2);‘quadrata’else;‘rettangolare’end

Relazioni logiche

Nell’uso di if risultano di fondamentale utilizzo i comandi che permettono di stabilire relazioni logiche (maggiore di, minore di e eguale a). L’output di questi comandi è sempre costituito da numeri, vettori o matrici logiche, ossia composti da zeri ed uno:

Lo zero compare quando la relazione non è rispettataL’uno compare se la relazione è rispettata.

I simboli da utilizzare sono:== uguale~= diverso< minore> maggiore<= minore o uguale> maggiore o uguale

Relazioni logiche

Così se scriviamo>> 5 > 3la risposta è 1,>> 4 ~= 2la risposta è 1, etc.

Diversi sono invece i connettivi logici, ossia operatori che collegano due espressioni, che sono:

and (e anche) &

or (oppure) |

not (non) ~

Relazioni logiche

Nell’ambito delle relazioni logiche e dell’algebra delle matrici, due comandi risultano molto utilizzati:

Il comando find(..), applicato ad una matrice/vettore, fornisce la posizione degli elementi della matrice/vettore che soddisfano la condizione tra parentesi. Ad es.:>> B = randn(10,4);>> v = find(B>0.3);v è il vettore contenente la posizione (quindi non è un vettore logico!!) degli elementi >0.3. se applicato a matrici gli indiciscorrono in verticale, nel senso che il numero 2 è associato all’elemento a2,1. Se non è indicata alcuna relazione logica ma solo la matrice, fornisce la posizione degli elementi diversi da zero.

Relazioni logiche

Il comando any(..), applicato ad un vettore, fornisce 1 se qualche (almeno un) elemento del vettore è diverso da zero, e quindi fornisce zero solo se tutti gli elementi del vettore sono nulli. Applicato ad una matrice fornisce un vettore con tanti elementi quanti i vettori colonna della matrice, con 1 se la colonna ha almeno un elemento diverso da zero e 0 se ha tutti elementi diversi da zero. Specificando any(matrice,k) la funzione lavora solo sulla k-esima riga.

Relazioni logiche

L’utilità di questi operatori è grande nell’ambito matriciale e con l’if. Ad esempio se ci stiamo chiedendo se gli elementi di una matrice A siano o meno maggiori di 0.5, digitando>> A>0.5otteniamo una matrice logica di zeri ed uno, in cui l’1 è associato a elementi > di 0.5. Se volessimo da una matrice ottenere solo gli elementi > di 0.5 basta fare>> A(A>0.5)In tal modo prima otteniamo la matrice logica, poi selezioniamo di A solo gli elementi cui è associato 1. Otteniamo così un vettore con tutti e soli gli elementi che rispettano la condizione.

Relazioni logiche

Un altro esempio. Poniamo di voler considerare di una matrice B

0.03 0.05 0.070.5 0.23 0.250.02 0.01 0.290.45 0.58 0.15

e di chiedere al programma di stampare a video quanti elementi sono compresi tra 0.2 e 0.3. Possiamo vedere il risultato confrontando due codici: uno che utilizza solo i connettivi logici, un altro che usa anche i loop.

Relazioni logiche

Il primo codice è brevissimo:

function[j]=mc(a);b=a(a>0.2 & a<0.3);j=length(b);

vengono selezionati gli elementi della matrice che siano maggiori di 0.2 e anche minori di 0.3 (quindi compresi tra 0.2 e0.3), e poi si estraggono da A i corrispondenti elementi, che vengono posti in un vettore b. Dopodiché ne calcolo la lunghezza, che coincide con il numero di elementi che soddisfano la condizione.

Un codice con loop e if sarebbe il seguente, ma rispetto al primo è molto più lungo e quindi inefficace:

Relazioni logiche

function[b]=mc2(A);b=0;for i=1:size(A,1);

for j=1:size(A,2)if A(i,j)>0.2 & A(i,j)<0.3;

b=b+1;end

endEnd

Un modo per valutare la velocità computazionale in termini di tempo di una funzione è scrivere nel command

tic , (funzione) , toc

Relazioni logiche

Provando a creare una matrice A=rand(100,200) e applicando le due funzioni troverete che la prima funzione è decisamente più veloce.

>> tic, mc(a), tocans =2029elapsed_time =0.0500

>> tic, mc2(a), tocans =2029elapsed_time =0.2200

Trimr

Gauss, tra le altre, fornisce una preziosissima funzione che risulta di estrema utilità nell’ambito matriciale. Questa funzione, chiamata trimr(x,t,b), considerata una matrice x, restituisce una matrice ottenuta tagliando da x le prime t righe e le ultime b righe.

In MATLAB questa funzione non è implementata, e costituisce quindi un utile esercizio scriverne il codice tenendo in considerazione che la funzione deve dare un messaggio di errore qualora si stia “trimmando” troppo. Il codice potrebbe dunque essere il seguente:

Trimr

function [y]= mytrim(x,a,b);if (a>size(x,1) | b>size(x,1) | (a+b)>size(x,1));

y=' trim too much ';else;

y=x((a+1):(size(x,1)-b),:);end;

L’eccesso di trim può avvenire se a o b sono > del totale dellerighe di x, o se lo è la loro somma. Notiamo l’uso di | tra le singole condizioni e il comando x((a+1):(size(x,1)-b),:), cheseleziona tutte le righe di x da a+1 fino alla riga = n° righe – b.

Lag

Un’altra funzione utilissima nell’ambito dell’analisi delle serie storiche è la funzione presente in Gauss come lagn(x,k), che ripropone in linguaggio di programmazione l’operatore lag (L). Se k è positivo, l’operatore restituisce una matrice della stessa lunghezza (come righe) di x in cui la prima riga è quella che occupava il posto k+1 in x e le ultime k righe sono missingvalues (ossia dati mancanti, indicati in Gauss con un punto). Abbiamo così tagliato le prime k osservazioni, “spostando” la matrice x in alto di k righe.Se k è negativo, l’operatore restituisce una matrice della stessa lunghezza (come righe) di x in cui le prime k righe sono missingvalues, la riga di posto k+1 coincide con la prima riga di x e quindi le ultime k righe di x vengono perse.Vediamone in concreto l’utilità. Possiamo di voler stimare un modello di regressione del tipo AR(2):

Lag

yytt=a+b=a+b11yytt--11+b+b22yytt--22+e+e

Senza scendere nei particolari, diciamo che vogliamo capire come i valori ritardati di 1 e 2 periodi influenzano la variabile al tempo corrente. Ovviamente se abbiamo una serie storica di t=100 osservazioni, di queste possiamo sfruttarne solo 98, perché alpiù partiamo dalla terza e la regrediamo sulla seconda e sulla prima, la quarta su terza e seconda e così via.

In MATLAB i missing values si indicano con NaN= not a number.

Proviamo ora a scrivere questa funzione in MATLAB, con l’avvertenza di predisporre un messaggio di errore se stiamo “laggando” troppo, e distinguere tra k>0 e k<0:

Trimr

function [y]= mylag(x,k);if abs(k)>size(x,1);

y=' trim too much ';elseif k>0;

y=[x((k+1):size(x,1),:) ; NaN*ones(k,size(x,2))];elseif k<0;

y=[NaN*ones(abs(k),size(x,2)) ; x(1:(size(x,1) - abs(k)),:)];end;

Notiamo che y ha sempre la stessa lunghezza di x, in quantoconcatenazione verticale tra un vettore lungo k e tante righe dix quante il numero delle sue righe meno k. Attenzione cheDove k è <0 dobbiamo utilizzare abs(k)!!!!

Trimr e lag

Se, per calcolare gli stimatori della regressione o ad es. una semplice matrice di covarianza, ho la necessità di creare una matrice che raccolga i valori della variabile, i ritardi fino all’ordine 2 ma ovviamente non voglio lavorare con missing values, posso combinare le due funzioni appena viste sul vettore x che contiene la serie storica in questo modo:

posso formare una matrice con lag

y=[x mylag(x,-1) mylag(x,-2)]

e poi trimmare le prime 2 righe che sicuramente contengono missing values, essendomi spostato in basso (k=-1 e -2):

z=mytrim(y,2,0)

z (1,1) sarà il terzo valore della serie storica di x, z(1,2) ilsecondo valore e z(1,3) il primo valore della serie storica!.

Trimr e lag

Possiamo estendere utilmente il meccanismo di generazione di suddetta matrice con un loop for, il cui indicatore sarà ovviamente collegato all’ordine k dei ritardi che vogliamo inserire. È preferibile racchiudere il tutto in una funzione, i cui input saranno: il vettore e il numero di ritardi. L’output di detta funzione sarà costituito dalla matrice la cui prima colonna saràcostituita dai valori di x dal k-esimo fino all’ultimo.

La funzione che chiamiamo essr (estrazione serie storica ritardata) può essere scritta così:

Trimr e lag

function [y]=essr(x,k);

if k<0;y='errore, k non può essere negativo';

elseif k> size(x,1);y='errore, k non può eccedere il numero di righe di x';

else;y=[x zeros(size(x,1),k)]; creo a priori yfor i=1:k;y(:,i+1)=mylag(x,-i);end;y=mytrim(y,k,0); trimmo alla fine del loop altrimenti

end; non coincidono le lunghezze dei vettori!

Altre funzioni create

Altri esempi di funzioni

vcma per la matrice di varcov di un MA(1)rendc per calcolare i rendimenti semplicirendsc per calcolare i rendimenti semplici e continuiestdi per estrarre la diagonale inferiore di una matrice quadratasimm per vedere se la matrice è o meno simmetrica

La creazione di grafici

MATLAB è molto completo anche per quello che riguarda la creazione di grafici. Il comando per grafici in bidimensionale èplotplot:

Se x è un vettore, plot(x) lo stampa a video in ordinata (Y) il valore degli elementi e in ascissa (X) l’indice (1,2,3,..) dellaloro posizione nel vettore.Se x e y sono due vettori, plot(x,y) stampa a video in ordinata (Y) il valore degli elementi di y e in ascissa (X) il valore degli elementi di x.

Nel caso di grafici multipli, MATLAB usa di default colori diversi:plot(x,y,x,z)

stampa sulla stessa finestra prima x e y poi x e z, con colori diversi.

La creazione di grafici

Possiamo definire a piacere il tipo di linea in 3 caratteristiche:plot(x,y,’puntatore-stile-colore’)

Quanto ai coloric cyanom magentay giallor rossog verdeb bluw biancok nero

Quanto agli stili di linea- linea continua-- linea tratteggiata: Puntini-. Punti + tratteggionone senza linea

La creazione di grafici

Quanto ai puntatori abbiamo +,o,*,x

Quindi per tracciare un grafico di colore blu, a linea tratteggiata e con puntatore * scriviamo

plot(x,y,’b--*’)

Se abbiamo tracciato un grafico su di una finestra e vogliamo ora stampargliene sopra un altro, dobbiamo mantenere aperta la finestra con il comando hold on. Es.

>> plot(x,y)>> hold on >> plot (x,z)

La creazione di grafici

Se invece vogliamo suddividere la finestra in più celle sulle quali vengono stampati diversi grafici, il comando appropriato è subplot(r,c,i). Questo comando suddivide la finestra in una “matrice” rxc e di essa ne seleziona la cella i – esima.

Ad es. possiamo creare una sequenza molto fitta di valori che vada da 0 a 2 pigreco con incrementi di 0.1, tracciare sulla prima finestra il coseno, sulla seconda il seno, sulla terza la tangente e sulla quarta la cotangente usando puntatori, colori estili di linea diversi per ogni sottofinestra con i comandi appena visti e il comando subplot. Possiamo addirittura creare una funzione che chiamiamo mytrig, nel modo seguente:

NB: se non ricordo i comandi per le funzioni trigonometriche posso digitare help, poi osservo e digito help matlab\elfun

La creazione di grafici

Creiamo prima di tutto la funzione nell’edit:

function[]= mytrig(s)co=cos(s);se=sin(s);t=tan(s);ct=cot(s);subplot(2,2,1)plot(s,co,'y:+')subplot(2,2,2)plot(s,se,'b-*')subplot(2,2,3)plot(s,t,'k--x')subplot(2,2,4)plot(s,ct,'m:o')

La creazione di grafici

Dopodiché andiamo nel command, creiamo la nostra sequenza come vettore colonna e applichiamo la funzione:

>> k=0:0.1:2*pi;>> mytrig(k)

Il programma gira ma fornisce anche un messaggio di errore. Questo perché le funzioni tangente e cotangente hanno alcuni punti in cui non possono essere calcolate!!!

Digitando alla fine della funzione

print –dbmp16m fig.bmp

salvo la figura con il nome fig ed estensione .bmp (posso anche porre .gif o .jpeg) nella cartella work.

La creazione di grafici

Altri comandi per caratterizzare il grafico sono:

axis([min xmax ymin ymax])axis squareaxis auto

rispettivamente per definire la lunghezza degli assi, renderla uguale o lasciare quella automatica;

xlabel(‘…’)ylabel(‘…’)title(‘…’)

rispettivamente per dare un nome all’asse x, all’asse y o al titolo del grafico;

La creazione di grafici

La funzione

text(x,y,’…’)

inserisce invece un testo nel grafico che inizia in corrispondenza della coordinata (x,y)

Polinomi, integrazione e ottimizzazione

Polinomi

Nell’ambito dell’algebra dei polinomi, alcune funzioni possono risultare di una certa utilità.

La funzione roots funziona roots(v), dove v è un vettore con i coefficienti della incognita, dal termine di più alto grado al termine noto, ed estrae le radici del polinomio. Ad esempio se abbiamo il polinomio x5-x4-7x3+7x2+12x-12 e vogliamo trovarne le radici, ossia i valori di x che la azzerano, dobbiamo scrivere

roots([1 -1 -7 7 12 -12])

e MATLAB calcola tutte le radici, reali o complesse che siano. NB1: nel caso non vi sia un termine va posto zero!!NB2: l’ultimo è il termine noto.

Polinomi

La funzione polyval funziona polyval(v,k), dove v è un vettore con i coefficienti della incognita, dal termine di più alto grado altermine noto, k è un numero e calcola il polinomio in corrispondenza di k (ossia sostituisce x=k). Ad esempio se abbiamo il polinomio -3x4-2x3+6x2+2x-1 e vogliamo calcolarlo in x=-1, dobbiamo scrivere

polyval([-3 -2 6 2 -1],-1)

e MATLAB restituisce 2.

Polinomi

La moltiplicazione tra due polinomi, indicati sempre attraverso i vettori contenenti i coefficienti, avviene con il comando conv; se moltiplico x3-2 per x2+3x-5 devo fare:

x=[1 0 0 -2];y=[1 3 -5];z=conv(x,y);

e MATLAB restituisce 1 3 -5 -2 -6 10, ossia il polinomio (ovviamente di 5° grado) x5+3x4-5x3-2x2+6x+10.La divisione tra due polinomi, indicati sempre attraverso i vettori contenenti i coefficienti, avviene con il comando deconv,che funziona come conv e dà anche un vettore con l’eventuale resto.

Integrazione numerica

Per quanto riguarda l’integrazione numerica in 2 variabili, il valore di un integrale definito del tipo

dove f:R=> R, ossia funzione reale di variabile reale, può essere calcolato con la funzione quad8, dove quad sta per formula di quadratura, ossia di integrazione numerica. Per integrare una funzione va usato il comando inline, che introduce una variabile nel command senza passare dall’edit. Se vogliamo quindi calcolare

∫b

a

dxxf )(

∫ −π

0

3 )2cos( dxxe x

Integrazione numerica

definiamo la funzione e la calcoliamo nel modo seguente

>> f=inline(‘exp(-3*x).*cos(2*x)’);>> quad8(f,0,π);

e MATLAB calcola 0.2308. Notiamo che:La funzione inline riconosce x come variabile e vuole il suo argomento (la funzione) tra ‘;La funzione quad8 funziona quad8(funzione, estremo inf, estremo sup)

Matlab integra fino ad un massimo di 3 variabili (funzione dblquad; per più di 3 variabili dobbiamo ricorrere alla simulazione numerica (Monte Carlo).

Ottimizzazione non vincolata

Per risolvere un problema di ottimizzazione non vincolataottimizzazione non vincolata (max o min) e quindi di programmazione lineareprogrammazione lineare del tipo

max f(x) oppure min f(x)x x

possiamo utilizzare 2 funzioni:

- fminsearch, che sfrutta una variante del metodo del simplesso

- fminunc, che sfrutta il calcolo del gradiente.

Ottimizzazione non vincolata

Definita una inline function che contenga la funzione obiettivo:

g(x)=(x1+3)2 + (x2-2)2

possiamo calcolare il minimo della funzione (per calcolare il maxbasta fare min(-g(x)) ) digitando:

>> f=inline('(x+3)^2 + (x(2)-2)^2');>> s1= fminsearch(f,[1 1]);>> s2 = fminunc(f,[1 1]);

dove [1,1] è un punto iniziale dal quale far partire l’algoritmo. MATLAB fornisce la soluzione. Non sempre è detto che le due soluzioni coincidono, dipende dalla forma del gradiente!

Ottimizzazione vincolata

Per risolvere un problema di ottimizzazione vincolata di ottimizzazione vincolata di 1°grado1°grado, ossia di programmazione lineare del tipo

dove c’x è la funzione obiettivo, utilizziamo il comando linprog. Questo considera un problema di minimizzazione, per cui la massimizzazione si ottiene sempre facendo min(-f(x)).

⎪⎪⎩

⎪⎪⎨

≤≤=≤

⎪⎪⎩

⎪⎪⎨

≤≤=≤

sxi bAx

' min

oppure

sxi bAx

' max

bAxsubxc

bAxsubxc

Ottimizzazione vincolata

Linprog funziona:

X=LINPROG(c,A,b,Aeq,Beq,LB,UB,X0,OPTIONS), dove:

c è il vettore dei pesi delle variabiliA è la matrice in Ax<bb è il vettore in Ax<bAeq è la matrice in Ax=bbeq è il vettore in Ax<blb è l’estremo inferiore dell’intervallo di xub è l’estremo superiore dell’intervallo di xX0 è il punto di partenza dell’algoritmooptions => v. optimset functions

Ottimizzazione vincolata

Dovendo risolvere il problema

impostiamo con linprog:

>> s=linprog([2 -3],[1 1],3,[],[],[0]);

dove le parentesi vuote indicano che quel tipo di vincolo non è presente. Un solo zero in quanto è solo x1 ad essere vincolata.

⎪⎩

⎪⎨

≤+

0

3x

32 min

1

1

1

2

2

xxsub

xx

Ottimizzazione vincolata

Per risolvere un problema di ottimizzazione vincolata di ottimizzazione vincolata di 2°grado2°grado, ossia di programmazione quadratica del tipo

dove (x’Hx)/2+c’x è la funzione obiettivo, utilizziamo il comando quadprog. Questo considera un problema di minimizzazione, la massimizzazione si ottiene sempre facendo min(-f(x)).

⎪⎪

⎪⎪

≤≤=≤

+

⎪⎪

⎪⎪

≤≤=≤

+

sxi bAx

''21 min

oppure

sxi bAx

''21 max

bAxsub

xcHxx

bAxsub

xcHxx

Ottimizzazione vincolata

quadprog funziona:

x=quadprog(H,f,A,b,Aeq,beq,LB,UB) dove:

H è la matrice dei pesi nella forma quadraticac è il vettore dei pesi delle variabili di 1° gradoA è la matrice in Ax<bb è il vettore in Ax<bAeq è la matrice in Ax=bbeq è il vettore in Ax<blb è l’estremo inferiore dell’intervallo di xub è l’estremo superiore dell’intervallo di x

Ottimizzazione vincolata

Dovendo risolvere il problema

impostiamo con quadprog i singoli elementi del problema di ottimizzazione:

⎪⎪

⎪⎪

=+≥

−+−

42 0

0

33 min

2

2

2122

1

1

1

2

xxxxsub

xxxx

Ottimizzazione vincolata

>> H = [2 0 ; 0 6];>> c = [3 -1];>> Aeq=[1 2];>> beq=4;>> lb=[0 0];>> x = quadprog(H,c,[],[], Aeq,beq,lb)

Il risultato è x =0.28571.3571

Soluzione di equazioni non lineari

Talvolta siamo di fronte ad equazioni non lineari, ossia equazioni che non possono essere invertite per esprimere la x in funzione di altre variabili. Es. se so che y = 3x+e1-x, ovviamente non possiamo invertire questa relazione e scrivere x=… per cui dobbiamo ricorrere a metodi numerici che facciano dei “tentativi” fino a che non troviamo il valore di x. Ad es. se sappiamo che y=3, possiamo trovare il valore di x che rende y=3 (ossia lo zero della funzione) con il comando fzero. La funzione di cui stiamo cercando lo zero può essere introdotta con un m-file o con un comando inline. Poiché noi stiamo cercando lo zero, dovremo scrivere la funzione come y-3, perché è di questa che cerchiamo lo zero!!

Soluzione di equazioni non lineari

Quindi il codice in MATLAB può essere il seguente:

>> f=inline(‘3*x+exp(1-x)-3’);>> fzero(f,2)

dove 2 è un numero dal quale faccio partire l’algoritmo (initialguess), che è basato su una variante del metodo di bisezione. Il risultato è: 0.3809. In corrispondenza di tale valore di x la y vale 3.

Fine introduzione

Grazie ☺