Sei sulla pagina 1di 25

Facolt` a di Economia

Introduzione a MatLab
Esercizi sulla creazione di functions
Appunti per il corso di Metodi Computazionali per le Scelte Economiche Anno Accademico 2005/2006
Riccardo Cambini
Dipartimento di Statistica e Matematica Applicata allEconomia Facolt` a di Economia, Universit` a di Pisa, Via Cosimo Ridol 10, 56124 Pisa, ITALY E-mail: cambric@ec.unipi.it

Marzo 2006

Testo degli Esercizi

I seguenti esercizi sono semplici esempi di come ` e possibile svolgere elaborazioni ed analisi di dati utilizzando il software MatLab, i suoi principali comandi di programmazione, le sue functions salvate in M-les. Questi esercizi devono essere risolti scrivendo delle functions MatLab (ovviamente ciascuna in un diverso M-le) che svolgano sui dati in ingresso (input) le elaborazioni indicate e che restituiscano il risultato (output) richiesto. Si ricorda al riguardo che ogni esercizio pu` o essere risolto in diversi modi e che allinterno di una function si pu` o utilizzare unaltra function precedentemente creata. Gruppo 1 - Esercizi Base 1) Dato un vettore b si determini il numero delle sue componenti negative. 2) Dato un vettore b si determini il numero delle sue componenti negative, delle sue componenti positive, di quelle nulle.

3) Dato un vettore b si determini se esso ha o meno componenti negative. 4) Dato un vettore b si determini la posizione della sua massima componente. 5) Dato un vettore b si determini la posizione della sua massima componente e la posizione della sua minima componente. 6) Dato un vettore b si scambino di posto la sua massima componente e la sua minima componente. 7) Dato un vettore b restituire la somma dei suoi soli elementi positivi. 8) Dati due vettori a e b vericare che abbiano la stessa lunghezza, successivamente determinare il numero delle componenti di a maggiori delle corrispondenti componenti di b. 9) Data una matrice A, vericare che essa sia quadrata e restituire il massimo valore presente sulla diagonale principale. Gruppo 2 - Esercizi Facili 1) Data una matrice A, vericare che essa sia quadrata e restituire i determinanti delle sue sottomatrici principali di guida 2) Date due matrici A = (aij ) e B = (bij ), vericare che esse abbiano la stessa dimensione, successivamente restituire come risultato una matrice C = (cij ) tale che: cij = aij 0 se aij = bij se aij = bij

3) Date due matrici A = (aij ) e B = (bij ), vericare che esse abbiano la stessa dimensione, successivamente restituire come risultato una matrice C = (cij ) tale che: cij =
0

4) Data una matrice reale A fornirne il numero di elementi positivi, negativi e nulli. 5) Data una matrice reale quadrata A = (aij ) fornirne la corrispondente matrice simmetrica B = (bij ) tale che bij = aij per i j . 6) Data una matrice A, se ne moltiplichino gli elementi positivi per 100 e se ne dividano per due gli elementi negativi. 2

se aij = bij 1 se aij > bij 1 se a < b ij ij

7) Data una matrice reale A fornire per ogni sua riga la somma dei soli elementi positivi. Gruppo 3 - Esercizi Intermedi 1) Data una matrice A determinare il massimo elemento di ogni sua riga e fornire poi come output la somma dei massimi trovati. 2) Date due matrici A e B vericare che abbiano lo stesso numero di righe, che la matrice [A|B ] ottenuta concatenando le due matrici sia quadrata e invertibile e fornire come output la matrice inversa di [A|B ]. 3) Dati un vettore b ed una matrice A vericare se almeno un elemento di b ` e anche elemento di A. 4) Dati un vettore b ed una matrice A vericare se tutti gli elementi di b sono anche elementi di A. 5) Data una matrice reale quadrata A determinare per ogni i-esima colonna di A il suo massimo valore e sostituire con esso li-esimo elemento principale. 6) Data una matrice reale quadrata A determinare per ogni i-esima colonna di A il suo massimo valore e scambiarlo con li-esimo elemento principale. 7) Data una matrice A = (aij ) si individui la posizione (riga e colonna) del massimo elemento aij di A. 8) Data una matrice A = (aij ) si individuino le posizioni (riga e colonna) del massimo elemento e del minimo elemento di A. 9) Data una matrice reale A cercare in ogni sua colonna il massimo ed il minimo valore e scambiarli di posto. 10) Data una matrice A restituire per ogni sua riga il valore della componente negativa di indice pi` u basso; restituire il valore 1 per le righe non aventi alcun elemento negativo. 11) Sia data una matrice A a valori reali; per ogni riga di A se ne scorrano gli elementi sino al primo valore negativo, moltiplicando contestualmente per 100 gli elementi pi` u grandi di 10.

Gruppo 4 - Esercizi applicativi di tipo economico 1) [Stima del raggio spettrale] Data una matrice quadrata A = (aij ) nn vale la seguente stima del suo raggio spettrale (A): max
n

|det(A)| ,

|tr(A)| n

(A) min { rmax , cmax }

dove det(A) ` e il determinante di A, tr(A) ` e la traccia di A (ovvero la somma dei suoi elementi principali) ed inoltre: rmax = max {ri }
i=1,...,n n

cmax = max {cj }


j =1,...,n n

ri =
j =1

|aij | i = 1, . . . , n

cj =
i=1

|aij | j = 1, . . . , n

Scrivere una function MatLab che determina la stima sopra indicata dopo aver vericato che A ` e una matrice quadrata. 2) [Criteri di Brauer-Solow generalizzati] Data una matrice quadrata A = (aij ) nn a valori nonnegativi vale la seguente stima del suo autovalore dominante A : max { rmin , cmin , pmax } A min { rmax , cmax } dove pmax = maxi=1,...,n {aii } ed inoltre: rmax = max {ri }
i=1,...,n i=1,...,n

cmax = max {cj }


j =1,...,n

rmin = min {ri }


n

cmin = min {cj }


j =1,...,n n

ri =
j =1

aij

i = 1, . . . , n

cj =
i=1

aij

j = 1, . . . , n

Scrivere una function MatLab che determina la stima sopra indicata dopo aver vericato che A ` e una matrice quadrata a valori nonnegativi. 3) [Condizione di Hawkins-Simon] Sia data una M-matrice M nn , ovvero una matrice quadrata della forma M = (I C ) con > 0 e C matrice a valori nonnegativi. Risulta C < se e solo se ` e vericata la seguente condizione (nota come condizione di Hawkins-Simon): i determinanti delle sottomatrici principali di testa di M sono positivi. Scrivere una function MatLab che verica la condizione di HawkinsSimon dopo aver controllato che M sia una M-matrice (ovvero che > 0 e che C ` e una matrice quadrata a valori nonnegativi).

Gruppo 5 - Esercizi applicativi di area mercati nanziari Dora in avanti i dati in ingresso (input) verranno rappresentati con una matrice A = (aij ) mn contenente le quotazioni per una certa nestra temporale relative ad un determinato portafoglio di titoli azionari. In particolare, la matrice ha tante righe quante sono le date (i giorni) di cui si hanno a disposizione le quotazioni, ha inoltre tante colonne quanti sono i titoli azionari considerati. Ad ogni riga corrisponde una data ed ad ogni colonna corrisponde un titolo azionario, di conseguenza lelemento generico aij della matrice A indica la quotazione del titolo j nel giorno i. Si svolgano sui dati in ingresso (input) le elaborazioni di seguito elencate: 1) eliminare la prima e lultima data, il primo e lultimo titolo azionario, invertire lordine dei titoli azionari ed invertire lordine delle date; 2) determinare, per ogni singolo titolo azionario, il numero di rialzi della quotazione avvenuti relativamente ai dati storici forniti da A; 3) dato un titolo azionario j determinare le date (indici di riga) in cui si sono avute rispettivamente la massima e la minima quotazione; 4) per ogni titolo azionario determinare le date (indici di riga) in cui si sono avute rispettivamente la massima e la minima quotazione; 5) dato un titolo azionario j determinare le date (indici di riga) in cui si sono avute rispettivamente la massima e la minima variazione della quotazione (variazioni positive indicheranno dei rialzi, variazioni negative dei ribassi); 6) utilizzare la function scritta per il precedente esercizio 5) al ne di determinare il titolo azionario che ha avuto, relativamente ai dati storici forniti da A, la massima variazione della quotazione e quello che ha avuto la minima variazione; indicare inoltre i giorni in cui si sono avute tali variazioni e le rispettive entit` a; 7) dato un giorno i determinare i titoli azionari (indici di colonna) per i quali si sono avute rispettivamente la massima e la minima variazione della quotazione; 8) utilizzare le function scritte per i precedenti esercizi 5) e 7) al ne di determinare, in corrispondenza del giorno in cui di un dato titolo azionario j ha avuto la sua massima variazione, il titolo che ha avuto la minima variazione e lentit` a di tale variazione.

2
2.1

Soluzioni esercizi
Esercizi gruppo 1

Esercizio 1
function ris=es1g1(b) lb=length(b); negative=0; for i=1:lb if b(i)<0 negative=negative+1; end end ris=negative; % % % % % lunghezza del vettore inizializzazione contatore ciclo per scorrere il vettore verifica negativita componente i-esima incremento contatore componente negativa

% risultato della function

Esercizio 2
function ris=es2g1(b) lb=length(b); negative=0; positive=0; nulle=0; for i=1:lb if b(i)<0 negative=negative+1; elseif b(i)>0 positive=positive+1; else nulle=nulle+1; end end ris=[negative positive nulle]; % % % % % % % % % lunghezza del vettore inizializzazione contatore negative inizializzazione contatore positive inizializzazione contatore nulle ciclo per scorrere il vettore verifica negativita componente i-esima incremento contatore componente negativa verifica positivita componente i-esima incremento contatore componente positiva

% incremento contatore componente nulla

% risultato della function

Esercizio 3
function ris=es3g1(b) lb=length(b); trovatonegativo=0; for i=1:lb if b(i)<0 trovatonegativo=1; break end end ris=trovatonegativo; % % % % % % % lunghezza del vettore inizializzazione flag ciclo per scorrere il vettore verifica negativita componente i-esima settaggio flag presenza comp. negative opzionale, trovata una componente negativa tanto vale interrompere il ciclo for

% risultato della function

Esercizio 4
function ris=es4g1(b) lb=length(b); % lunghezza del vettore

posizmaxtemp=1; valmaxtemp=b(1); for i=2:lb if b(i)>valmaxtemp valmaxtemp=b(i); posizmaxtemp=i; end end ris=posizmaxtemp;

% % % % % %

inizializzazione posizione max temporaneo inizializzazione valore max temporaneo ciclo per scorrere il resto del vettore verifica presenza componente piu grande aggiornamento valore max temporaneo aggiornamento posizione max temporaneo

% risultato della function

Esercizio 5
function ris=es5g1(b) lb=length(b); % lunghezza del vettore posizmaxtemp=1; % inizializzazione posizione max temporaneo valmaxtemp=b(1); % inizializzazione valore max temporaneo posizmintemp=1; % inizializzazione posizione min temporaneo valmintemp=b(1); % inizializzazione valore min temporaneo for i=2:lb % ciclo per scorrere il resto del vettore if b(i)>valmaxtemp % verifica presenza comp. piu grande del max valmaxtemp=b(i); % aggiornamento valore max temporaneo posizmaxtemp=i; % aggiornamento posizione max temporaneo elseif b(i)<valmintemp % verifica presenza comp. piu piccola del min valmintemp=b(i); % aggiornamento valore min temporaneo posizmintemp=i; % aggiornamento posizione min temporaneo end end ris=[posizmintemp posizmaxtemp]; % risultato della function

Esercizio 6
function ris=es6g1(b) lb=length(b); posizmaxtemp=1; valmaxtemp=b(1); posizmintemp=1; valmintemp=b(1); for i=2:lb if b(i)>valmaxtemp valmaxtemp=b(i); posizmaxtemp=i; elseif b(i)<valmintemp valmintemp=b(i); posizmintemp=i; end end b(posizmintemp)=valmaxtemp; b(posizmaxtemp)=valmintemp; ris=b; % % % % % % % % % % % % lunghezza del vettore inizializzazione posizione max temporaneo inizializzazione valore max temporaneo inizializzazione posizione min temporaneo inizializzazione valore min temporaneo ciclo per scorrere il resto del vettore verifica presenza comp. piu grande del max aggiornamento valore max temporaneo aggiornamento posizione max temporaneo verifica presenza comp. piu piccola del min aggiornamento valore min temporaneo aggiornamento posizione min temporaneo

% valore max al posto di quello minimo % valore min al posto di quello massimo % risultato della function

Esercizio 7
function ris=es7g1(b) lb=length(b); somma=0; for i=1:lb if b(i)>0 somma=somma+b(i); end end ris=somma; % % % % % lunghezza del vettore inizializzazione accumulatore ciclo per scorrere il vettore verifica positivita componente i-esima aggiornamento dellaccumulatore

% risultato della function

Esercizio 8
function ris=es8g1(a,b) la=length(a); % lunghezza del vettore a lb=length(b); % lunghezza del vettore b num=0; % inizializzazione contatore if not(la==lb) % controllo uguale lunghezza ris=i due vettori hanno lunghezza diversa; else for i=1:la % ciclo per scorrere i vettori if a(i)>b(i) % verifica condizione num=num+1; % aggiornamento del contatore end end ris=num; % risultato della function end

Esercizio 9
function ris=es9g1(A) [rA,cA]=size(A); if not(rA==cA) ris=matrice non quadrata; else maxval=A(1,1); for i=2:rA if A(i,i)>maxval maxval=A(i,i); end end ris=maxval; end % dimensione della matrice A % confronto num righe e num colonne di A

% % % %

inizializzazione max valore temporaneo si scorrono gli elementi principali verifica presenza elem. piu grande aggiornamento max valore temporaneo

% risultato della function

2.2

Esercizi gruppo 2

Esercizio 1
function ris=es1g2(A)

[rA,cA]=size(A); if rA==cA for k=1:rA d(k)=det(A(1:k,1:k)); end ris=d; else ris=matrice non quadrata; end

% % % %

dimensioni della matrice A si controlla se A e quadrata si scorrono i minori princ. di guida di A calcolo dei minori principali di guida

% risultato della function % risultato in caso di matrice non quadrata

Esercizio 2
function ris=es2g2(A,B) [rA,cA]=size(A); % dimensioni di A [rB,cB]=size(B); % dimensioni di B if rA==rB & cA==cB % si verifica che A e B abbiano la stessa dim for i=1:rA % si scorrono le righe for j=1:cA % si scorrono le colonne if A(i,j)==B(i,j) % si confrontano i valori di A(i,j) e B(i,j) C(i,j)=A(i,j); % si assegna il valore a C(i,j) else C(i,j)=0; % si assegna il valore a C(i,j) end end end ris=C; % risultato della function else ris=matrici di diversa dimensione; % risultato della function end % in caso di A e B con diversa dim

Esercizio 3
function ris=es3g2(A,B) [rA,cA]=size(A); % [rB,cB]=size(B); % if rA==rB & cA==cB % for i=1:rA % for j=1:cA % if A(i,j)==B(i,j) % C(i,j)=0; elseif A(i,j)>B(i,j) C(i,j)=1; else C(i,j)=-1; end end end dimensioni di A dimensioni di B si verifica che A e B abbiano la stessa dim si scorrono le righe si scorrono le colonne si confrontano i valori di A(i,j) e B(i,j) % si assegna il valore a C(i,j) % altro confronto tra A(i,j) e B(i,j) % si assegna il valore a C(i,j) % si assegna il valore a C(i,j)

ris=C; else end

% risultato della function

ris=matrici di diversa dimensione; % risultato della function % in caso di A e B con diversa dim

Esercizio 4
function ris=es4g2(A,B) [rA,cA]=size(A); positive=0; negative=0; nulle=0; for i=1:rA for j=1:cA if A(i,j)>0 positive=positive+1; elseif A(i,j)<0 negative=negative+1; else nulle=nulle+1; end end end ris=[positive, negative, nulle]; % % % % % % % % % % dimensioni di A inizializzaz. num. elementi inizializzaz. num. elementi inizializzaz. num. elementi si scorrono le righe si scorrono le colonne positivita di A(i,j) si aggiorna il num. compon. positivita di A(i,j) si aggiorna il num. compon.

positivi negativi nulli

positive negative

% si aggiorna il num. compon. nulle

% risultato della function

Esercizio 5
function ris=es5g2(A,B) [rA,cA]=size(A); if not(rA==cA) ris=matrice non quadrata; else for i=1:rA for j=1:i B(i,j)=A(i,j); B(j,i)=A(i,j); end end ris=B; end % dimensioni di A % si controlla se A e quadrata % risultato se A non e quadrata % % % % si si si si scorrono le righe di A scorrono le col di A fino alla i-esima assegna il valore a Bij assegna il valore a Bji

% risultato della function

Esercizio 6
function ris=es6g2(A,B) [rA,cA]=size(A); for i=1:rA for j=1:cA % dimensioni di A % si scorrono le righe di A % si scorrono le colonne di A

10

if A(i,j)>0 A(i,j)=A(i,j)*100; elseif A(i,j)<0 A(i,j)=A(i,j)/2; end end end ris=A;

% % % %

si controlla positivita di A(i,j) positivi moltiplicati per 100 si controlla negativita di A(i,j) negativi divisi per 2

% risultato della function

Esercizio 7
function ris=es7g2(A,B) [rA,cA]=size(A); for i=1:rA somma=0; for j=1:cA if A(i,j)>0 somma=somma+A(i,j); end end s(i)=somma; end ris=s; % % % % % % dimensioni di A si scorrono le righe di A si inizializza laccumulatore si scorrono le colonne di A controllo positivita di A(i,j) si incrementa laccumulatore

% si memorizza la somma corrispondente % alla i-esima riga % risultato della function

2.3

Esercizi gruppo 3

Esercizio 1 Basta dare il seguente comando:


sum(max(A))

Esercizio 2
function ris=es2g3(A,B) [rA,cA]=size(A); % dimensione di A [rB,cB]=size(B); % dimensione di B if not(rA==rB) % si controlla se A e B hanno lo stesso num di righe ris=A e B non hanno lo stesso numero di righe; else C=[A B]; % si definisce la matrice C [rC,cC]=size(C); % dimensione di C if not(rC==cC) % si controlla se C e quadrata ris=la matrice [A|B] non e quadrata; else if det(C)==0 % si controlla se C e invertibile ris=la matrice [A|B] non e invertibile; else ris=inv(C); % si fornisce come risultato linversa di C

11

end end end

Esercizio 3 Versione semplicata con codice non ottimizzato


function ris=es3g3(A,b) lb=length(b); % lunghezza di b [rA,cA]=size(A); % dimensione di A trovata=0; % inizializzazione del flag "trovata" for k=1:lb % si scorrono gli elementi di b for i=1:rA % si scorrono le righe di A for j=1:cA % si scorrono le colonne di A if b(k)==A(i,j) % si controlla se b(k) e uguale a A(i,j) trovata=1; % se sono uguali "trovata" e settata a vero end end end end if trovata % verif. se e stata trovata almeno una comp. di b ris=almeno un elemento di b e anche elemento di A; else % risultati della function ris=nessun elemento di b e anche elemento di A; end

Versione con cicli for e comando break


function ris=es3g3bis(A,b) lb=length(b); % lunghezza di b [rA,cA]=size(A); % dimensione di A trovata=0; % inizializzazione del flag "trovata" for k=1:lb % si scorrono gli elementi di b for i=1:rA % si scorrono le righe di A for j=1:cA % si scorrono le colonne di A if b(k)==A(i,j) % si controlla se b(k) e uguale a A(i,j) trovata=1; % se sono uguali "trovata" e settata a vero break % non e necessario visitare le altre end % colonne di A end if trovata % controllo se "trovata" e settata a vero break % se lo e non e necessario visitare end % le altre righe di A

12

end if trovata break end

% controllo dopo la visita di A se la % componente di b e stata trovata % in tal caso posso interrompere la visita di b

end if trovata % verif. se e stata trovata almeno una comp. di b ris=almeno un elemento di b e anche elemento di A; else % risultati della function ris=nessun elemento di b e anche elemento di A; end

Versione con cicli while e senza comando break


function ris=es3g3ter(A,b) lb=length(b); % lunghezza di b [rA,cA]=size(A); % dimensione di A nontrovata=1; % inizializzazione del flag "nontrovata" k=1; % inizializzazione contatore elementi di b while k<=lb & nontrovata % si scorrono gli elementi di b i=1; % inizializzazione contatore righe di A while i<=rA & nontrovata % si scorrono le righe di A j=1; % inizializzazione contatore colonne di A while j<=cA & nontrovata % si scorrono le colonne di A if b(k)==A(i,j) % si controlla se b(k) e uguale a A(i,j) nontrovata=0; % se sono uguali "nontrovata" viene end % settata a falso j=j+1; % incremento indice colonne di A end i=i+1; % incremento indice righe di A end k=k+1; % incremento indice elementi di b end if nontrovata % verif. se non e stata trovata alcuna comp. di b ris=nessun elemento di b e anche elemento di A; else % risultati della function ris=almeno un elemento di b e anche elemento di A; end

Esercizio 4 Versione con cicli for e comando break


function ris=es4g3(A,b) lb=length(b); % lunghezza di b

13

[rA,cA]=size(A); % dimensione di A manca=0; % inizializzazione del flag "manca una comp." for k=1:lb % si scorrono gli elementi di b trovata=0; % inizializzazione del flag "trovata" for i=1:rA % si scorrono le righe di A for j=1:cA % si scorrono le colonne di A if b(k)==A(i,j) % si controlla se b(k) e uguale a A(i,j) trovata=1; % se sono uguali "trovata" e settata a vero break % non e necessario visitare le altre end % colonne di A end if trovata % controllo se "trovata" e settata a vero break % se lo e non e necessario visitare end % le altre righe di A end if not(trovata) % controllo dopo la visita di A se la manca=1; % componente di b non e stata trovata break % in tal caso "manca" e settata a vero end % non importa controllare le altre comp. di b end if manca % controllo se manca almeno una comp. di b ris=non tutti gli elementi di b sono anche elementi di A; else % risultati della function ris=tutti gli elementi di b sono anche elementi di A; end

Versione con cicli while e senza comando break


function ris=es4g3bis(A,b) lb=length(b); % lunghezza di b [rA,cA]=size(A); % dimensione di A nonmanca=1; % inizializzazione del flag "nonmanca" k=1; % inizializzazione contatore elementi di b while k<=lb & nonmanca % si scorrono gli elementi di b nontrovata=1; % inizializzazione del flag "nontrovata" i=1; % inizializzazione contatore righe di A while i<=rA & nontrovata % si scorrono le righe di A j=1; % inizializzazione contatore colonne di A while j<=cA & nontrovata % si scorrono le colonne di A if b(k)==A(i,j) % si controlla se b(k) e uguale a A(i,j) nontrovata=0; % se sono uguali "nontrovata" viene end % settata a falso j=j+1; % incremento indice colonne di A end i=i+1; % incremento indice righe di A end % controllo dopo la visita di A se la if nontrovata % componente di b non e stata trovata

14

nonmanca=0; end k=k+1;

% in tal caso "nonmanca" viene % settata a falso % incremento indice elementi di b

end if nonmanca % controllo se ci sono tutte le comp. di b ris=tutti gli elementi di b sono anche elementi di A; else % risultati della function ris=non tutti gli elementi di b sono anche elementi di A; end

Esercizio 5
function ris=es5g3(A) [rA,cA]=size(A); if not(rA==cA) ris=matrice non quadrata else massimi=max(A); for i=1:rA A(i,i)=massimi(i); end ris=A; end % dimensione di A % si controlla se A e quadrata % risposta nel caso A non quadrata % max valori per le varie colonne % si scorrono gli elementi principali % max valori divengono elem. principali % risultato della function

Esercizio 6
function ris=es6g3(A) [rA,cA]=size(A); if not(rA==cA) ris=matrice non quadrata else for j=1:cA posmassimo=1; valmassimo=A(1,j); for i=2:rA if A(i,j)>valmassimo posmassimo=i; valmassimo=A(i,j); end end A(posmassimo,j)=A(j,j); A(j,j)=valmassimo; end ris=A; end % dimensione di A % si controlla se A e quadrata % risposta nel caso A non quadrata % % % % % % % si si si si si si si scorrono le inizializza inizializza scorrono le verifica se aggiorna la aggiorna il colonne posiz. massimo elem. valore massimo elem. altre righe il valore e maggiore posiz. del max elem. valore del max elem.

% si scambiano di posto il massimo % valore e lelemento principale % risultato della function

Esercizio 7 15

function ris=es7g3(A) [rA,cA]=size(A); rigamax=1; colonnamax=1; valmax=A(1,1); for i=1:rA for j=1:cA if A(i,j)>valmax rigamax=i; colonnamax=j; valmax=A(i,j); end end end ris=[rigamax,colonnamax]; % % % % % % % % % % dimensione di A si inizializza riga massimo elem. si inizializza colonna massimo elem. si inizializza valore massimo elem. si scorrono le righe si scorrono le colonne si verifica se il valore e maggiore si aggiorna la riga del max. elem. si aggiorna la colonna del max. elem. si aggiorna il valore del max. elem.

% risultato della function

Esercizio 8
function ris=es8g3(A) [rA,cA]=size(A); % dimensione di A rigamax=1; % si inizializza riga massimo elem. colonnamax=1; % si inizializza colonna massimo elem. valmax=A(1,1); % si inizializza valore massimo elem. rigamin=1; % si inizializza riga minimo elem. colonnamin=1; % si inizializza colonna minimo elem. valmin=A(1,1); % si inizializza valore minimo elem. for i=1:rA % si scorrono le righe for j=1:cA % si scorrono le colonne if A(i,j)>valmax % si verifica se il valore e maggiore rigamax=i; % si aggiorna la riga del max. elem. colonnamax=j; % si aggiorna la colonna del max. elem. valmax=A(i,j); % si aggiorna il valore del max. elem. elseif A(i,j)<valmin % si verifica se il valore e minore rigamin=i; % si aggiorna la riga del min. elem. colonnamin=j; % si aggiorna la colonna del min. elem. valmin=A(i,j); % si aggiorna la valore del min. elem. end end end ris=[rigamax,colonnamax;rigamin,colonnamin]; % risultato della function

Esercizio 9
function ris=es9g3(A) [rA,cA]=size(A); for j=1:cA rigamax=1; % dimensione di A % si scorrono le colonne % si inizializza riga massimo elem.

16

valmax=A(1,j); rigamin=1; valmin=A(1,j); for i=2:rA if A(i,j)>valmax rigamax=i; valmax=A(i,j); elseif A(i,j)<valmin rigamin=i; valmin=A(i,j); end end A(rigamin,j)=valmax; A(rigamax,j)=valmin; end ris=A;

% % % % % % % % % %

si si si si si si si si si si

inizializza inizializza inizializza scorrono le verifica se aggiorna la aggiorna il verifica se aggiorna la aggiorna il

valore massimo elem. riga minimo elem. valore minimo elem. righe il valore e maggiore riga del max. elem. valore del max. elem. il valore e minore riga del min. elem. valore del min. elem.

% si scambiano di posto il massimo % valore e dil minimo valore % risultato della function

Esercizio 10
function ris=es10g3(A) [rA,cA]=size(A); % negativi=ones(1,rA); % for i=1:rA % for j=1:cA % if A(i,j)<0 % negativi(i)=A(i,j); break % end end end ris=negativi; % dimensione di A inizializzo ad 1 le risposte per le righe si scorrono le righe di A si scorrono le colonne di A si controlla la negativita % se si trova un negativo si memorizza come risposta e si salta alla riga seguente

risposta della function

Esercizio 11 Versione con ciclo for e comando break


function ris=es11g3(A) [rA,cA]=size(A); for i=1:rA for j=1:cA if A(i,j)<0 break elseif A(i,j)>10 A(i,j)=A(i,j)*100; end end end % % % % % % % dimensione di A si scorrono le righe di A si scorrono le colonne di A negativita di A(i,j) si chiude il ciclo piu interno si controlla se A(i,j)>10 si moltiplica A(i,j) per 100

17

ris=A;

% risultato della function

Versione con ciclo while e senza comando break


function ris=es11g3bis(A) [rA,cA]=size(A); for i=1:rA j=1; while j<=cA & A(i,j)>=0 if A(i,j)>10 A(i,j)=A(i,j)*100; end j=j+1; end end ris=A; % risultato della function % % % % % % % dimensione di A si scorrono le righe di A si inizializza lindice j della colonna si controlla di non aver visitato tutte le colonne e di non avere un negativo si controlla se A(i,j)>10 si moltiplica A(i,j) per 100

% si incrementa lindice di colonna

2.4

Esercizi gruppo 4

Esercizio 1
function ris=stimaRS(A) [rA,cA]=size(A); % dimensione della matrice A if not(rA==cA) % confronto num righe e num colonne di A ris=la matrice non e quadrata; else d=abs(det(A))^(1/rA); % calcolo condizione con det. di A t=abs(trace(A))/rA; % calcolo condizione con traccia di A A2=abs(A); % matrice con moduli degli elementi di A sommaabscolonne=sum(A2); % somma per colonne dei moduli elem. di A sommaabsrighe=sum(A2); % somma per righe dei moduli elem. di A rmax=max(sommaabsrighe); % massimo valore somma per righe cmax=max(sommaabscolonne); % massimo valore somma per colonne lb=max(d,t); % calcolo lower bound ub=min(rmax,cmax); % calcolo upper bound ris=[lb ub]; % stima raggio spettrale end

Esercizio 2
function ris=BrauerSolow(A) [rA,cA]=size(A); % dimensione della matrice A if not(rA==cA) % confronto num righe e num colonne di A ris=la matrice non e quadrata; elseif min(min(A))<0 % verifica nonnegativita di A

18

ris=la matrice quadrata non e nonnegativa; else pmax=max(diag(A)); sommacolonne=sum(A); sommarighe=sum(A); rmin=min(sommarighe); rmax=max(sommarighe); cmin=min(sommacolonne); cmax=max(sommacolonne); lb=max([rmin cmin pmax]); ub=min(rmax,cmax); ris=[lb ub]; end % % % % % % % % % % massimo elem. principale di A somma per colonne elem. di A somma per righe elem. di A minimo valore somma per righe massimo valore somma per righe minimo valore somma per colonne massimo valore somma per colonne calcolo lower bound calcolo lower bound stima autovalore dominante

Esercizio 3
function ris=HawkinsSimon(mu,C) [rC,cC]=size(C); % dimensione della matrice A if not(mu>0) % verifica positivita di mu ris=mu non e un numero positivo; elseif not(rC==cC) % verifica C matrice quadrata ris=C non e una matrice quadrata; elseif min(min(C))<0 % verifica nonnegativita di C ris=C non e una matrice nonnegativa; else M=mu*eye(rC)-C; % determinazione M-matrice for i=1:rC % si scorrono le righe/colonne minore(i)=det(M(1:i,1:i)); % calcolo minori princ. di guida end ris=(min(minore)>0); % positivita minori princ. di guida end

2.5

Esercizi gruppo 5

Esercizio 1
function risultato=riquadra(A) %RIQUADRA Data la matrice delle quotazioni A, % RIQUADRA(A) elimina la prima e lultima riga, % la prima e lultima colonna, inverte lordine dei % titoli azionari e delle date A(:,[1,end])=[]; A([1,end],:)=[]; A=fliplr(A); A=flipud(A); risultato=A; % % % % % toglie la prima ed ultima colonna toglie la prima ed ultima riga inverte lordine delle colonne inverte lordine delle righe fornisce il risultato

19

Esercizio 2
function risultato=rialzi(A) %RIALZI Data la matrice delle quotazioni A, % RIALZI(A) fornisce, per ogni singolo titolo azionario, % il numero di rialzi di quotazione avvenuti % relativamente ai dati storici forniti con linput A [numrighe,numcolonne]=size(A); % si determina inizialmente % la dimensione della matrice A % si inizializza un vettore di contatori, % con una componente per ogni colonna

contatore=zeros(1,numcolonne);

for j=1:numcolonne % si scorrono le colonne (azioni) for i=2:numrighe % si scorrono le righe (date) if A(i,j)>A(i-1,j) contatore(j)=contatore(j)+1; % se si ha un rialzo si % incrementa il contatore end end end risultato=contatore; % si fornisce il risultato

Esercizio 3
function risultato=max_min1(A,j) %MAX_MIN1 Data la matrice delle quotazioni A ed il % titolo azionario j, MAX_MIN1(A,j) fornisce % le date (indici di riga) in cui sono state ottenute % rispettivamente la massima e la minima quotazione % relativamente ai dati storici forniti con linput A [numrighe,numcolonne]=size(A); % si determina inizialmente % la dimensione della matrice A il il la la valore massimo temporaneo valore minimo temporaneo riga del massimo temporaneo riga del minimo temporaneo

maxtemp=A(1,j); mintemp=A(1,j); index_max=1; index_min=1;

% % % %

si si si si

inizializza inizializza inizializza inizializza % % % % % % %

for i=2:numrighe if A(i,j)>maxtemp maxtemp=A(i,j); index_max=i; elseif A(i,j)<mintemp mintemp=A(i,j); index_min=i; end end

si scorrono le righe se il valore e maggiore del massimo temporaneo si aggiorna il valore massimo temporaneo e si memorizza la riga in cui si e trovato tale valore altrimenti, se il valore e minore del minimo temporaneo si aggiorna il valore minimo temporaneo e si memorizza la riga in cui si e trovato tale valore

20

risultato=[index_max,index_min];

% si fornisce come risultato sia la riga in cui % si e trovato il massimo valore che quella % in cui si e trovato il minimo valore

Esercizio 4
function risultato=max_min(A) %MAX_MIN Data la matrice delle quotazioni A, % MAX_MIN(A) fornisce, per ogni titolo azionario, % le date (indici di riga) in cui sono state ottenute % rispettivamente la massima e la minima quotazione % relativamente ai dati storici forniti con linput A [numrighe,numcolonne]=size(A); % si determina inizialmente % la dimensione della matrice A % % % % si inizializza il vettore dei massimi temporanei si inizializza il vettore dei minimi temporanei

index_max=ones(1,numcolonne); index_min=ones(1,numcolonne);

for j=1:numcolonne maxtemp=A(1,j); mintemp=A(1,j);

% si scorrono le colonne % si inizializza il valore massimo temporaneo % si inizializza il valore minimo temporaneo % % % % % % % si scorrono le righe se il valore e maggiore del massimo temporaneo si aggiorna il valore massimo temporaneo e si memorizza la riga in cui si e trovato tale valore altrimenti, se il valore e minore del minimo temporaneo si aggiorna il valore minimo temporaneo e si memorizza la riga in cui si e trovato tale valore

for i=2:numrighe if A(i,j)>maxtemp maxtemp=A(i,j); index_max(j)=i; elseif A(i,j)<mintemp mintemp=A(i,j); index_min(j)=i; end end end

risultato=[index_max;index_min];

% si fornisce come risultato sia le righe in cui % si sono trovati i massimi valori che quelle % in cui si sono trovati i minimi valori

Esercizio 5
function risultato=variazione_max_min(A,j) %VARIAZIONE_MAX_MIN Data la matrice delle quotazioni A ed il % titolo azionario j, VARIAZIONE_MAX_MIN(A,j) fornisce % le date (indice di riga) in cui si sono avute % rispettivamente la massima e la minima variazione della quotazione % relativamente ai dati storici forniti con linput A

21

[numrighe,numcolonne]=size(A);

% si determina inizialmente % la dimensione della matrice A il il la la rialzo massimo temporaneo rialzo minimo temporaneo riga del rialzo massimo temporaneo riga del rialzo minimo temporaneo

maxtemp=A(2,j)-A(1,j); mintemp=A(2,j)-A(1,j); index_max=2; index_min=2;

% % % %

si si si si

inizializza inizializza inizializza inizializza % % % % % % % %

for i=3:numrighe variazione=A(i,j)-A(i-1,j); if variazione>maxtemp maxtemp=variazione; index_max=i; elseif variazione<mintemp mintemp=variazione; index_min=i; end end

si scorrono le righe si determina la variazione della quotazione se la variazione e maggiore del massimo temporaneo si aggiorna la variazione massima temporanea e si memorizza la riga in cui si e avuta la variazione altrimenti, se il valore e minore del min temporaneo si aggiorna la variazione minima temporanea e si memorizza la riga in cui si e avuta la variazione

risultato=[index_max,index_min];

% si fornisce come risultato sia la riga in cui % si e trovato la massima variazione che quella % in cui si e trovata la minima variazione

Esercizio 6
function risultato=max_min_var(A) %MAX_MIN_VAR Data la matrice delle quotazioni A, % MAX_MIN_VAR(A) fornisce i titoli azionari che hanno avuto, % rispettivamente, la massima e la minima variazione di quotazione, % oltre alle date in cui si sono avute tali variazioni e le loro entita [numrighe,numcolonne]=size(A); % si determina inizialmente % la dimensione della matrice A % si determinano le righe % della massima e della minima variazione % della prima azione si inizializza la variaz. massima temporanea si inizializza la variaz. minima temporanea lindice del titolo con massima variazione lindice del titolo con minima variazione

temp=variazione_max_min(A,1); indexmax=temp(1); indexmin=temp(2);

maxtemp=A(indexmax,1)-A(indexmax-1,1); % mintemp=A(indexmin,1)-A(indexmin-1,1); % azmax=1; % si inizializza azmin=1; % si inizializza for j=2:numcolonne temp=variazione_max_min(A,j); rmax=temp(1); rmin=temp(2); maxvar=A(rmax,j)-A(rmax-1,j);

% si determinano la max % e la min variazione % % del titolo azionario j

22

minvar=A(rmin,j)-A(rmin-1,j); if maxvar>maxtemp maxtemp=maxvar; indexmax=rmax; azmax=j; end if minvar<mintemp mintemp=minvar; indexmin=rmin; azmin=j; end end risultato=[azmax,indexmax,maxtemp;azmin,indexmin,mintemp]; % si restituiscono tutti i valori ottenuti % se la variazione e maggiore del massimo temporaneo % si aggiornano i dati relativi % alla variazione massima temporanea

% altrimenti, se la variaz. e minore del minimo temporaneo % si aggiornano i dati relativi % alla variazione minima temporanea

Esercizio 7
function risultato=az_var_max_min(A,i) %AZ_VAR_MAX_MIN Data la matrice delle quotazioni A ed il % giorno i, AZ_VAR_MAX_MIN(A,i) fornisce % i titoli azionari (indici di colonna) per i quali si sono avute % rispettivamente la massima e la minima variazione della quotazione % relativamente ai dati storici forniti con linput A [numrighe,numcolonne]=size(A); % si determina inizialmente % la dimensione della matrice A massimo temporaneo minimo temporaneo rialzo massimo temporaneo rialzo minimo temporaneo

maxtemp=A(i,1)-A(i-1,1); % si inizializza il rialzo mintemp=A(i,1)-A(i-1,1); % si inizializza il rialzo tit_max=1; % si inizializza il titolo del tit_min=1; % si inizializza il titolo del for j=2:numcolonne variazione=A(i,j)-A(i-1,j); if variazione>maxtemp maxtemp=variazione; tit_max=j; elseif variazione<mintemp mintemp=variazione; tit_min=j; end end % % % % % % % %

si scorrono le colonne si determina la variazione della quotazione se la variazione e maggiore del massimo temporaneo si aggiorna la variazione massima temporanea e si memorizza la colonna in cui si e avuta la variazione altrimenti, se il valore e minore del min temporaneo si aggiorna la variazione minima temporanea e si memorizza la colonna in cui si e avuta la variazione

risultato=[tit_max,tit_min];

% si fornisce come risultato sia la colonna in cui % si e trovato la massima variazione che quella % in cui si e trovata la minima variazione

23

Esercizio 8
function risultato=opposta_tendenza(A,j) %OPPOSTA_TENDENZA Data la matrice delle quotazioni A ed il % titolo azionario j, OPPOSTA_TENDENZA(A,j) fornisce % il titolo azionario che ha avuto la minima variazione di quotazione % in corrispondenza della massima variazione di quotazione del titolo j [numrighe,numcolonne]=size(A); % si determina inizialmente % la dimensione della matrice A % si determinano le righe % della massima e della minima variazione % del titolo azionario j

temp=variazione_max_min(A,j); datamax=temp(1); datamin=temp(2);

temp=az_var_max_min(A,datamax); % si determinano i titoli che hanno avuto titmax=temp(1); % la massima e la minima variazione titmin=temp(2); % alla data "datamax" varmin=A(datamax,titmin)-A(datamax-1,titmin); % entita della minima variazione risultato=[titmin,datamax,varmin]; % si restituiscono tutti i valori ottenuti

24

Riferimenti bibliograci
[1] The MathWorks Inc. (March 2006), Getting Started with MatLab, MatLab 7.2 edition. Disponibile on-line sul sito internet: http://www.mathworks.it/access/helpdesk/help/techdoc/matlab.html [2] Brandimarte P. (2001), Numerical Methods in Finance: A MATLABBased Introduction, Wiley, ISBN: 0471396869. [3] Etter D.M. e D.C. Kuncicky (2001), Introduzione a Matlab, Apogeo, ISBN 88-7303-855-7. [4] Naldi G., Pareschi L. e G. Russo (2001), Introduzione al Calcolo Scientico, metodi e applicazioni con Matlab, McGraw-Hill, Milano, ISBN: 88-386-0885-7. [5] Tavella D. (2002), Quantitative Methods in Derivatives Pricing: An Introduction to Computational Finance, Wiley, ISBN: 0471394475.

25

Potrebbero piacerti anche