Introduzione a Matlab

12 novembre 2007

1 Ambienti software dedicati al calcolo numerico

Mostriamo ora come utilizzare Matlab/Octave sotto Linux, osservando che comunque sussistono molte analogie con quanto si debba fare sotto Windows o MacOS. Al fine di implementare gli algoritmi e verificarne il funzionamento, necessita evidentemente un ambiente di programmazione. Tra quelli che hanno avuto maggior successo in Analisi Numerica citiamo il Fortran, il C++, Phyton, Matlab (o le sue alternative freeware GNU Octave o Scilab).

In generale, accanto a uno qualsiasi di questi linguaggi troviamo librerie di calcolo scientifico, che in qualche senso da definire sono codici che un utente può utilizzare per risolvere problemi dell’Analisi Numerica più velocemente ed efficacemente. I programmi di queste librerie sono stati implementati con cura da specialisti, cosicchè l’utente finale deve solo richiamarli, qualora lo ritenga opportuno.

In questo corso utilizzeremo MATLAB (sigla per Matrix Laboratory). Tale programma di tipo commerciale ha avuto origine nel 1983 ed ha avuto successo per la semplicità dei suoi comandi. All’url

http://www.mathworks.com

si possono trovare maggiori precisazioni sul suo utilizzo.

Come anticipato, esistono dei linguaggi la cui struttura è molto simile a MATLAB: GNU Octave o Scilab. Tra questi ultimi, GNU Octave presenta così tante similitudini da essere utilizzato con codici MATLAB con alte probabilitá di non presentare alcun errore di sintassi. Per dettagli tecnici si consulti

http://octave.sourceforge.net/

GNU Octave può trovarsi gratuitamente in molte release di Linux, come ad esempio Quantian. Per dettagli si veda

http://dirk.eddelbuettel.com/quantian.html/

L’installazione su PC con Windows o MacOs risulta più complicata. Si considerino le distribuzioni per PC

http://www.math.mcgill.ca/loisel/octave-workshop/
http://octave.sourceforge.net/

e per MAC

http://wiki.octave.org/wiki.pl?OctaveForMac

1.1 Il Workspace di Matlab

I programmi scritti in linguaggio Matlab (o GNU Octave), vanno necessariamente salvati in un file di testo avente estensione .m (detto comunemente m-file).

Per familiarizzare con tali ambienti, si apra una finestra di tipo terminale e si digiti da tale shell il comando matlab (o in alternativa octave).

L’ambiente di calcolo, che si presenta con una linea di comando del tipo >> permette di eseguire programmi che appartengono all’ambiente e programmi costruiti dall’utente, semplicemente digitando il nome dell’m-file che li contiene, senza estensione, sulla riga di comando e premendo il tasto ENTER. Così se il programma è salvato nel file mioprogramma.m e vogliamo lanciarlo con Matlab/Octave, digiteremo su shell solamente mioprogramma.

Per essere eseguiti i programmi devono essere visibili dall’ambiente di lavoro di Matlab/Octave (il cosidetto workspace).

Per capire questo punto si digiti sulla shell di Matlab/Octave il comando ls. Immediatamente vengono listati i files nella cartella corrente. Per cambiare cartella basta digitare sulla shell di Matlab/Octave un comando del tipo cd altracartella dove altracartella è una directory in cui vogliamo muoverci. Il comando cd .. muove Matlab/Octave in una cartella contentente la directory attuale. Matlab/Octave vede tutti i file che può listare con ls.

L’ambiente mantiene disponibili in memoria tutte le variabili che sono state inizializzate dal momento dell’ingresso nell.ambiente in poi, sia tramite singoli comandi che tramite istruzioni contenute nei programmi eseguiti, entrambi impartiti dalla linea di comando dell’ambiente. Questa è una sostanziale differenza rispetto alla programmazione in C o in FORTRAN, dove le variabili vengono allocate all’inizio dell’esecuzione del programma e poi de-allocate (cioè cancellate) al termine dell’esecuzione stessa. Una conseguenza immediata di questo fatto è che, ad esempio, in un ambiente come il Matlab non è necessario salvare esplicitamente su file i valori delle variabili che si vogliono osservare (es. graficare) dopo l’esecuzione del programma.

In termini grossolani, ciò significa che se il programma che abbiamo appena fatto girare conteneva la variabile n, una volta terminata l’esecuzione il valore di n è memorizzato e richiamabile dalla shell di Matlab/Octave. Per capire questo si digiti a=atan(0.2); e si prema ENTER. Quindi a e si prema nuovamente ENTER. Se tutto è stato eseguito correttamente viene scritto su monitor

>> a=atan(0.2);
>> a
a =

    0.1974
>>

segno che la variabile a dopo essere stata assegnata è mantenuta in memoria.

Un’altra caratteristica molto importante di questo ambiente è avere un meccanismo di help in linea, disponibile per tutti i comandi ed i programmi che siano visibili ed eseguibili dal workspace (quindi anche quelli costruiti dall’utente). A tal proposito basta scrivere da shell

help nomeprogramma

per produrre la stampa a video delle prime righe commentate del file programma.m. Per esempio digitando help sin e premendo ENTER otteniamo da Matlab 6

>>help sin
SIN    Sine.
    SIN(X) is the sine of the elements of X.
 Overloaded methods
    help sym/sin.m

1.2 L’esecuzione dei programmi

Matlab e Octave effettuano la dichiarazione automatica delle strutture dati: quando viene usata una variabile per la prima volta, essi creano automaticamente lo spazio in memoria per contenerla. Questo meccanismo è molto comodo per il programmatore e non è comune nei linguaggi di programmazione. Ciò significa che non bisogna dire ad esempio che la variabile n è un numero reale, poichè Matlab/Octave non lo richiedono. A verificare la correttezza sintattica dei programmi ci pensa l’interprete, ma per verificare che lo svolgimento dei calcoli sia quello desiderato, è necessario confrontare un’esecuzione su un problema di piccole dimensioni con i calcoli a mano.

Per chi volesse saperne di più , si consultino ad esempio

http://www.mathworks.com/access/helpdesk/help/pdf_doc/matlab/learnmatlab.pdf
http://www.mathworks.com/moler/

2 Matlab: operazioni con matrici e vettori

In questa sezione, mostreremo alcuni comandi di MATLAB che risulteranno utili per implementare gli algoritmi descritti in seguito.

2.1 Operazioni aritmetiche e funzioni elementari predefinite

addizione
sottrazione
prodotto
/ divisione
potenza

Mostriamo un primo esempio sull’utilizzo di tali operazioni in Matlab.

>>format short
>>(2+3*pi)/2
ans =
5.7124
>>format long
>>(2+3*pi)/2
ans =
5.71238898038469
>>format long e
>>(2+3*pi)/2
ans =
5.712388980384690e+000

Si vede che il valore di (2 3 )/2 viene approssimato fornendo poche o molte cifre decimali, anche in notazione esponenziale (qui e 000 sta per 10^{0}). Altre funzioni elementari comunemente usate sono

abs  valore assoluto
sin  seno
cos  coseno
tan  tangente
exp  esponenziale
sqrt radice quadrata
log10 logaritmo base 10
log  logaritmo
floor arrotondamento
ceil arrotondamento
acos arco coseno
cosh coseno iperbolico

2.2 Assegnazioni

Si consideri l’esempio

>>a=3-floor(2.3)
ans =
1
>>a=3-ceil(2.3)

  ans =
  0
>>b=sin(2*pi);

Si noti che il “;” ha come effetto che non mette in display il valore della variabile .

Se digitiamo il comando senza “;” il valore della variabile verrà visualizzato come segue

>>a=sin(2*pi)
  a =
-2.4493e-016

Si osservi che il risultato non è 0 come ci si aspetterebbe, ma comunque un valore molto piccolo in modulo.

2.3 Definizione di una funzione

In Matlab l’utente puó definire una funzione scrivendo un M-file, cioè un file con l’estensione .m. Per scrivere una funzione si digiti nella shell di Linux pico fun.m. Per salvare il file premere contemporaneamente il tasto CTRL e X. Se si accettano le modifiche digitare y. Mostriamo di seguito un esempio di funzione.

function y=fun(x)
y=5+sin(x);

Di conseguenza

                            y=fun(pi);

assegna alla variabile di input il valore e alla variabile di output il valore 5 sin( ).

Ovviamente Matlab segnala errore se alla variabile di output non è assegnato alcun valore. Per convincersene si scriva la funzione

function y=fun(x)
z=5+sin(x);

e da shell si esegua il comando

y=fun(pi);

come risultato Matlab avvisa su shell

Warning: One or more output arguments not assigned during call to 'fun'.

Alcune osservazioni:

• Ricordiamo che è fondamentale salvare il file in una directory appropriata e che se la funzione è chiamata da un programma al di fuori di questa directory una stringa di errore verrà visualizzata nella shell

         ???  Undefined function or variable 'fun'.

Le funzioni predefinite da Matlab sono visibili da qualsiasi directory di lavoro. Quindi se il file fattoriale.m creato dall’utente è nella cartella PROGRAMMI e viene chiamato dalla funzione binomiale.m che fa parte di una cartella esterna ALTRO (ma non di PROGRAMMI), Matlab segnala l’errore compiuto. Se invece binomiale.m chiama la funzione Matlab predefinita prod.m, la funzione binomiale.m viene eseguita perfettamente.

• L’uso delle variabili è locale alla funzione. In altre parole se scriviamo

                         s=fun(pi);

durante l’esecuzione della funzione di fun viene assegnata alle variabili , un’extra allocazione di memoria che viene rilasciata quando si esce da fun. Uno degli effetti è che il programma

>>y=(2*pi);
>>x=fun(y)

viene eseguito correttamente nonostante ci sia un’apparente contrasto tra le ed della parte in shell di Matlab con le variabili ed della funzione fun, che peraltro hanno un significato diverso (alla del programma viene assegnata in fun la variabile locale !).

• Spesso risulta necessario avere più variabili di input o di output in una funzione. Per capirne la sintassi si consideri l’esempio

function [s,t] = fun2(x,y)
  s=(x+y);
  t=(x-y);

• Per ulteriori dubbi sulla programmazione di una funzione si esegua da shell il comando

>>help function

Osservazione: spesso nell’help di Matlab le funzioni sono in maiuscolo, ma quando debbono essere chiamate si usi il minuscolo. Per esempio, si digiti su shell

>>help sum

Quale risposta abbiamo

SUM(X,DIM) sums along the dimension DIM.

mentre

>>a=[1 2];
>>SUM(a);
??? Capitalized internal function SUM; Caps Lock may be on.
>>sum(a)
ans =
   3

Conseguentemente il comando (vettoriale) sum che somma tutte le componenti di un vettore non può essere scritto in maiuscolo.

2.4 Operazioni con le matrici

Esistono vari modi per definire una matrice . Se ad esempio

{ \atop }1 2 3 4 5 6 7 8 9 { \atop }

un primo metodo è via l’assegnazione diretta

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

un secondo ciclo for (come vedremo successivamente)

for s=1:3
for t=1:3
   A(s,t)=3*(s-1)+t;
end
end
a

Per implementare questi due cicli for innestati si scriva il programma su un file ciclofor.m e lo si lanci dalla shell di Matlab/Octave con il comando ciclofor. Viene eseguito sequenzialmente quanto segue:

1. Pone 1.

2. Pone 1 e valuta la componente ( ) (1 1) della matrice . Pone 2 e valuta la componente ( ) (1 2) della matrice . Pone 3 e valuta la componente ( ) (1 3) della matrice .

3. Pone 2.

4. Pone 1 e valuta la componente ( ) (2 1) della matrice . Pone 2 e valuta la componente ( ) (2 2) della matrice . Pone 3 e valuta la componente ( ) (2 3) della matrice .

5. Pone 3.

6. Pone 1 e valuta la componente ( ) (3 1) della matrice . Pone 2 e valuta la componente ( ) (3 2) della matrice . Pone 3 e valuta la componente ( ) (3 3) della matrice .

Il primo va bene per matrici di piccole dimensioni essendo poche le componenti da scrivere manualmente. Il secondo è più adatto a matrici strutturate come la matrice di Hilbert che è ha componenti (rispetto alle righe e alle colonne) _{} ( 1)^{1} .

Osserviamo che il comando A(i,j) permette di selezionare la componente ( ) della matrice . Ad esempio:

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

Tra le più comuni operazioni tra matrici ricordiamo

C=s*A
C=A'
C=A+B
C=A-B
C=A*B
C=A.*B

che assegnano alla variabile rispettivamente il prodotto tra lo scalare e la matrice , la trasposta della matrice , la somma, la sottrazione, il prodotto e il prodotto puntuale, cioè componente per componente di due matrici , (non necessariamente quadrate). Cosí se ad esempio 10,

1 2 3 4

5 6 7 8

e C=A.*B allora è la matrice

5 12 21 32

Osserviamo che quello citato non corrisponde all’usuale prodotto di matrici. Infatti, se

1. ha righe ed colonne,

2. ha righe ed colonne, allora è una matrice con righe e colonne tale che ( _{}) con

_{1}^{}_{}_{}1 1

Vediamo il nostro caso particolare. Se abbiamo

\begin{matrix}(1 5 2 7) & (1 6 2 8) \\ (3 5 4 7) & (3 6 4 8) \end{matrix}  19 22 43 50

Eseguiamo dalla shell di Matlab/Octave

A=[1 2; 3 4]; B=[5 6; 7 8]; D=A*B

Si ottiene

19 22 43 50

Ricordando che in generale l’usuale prodotto (indicato con ) tra due matrici non è commutativo ci aspettiamo che non coincida con . E infatti da F=B*A otteniamo

23 34 31 46

Osserviamo che si possono scrivere matrici rettangolari ma non quadrate. Infatti

>> A=[1 2 3; 4 5 6]
A =
1     2     3
4     5     6
>>

Altri comandi di comune utilizzo sono

rand(m,n) matrice di numeri random di ordine per
det(A)  determinante della matrice
size(A)  numero di righe e colonne di
hilb(n)  matrice di Hilbert di ordine
eye(n)  matrice identica di ordine
zeros(n) matrice nulla di ordine
ones(n)  matrice con componenti 1 di ordine
diag(A)  vettore diagonale della matrice
inv(A)  inversa di
norm(A)  norma di (anche vettori!)
cond(A)  condizionamento di
eig(A)  autovalori di

2.5 Operazioni con i vettori

Pensando i vettori riga (o colonna) come particolari matrici, ci si rende conto che le operazioni appena introdotte possono essere usate pure nel caso vettoriale. In altri termini, se e sono vettori ed uno scalare,

c=s*u
c=u'
c=u+v
c=u-v
c=u.*v

assegnano alla variabile rispettivamente la trasposta del vettore , la somma, la sottrazione e il prodotto puntuale (cioè componente per componente) di due vettori , . Se e sono due vettori colonna la scrittura c=u'*v calcola l’usuale prodotto scalare e . Ricordiamo che se

( _{})_{1} ( _{})_{1}

allora

_{1}^{}_{}_{}

Osserviamo subito che in Matlab invece di scriviamo c=u'*v.

Vediamo qualche esempio

>> s=10;
>> u=[1; 2]
u =
     1
     2
>> v=[3; 4]
v =
     3
     4
>> s*u
ans =
     10
     20
>> u'
ans =
     1     2
>> u+v
ans =
     4
     6
>> u-v
ans =

 -2
 -2
>> u.*v
ans =
  3
  8

>> u'*v
ans =
 11
>> v'*u
ans =
 11
>> u./v
ans =
 0.3333
 0.5000
>>

Dati una matrice quadrata non singolare di ordine e un vettore colonna , il comando calcola la soluzione del sistema lineare .

In molti casi risulta utile generare vettori del tipo

0 0

Vediamone alcuni esempi e i relativi comandi Matlab:

• il vettore riga [0; 1; 2; 3; 4] può essere definito dal comando Matlab

                              u=0:4;

In questo caso 1.

• il vettore riga [0; 2; 4] puo’ essere definito dal comando Matlab

                             v=0:2:4;

In questo caso 2.

• il vettore riga [0; 0 2; 0 4; 0 6] puo’ essere definito dal comando Matlab

                           v=0:0.2:0.6

In questo caso 0 2.

Uno delle istruzioni Matlab di uso più comune è length che calcola il numero di elementi di un vettore. Conseguentemente

>> x=[0; 1; 2];
>>length(x)
ans =
3

Qualora risulti necessario si interroghi l’help di Matlab, ed in particolare i toolbox elmat, matfun. Inoltre si confronti con quanto descritto più estesamente in [1], p. 1015 e seguenti.

2.6 Loops e Condizionali

uguale
∽  non uguale
minore
maggiore
minore uguale
maggiore uguale

∽ non
& and
or

for (loop variable == loop expression)

end

if (loop variable == loop expression)

else
end

while (loop variable == loop expression)

end

Esempio:

s=0;
for j=1:10
s=s+j;
end

Esempio:

s=1; j=1;
while j < 10
      s=s*j;
      j=j+1;
end

Esempio:

a = 50;
if a > 0
     s=1;
else
     if a < 0
        s=-1;
     else
        s=0;
     end
end
fprintf('a: %5.5f s: %1.0f',a,s);

2.7 La grafica di Matlab

Non è sufficiente produrre dei (buoni) risultati numerici, bensì è anche necessario poterli osservare a valutare in modo adeguato. Solitamente questa operazione richiede la produzione di qualche tipo di grafico, per cui l’esistenza di capacità grafiche è un elemento fondamentale di un ambiente di calcolo. Matlab possiede capacità grafiche evolute ed Octave si appoggia a Gnuplot (applicativo anch’esso open-source). A tal proposito consideriamo il seguente esempio (studio della funzione sin(1/ ) nell’intervallo [ 1), dove 2 2204 016)

x=eps:0.01:1;
y=sin(1./x);
plot(x,y,'r-');

Viene eseguito il plot della funzione sin(1/ ) campionandola nei punti 0 01 tra 0 e 1. Osserviamo che sta per rosso, e - esegue l’interpolazione lineare a tratti tra i valori assunti dalla funzione. Per ulteriori delucidazioni sul comando di plot si digiti nella shell di Matlab/Octave

help plot

Per scrivere tale programma, si digiti su shell Unix/Linux

pico studiofunzione.m

e quindi si copi il codice utilizzando tale editor. Quindi si digiti contemporaneamente CTRL ed X e si prema il tasto ENTER. Quindi dalla shell di Matlab/Octave si Figure 1: Differenza tra plot (figura a sinistra) e semilogy (figura a sinistra) nel rappresentare le coppie ( 10^{}) per 1 15.

scriva studiofunzione. Se tutto è stato eseguito correttamente viene visualizzato il grafico della funzione. Attenzione: usare l’invio per passare da una riga alla successiva. Inoltre, nelle prime versioni di Octave la funzione plot può avere delle stringhe relative al terzo componente che possono risultare diverse rispetto al corrispettivo in Matlab. Nel plottare gli errori, si ricorre spesso alla scala logaritmica, mediante il comando semilogy. Vediamone un esempio.

>> x=1:15;
>> y=10.^(-x);
>> plot(x,y);
>> semilogy(x,y)
>>

In questo test, si plottano le coppie ( 10^{}) per 1 15. Si nota come il comando plot non mostri adeguatamente la differenza tra 10^{1} e 10^{15}, cosa che è invece palese nella scala logaritmica. L’uso di quest’ultima scala sarà importante nello studio dell’errore dei metodi numerici implementati in seguito.

2.8 Display

Per il display di un risultato si utilizzano disp, fprintf. Per maggiori dettagli si provi ad esempio

>>help disp

Per capire come si usi il comando fprintf si consideri il programma

% ESEMPIO SUL COMANDO fprintf.
x = 0:.1:1; y = exp(x);
for index=1:length(x)
     fprintf('\n \t [x]: %$2.2f [y]: %$2.2e', x(index), y(index));
end

Commentiamo il codice e conseguentemente l’utilizzo di fprintf.

• % ESEMPIO SUL COMANDO fprintf.: il % stabilisce che e’ un commento al programma.

• x = 0:0.1:1; y = exp(x);: si crea il vettore riga

[0 0 1 0 9 1]

e in seguito si valuta puntualmente la funzione esponenziale in . In altri termini

[exp(0) exp(0 1) exp(0 9) exp(1)]

Le funzioni elementari precedentemente introdotte come abs, sin, , cosh godono pure di questa proprietà e rendono Matlab un linguaggio di tipo vettoriale. Dal punto di vista pratico il vantaggio è che molte operazioni possono essere eseguite senza utilizzare il ciclo for. Per capire questa particolarità si esegua una programma Matlab che calcoli il vettore

[exp(0) exp(0 1) exp(0 9) exp(1)]

con un ciclo for.

• for index=1:length(x): istruzione del ciclo for. Si noti che si itera per index che va da 1 fino alla lunghezza del vettore , cioè 11.

• fprintf(' n  t [x]: %2.2f [y]: %2.2e', x(index), y(index));

: in questa parte si effettua componente per componente il display dei valori nei vettori e . Il significato di %2.2f è che della componente di indice index del vettore vengono messe in display due cifre prima della virgola e due cifre dopo la virgola in notazione decimale. Il significato di %2.2e è che della componente di indice index del vettore vengono messe in display due cifre prima della virgola e due cifre dopo la virgola in notazione esponenziale. Per capire cosa sia quest’ultima rappresentazione (quella decimale è comunemente utilizzata fin dalle scuole elementari), si digiti su shell (usare l’invio per passare da uno >> al successivo). Per quanto concerne n e t, il primo manda a capo prima di stampare qualcosa su schermo, il secondo crea uno spazietto.

>>format short e
>>100*pi
ans=
3.1416e+002

Il numero 100 314 159265358979 viene rappresentato come 3 1416 10^{2}. Questa notazione è particolarmente utile per rappresentazioni di errori. Digitiamo su shell (senza contare gli 0!)

>>c=0.0000000000013
>>fprintf('[VALORE]: %2.18f', c)
[VALORE]: 0.000000000001300000

Non risulta molto chiaro a prima vista capire quanti 0 ci siano, mentre ciò risulta ovvio scrivendo

>>fprintf('[VALORE]: %2.2e', c)
[VALORE]: 1.30e-012

• end: fine del ciclo for.

2.9 Sulle operazioni puntuali

Una delle proprietá di Matlab/Octave é di rappresentare operazioni vettoriali. Osserviamo che le funzioni elementari precedentemente citate quali abs, , cosh sono implicitamente vettoriali. Per convincersi sperimentiamo sulla shell di Matlab/Octave

>> x=-1:0.5:1
x =
-1.0000   -0.5000         0    0.5000    1.0000
>> abs(x)
ans =
1.0000    0.5000         0    0.5000    1.0000
>>

Per le operazioni moltiplicative bisogna usare il . per lavorare vettorialmente. Vediamo alcuni esempi:

>> x=-1:0.5:1
x =
-1.0000   -0.5000         0    0.5000    1.0000
>> x.^2
ans =
1.0000    0.2500         0    0.2500    1.0000
>> sin(x.^3)
ans =
-0.8415   -0.1247         0    0.1247    0.8415
>> 1./x
Warning: Divide by zero.
ans =
-1    -2   Inf     2     1
>>

2.10 Altri comandi

1. Per l’esecuzione di un programma mioprogramma.m creato dall’utente si digiti dalla shell di Matlab (con Matlab avente quale directory attuale quella con-

tenente il file mioprogramma.m)
>>mioprogramma

2. Per ulteriori toolboxes predefinite in Matlab si digiti

>>help

3. il comando cputime permette come segue di sapere il tempo impiegato da un processo. Si consideri a tal proposito la porzione di codice

puntoiniziale=cputime;
s=0; for i=1:100 s=s+i; end
puntofinale=cputime;
tempoimpiegato=puntofinale-puntoiniziale;

Il valore della variabile tempoimpiegato consiste del tempo impiegato per svolgere le istruzioni

s=0; for i=1:100 s=s+i; end

2.11 Il diary

Uno dei comandi più interessanti di Matlab è il diary che scrive su file quanto visualizzato nella shell di Matlab/Octave. Vediamone un esempio dalla shell di Matlab/Octave:

>> diary on
>> s=2;
>> t=5;
>> u=s+t
u =
7
>> diary off

Nella directory attuale (vista cioè da Matlab/Octave) troviamo un file di testo diary. Lo apriamo con un editor (ad esempio digitando sulla shell di Linux pico diary). Il file contiene quanto apparso sulla shell di Matlab/Octave ad eccezione del prompt . Osserviamo che può essere utile per vedere a casa quanto fatto a lezione sul workspace di Matlab/Octave.

2.12 Alcuni semplici esercizi con le matrici e i vettori

1. Esercizio facile. Si implementi una funzione fatt che calcola il fattoriale fatt di un numero naturale , ricordando che

fatt( ) : ! : 1

La si utilizzi per calcolare mediante un ciclo for i fattoriali dei numeri naturali tra 1 e 20. Si visualizzino i risultati ottenuti. Per gli stessi numeri naturali si usi la funzione di Matlab gamma per valutare ( ). Che relazione sussiste tra ( ) e fatt( )?

Facoltativo: si utilizzi la funzione fattoriale per calcolare il binomiale

\begin{matrix} \\ \end{matrix}\frac{!}{!( )!}

2. Facoltativo. Si considerino le matrici di Hilbert _{}per 1 2 20. Si osservi cha la loro costruzione risulta facilitata dal comando hilb (si chiami l’help di Matlab per ulteriori informazioni). Utilizzando un ciclo for, si calcoli al variare di il determinante ( _{}) (via il comando det). Immagazzinare ( _{}) in un vettore e visualizzare al variare di tale risultato sul monitor (via il comando fprintf). Cosa succede se al posto di det(A) utilizzo prod(eig(A))? Ricordare che eig(A) fornisce il vettore degli autovalori 1 _{}della matrice quadrata (avente righe e colonne) e che

( ) _{1} _{}

References

[1] V. Comincioli, Analisi Numerica, metodi modelli applicazioni, Mc Graw-Hill, 1990.

[2] The MathWorks Inc., Numerical Computing with Matlab,

http://www.mathworks.com/moler.