SlideShare una empresa de Scribd logo
1 de 24
Descargar para leer sin conexión
Programmi
         MATLAB


Luca Zanni, Marco Prato

             Calcolo Numerico
Corsi di Laurea in Matematica e Informatica
Somma di M numeri reali (1)
                                                     inizio
M = input(‘Inserire il numero di …
                                                          M
        numeri naturali da sommare: ’);
S = 0;
i = 1;                                               S        0
while i <= M
       S = S + i;
                                                      i       1
       i = i + 1;
end
fprintf(‘n La somma dei primi %i…             V                  F
                                                     i≤M
        numeri naturali risulta %i n’,…
        M,S);                              S   S+i                 S

                                           i   i+1
                                                                  fine
Somma di M numeri reali (2)
                                                    inizio
M = input(‘Inserire il numero di …
                                                         M
       numeri naturali da sommare: ’);
S = 0;
for i = 1 : M                                       S        0
    S = S + i;
end
                                                     i       1
fprintf(‘n La somma dei primi %i…
       numeri naturali risulta %i n’,…
       M,S);                                  V                  F
                                                    i≤M

                                          S   S+i                 S

                                          i   i+1
                                                                 fine
Media aritmetica di M numeri reali (1)
                                                       inizio
M = input(‘Inserire il numero di …
                                                            M
        valori reali di cui fare la media: ’);
S = 0;
i = 1;                                                 S        0
while i <= M
       x = input(‘Inserire valore: ’);
                                                        i       1
       S = S + x;
       i = i + 1;
end                                              V                  F
                                                       i≤M
fprintf(‘n La media dei %i numeri…
        reali inseriti risulta %e n’,…        x                     S
        M,S/M);
                                             S   S+x
                                                                    fine

                                             i   i+1
Media aritmetica di M numeri reali (2)
                                                          inizio
M = input(‘Inserire il numero di …
                                                               M
       valori reali di cui fare la media: ’);
S = 0;
for i = 1 : M                                             S        0
    x = input(‘Inserire valore: ’);
    S = S + x;
                                                           i       1
end
fprintf(‘n La media dei %i numeri…
       reali inseriti risulta %e n’,…              V                  F
                                                          i≤M
       M,S/M);
                                                x                       S

                                           S    S+x
                                                                       fine

                                            i       i+1
Fattoriale di un numero naturale (1)
                                                    inizio
N = input(‘Inserire il numero naturale…
                                                        N
        di cui fare il fattoriale: ’);
P = 1;
while N > 1                                         P       1
       P = P * N;
       N = N - 1;
                                              V                 F
end                                                 N>1
fprintf(‘n Il fattoriale del numero…
                                          P   P*N
        inserito risulta %e n’, P);                             P

                                          N   N-1
                                                                fine
Fattoriale di un numero naturale (2)
                                                    inizio
N = input(‘Inserire il numero naturale…
                                                        N
       di cui fare il fattoriale: ’);
P = 1;
for i = 2 : N                                       P       1
    P = P * i;
end
                                              V                 F
fprintf(‘n Il fattoriale del numero…               N>1
       inserito risulta %e n’, P);
                                          P   P*N                P

                                          N   N-1
                                                                fine
Massimo e minimo di tre numeri
a = input(‘Primo numero: ’);           inizio
b = input(‘Secondo numero: ’);
c = input(‘Terzo numero: ’);           a,b,c            m   a
M = a;
if b > M                               Ma           V
                                                        b<m
   M = b;
end                                             m   b
                                   V
                                                            F
                                       b>M
if c > M
   M = c;                       Mb
                                           F
end                                                 V
                                                        c<m
m = a;
                                                m   c
if b < m                           V
                                                            F
                                       c>M
   m = b;
                                Mc
end
                                           F
if c < m                                                M,m
   m = c;
end
                                                        fine
fprintf(‘n Valore massimo: %e n’, M);
fprintf(‘n Valore minimo: %e n’, m);
Ordinamento di tre numeri
                                                         V
                                            inizio
a = input(‘Primo numero: ’);                                 a>c
b = input(‘Secondo numero: ’);
                                                     v   c
                                            a,b,c              F
c = input(‘Terzo numero: ’);
if a > b                                 V a>b       c   a
   v = a;
                                       va
   a = b;                                            a   v
                                                F
   b = v;
                                      ab
end
                                                         V   b>c
if a > c
                                      bv
   v = c;                                            v   c     F
   c = a;
   a = v;                                            c   b
end
                                                     b   v
if b > c
   v = c;
   c = b;
                                                             M,m
   b = v;
end
                                                             fine
fprintf(‘n Valori ordinati: %e %e %en’,a,b,c);
Massimo e minimo di un vettore (1)
x = input(' fornire un vettore     ');
n = length(x);
valmax = x(1);
valmin = x(1);
cont = 2;
while cont <= n
    if x(cont) > valmax
        valmax = x(cont);
    end
    if x(cont) < valmin
        valmin = x(cont);
    end
    cont = cont + 1;
end
fprintf('n massimo del vettore = %e n',valmax);
fprintf('n minimo del vettore = %e n',valmin);
Massimo e minimo di un vettore (2)
x = input(' fornire un vettore     ');
n = length(x);
valmax = x(1);
valmin = x(1);
for cont = 2 : n
    if x(cont) > valmax
        valmax = x(cont);
    end
    if x(cont) < valmin
        valmin = x(cont);
    end
end
fprintf('n massimo del vettore = %e n',valmax);
fprintf('n minimo del vettore = %e n',valmin);
Ordinamento di un vettore
x = input('Vettore da ordinare: ');
n = length(x);
for i = 1 : n - 1
     pmin = i;
     for j = i + 1 : n
          if x(j) < x(pmin)
             pmin = j;
          end
     end
     if pmin > i
         v = x(i);
         x(i) = x(pmin);
         x(pmin) = v;
     end
end
disp('Vettore ordinato: ')
disp(x)
Kernel polinomiale
Scrivere una funzione per costruire una matrice quadrata G i cui
elementi sono definiti dalla relazione
                                                    3
                                                
                               m
                  Gi , j =  ∑ Ai ,k ⋅ A j ,k + 1 ,
(*)                                                      i, j = 1,..., n
                            k =1                
dove Ai,k, (i = 1,…,n, k = 1,…,m) denota                l’elemento di posto (i,k) di
una matrice n x m A. La matrice A                       deve essere parametro di
ingresso del sottoprogramma e la                         matrice G deve essere
parametro di uscita.
Scrivere una macro che:
- legga da file una matrice A di dimensione n x m;
- utilizzi la funzione costruita in precedenza per calcolare la
matrice n x n G con elementi definiti da (*);
- calcoli il numero di righe di G che soddisfano la condizione
                                             n
                                     Gi ,i > ∑ Gi , j
                                             j =1
                                             j ≠i
Kernel polinomiale (1.1)
function G = kernelpol(A)

[n,m] = size(A);

for i = 1 : n
     for j = i : n
         s = 0;
         for k = 1 : m
              s = s + A(i,k)*A(j,k);
         end
         G(i,j)=(s+1)^3;
     end
     for j = 1 : i-1
          G(i,j) = G(j,i);
     end
end
Kernel polinomiale (1.2)
function G = kernelpol_mat(A)

G = (A*A'+1).^3;


                                 ‘.^’ esegue l’operazione di
                                 elevamento a potenza su ogni
sommare uno scalare a una        componente della matrice
matrice equivale a sommare
lo scalare ad ogni elemento
della matrice stessa



                                                                       7 10 
                                                      A^ 2 = A * A = 15 22  
            Vale anche per le operazioni ‘*’ e ‘/’
                                                                              
                                       1 2                            1 4 
                          Esempio: A = 
                                       3 4          A.^ 2 = A. * A =  9 16 
                                                                              
                                                                            
Kernel polinomiale (2.1)
load matrice

G = kernelpol(A);

[n,m] =   size(A);
cont1 =   0;
for i =   1:n
    s=    0;
    for   j=1:n
          if (j ~= i)
              s = s + abs(G(i,j));
          end
   end
   if (abs(G(i,i)) > s)
       cont1 = cont1 + 1;
   end
end
fprintf(‘Numero di righe che soddisfano la condizione: %i...
         n n’, cont1);
Kernel polinomiale (2.2)
load matrice

G = kernelpol_mat(A);

cont1 = length(find(diag(abs(G)) > sum(abs(G-diag(diag(G)))’)’));

fprintf(‘Numero di righe che soddisfano la condizione: %i n n’,
cont1);
                                                  diag(matrice) restituisce un
               sum(matrice) restituisce un
                                                  vettore contenente gli
               vettore riga in cui l’i-esima
                                                  elementi sulla diagonale della
               componente coincide con la
                                                  matrice
               somma degli elementi della
               i-esima colonna della matrice

                                               diag(vettore) restituisce una
find(expr) valuta l’espressione ‘expr’         matrice quadrata con gli elementi
avente al proprio interno un array e           del vettore sulla diagonale e tutti
ritorna le componenti dell’ array in cui       gli elementi non diagonali nulli
expr è verificata
Kernel gaussiano
Scrivere una funzione per costruire una matrice quadrata G i cui
elementi sono definiti dalla relazione
                              ∑ (A − A )2 
                                  m
                                                  
                                      i ,k    j ,k
(*)              Gi , j = exp −                   , i, j = 1,..., n
                                 k =1
                                            2
                                                  
                                         2σ
                                                  
dove Ai,k, (i = 1,…,n, k = 1,…,m) denota l’elemento di posto (i,k) di
una matrice n x m A. La matrice A e il valore σ devono essere
parametri di ingresso del sottoprogramma e la matrice G deve
essere parametro di uscita.
Scrivere una macro che:
- definisca la matrice A = hilb(500) (matrice di Hilbert di ordine
500) e la variabile sigma = 1;
- utilizzi la funzione costruita in precedenza per calcolare la
matrice n x n G con elementi definiti da (*);             n

                                                                   ∑
- calcoli la norma ∞ della matrice G, definita come max     Gi , j
                                                      i =1,...,n
                                                                   j =1
Kernel gaussiano (1.1)
function G = kernelgauss(A,sigma)

[n,m] = size(A);

for i = 1 :    n
    for j =    1:n
        s=     0;
        for    k=1:m
               s = s + (A(i,k)-A(j,k))^2;
            end
            G(i,j) = exp(-s/(2*sigma^2));
      end
end
Kernel gaussiano (1.2)
function G = kernelgauss_mat(A,sigma)

                                      norm(vettore,n) calcola la norma n
n = size(A,1);
                                      di un vettore (la norma di default
                                      è quella euclidea (n=2))
for i = 1 : n
    for j = i+1 : n
        G(i,j) = exp(-(norm(A(i,:)- A(j,:))^2)/(2*sigma));
    end
end
G = triu(G) + triu(G,1)‘ + eye(n);
      1.             2.        3.

                                    1. costruisco la parte strettamente
 la matrice G è simmetrica e        triangolare superiore di G
 ha ogni elemento diagonale         2. la ribalto nella parte strettamente
 uguale a 1                         triangolare inferiore
                                    3. metto 1 sulla diagonale
Kernel gaussiano (2.1)
A = hilb(500);
sigma = 1;

G = kernelgauss(A,sigma);

n = size(A,1);
norma_inf = 0;
for i = 1 : n
    s = 0;
    for j = 1 : n
        s = s + abs(G(i,j));
    end
    if (s > norma_inf)
        norma_inf = s;
    end
end
fprintf('n Norma infinito della matrice: %e n n',norma_inf);
Kernel gaussiano (2.2)
A = hilb(500);
sigma = 1;

G = kernelgauss_mat(A,sigma);

fprintf('n Norma infinito della matrice: %e n n',...
norm(A,inf););



           norm(matrice,n) calcola la norma n di una matrice
           (la norma di default è la norma 2).
           Le possibili opzioni per n sono 1, 2, inf e ‘fro’
Metodo di Doolittle
Scrivere un sottoprogramma per calcolare la decomposizione LU di
una matrice n x n B, dove L è una matrice n x n triangolare
inferiore con elementi diagonali uguali a 1 e U è una matrice n x n
triangolare superiore, con il metodo di Doolittle: per i = 1,2,…,n,
            U ij = Bij − ∑i −1 LikU kj         j = i, i + 1,..., n
                            k =1
            
                       (                  )
             L ji = B ji − ∑k =1 L jkU ki U ii
                              i −1
                                                j = i + 1, i + 2,..., n
            
             Lii = 1
            
Deve essere inoltre verificata l’applicabilità del metodo.
Scrivere un programma che:
- legga una matrice n x n A e un vettore n x 1 b;
- utilizzi la funzione costruita in precedenza per calcolare le
matrici L e U tali che A = L*U;
- calcoli la soluzione del sistema Ax = b risolvendo i due sistemi
triangolari Ly = b e Ux = y (usare il sottoprogramma sist_tria);
- scriva la soluzione del sistema Ax = b.
Metodo di Doolittle (2)
function x = sist_tria(T,b,info)
%
% risoluzione sistema triangolare inferiore (info==0)
% o triangolare superiore (info==1)
%
n=length(T);
x = zeros(n,1);
if info == 0
   x(1) = b(1)/T(1,1);
   for i = 2 : n
       x(i) = ( b(i) - T(i,1:i-1) * x(1:i-1) ) / T(i,i);
   end
end
if info == 1
   x(n) = b(n)/T(n,n);
   for i = n-1 : -1 : 1
       x(i) = ( b(i) - T(i,i+1:n) * x(i+1:n) ) / T(i,i);
   end
end

Más contenido relacionado

Más de Majong DevJfu

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA CloudMajong DevJfu
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processesMajong DevJfu
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product lineMajong DevJfu
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformationMajong DevJfu
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven ArchitectureMajong DevJfu
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture PortfolioMajong DevJfu
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural stylesMajong DevJfu
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architectureMajong DevJfu
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a productMajong DevJfu
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural stylesMajong DevJfu
 

Más de Majong DevJfu (20)

9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud9 - Architetture Software - SOA Cloud
9 - Architetture Software - SOA Cloud
 
8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes8 - Architetture Software - Architecture centric processes
8 - Architetture Software - Architecture centric processes
 
7 - Architetture Software - Software product line
7 - Architetture Software - Software product line7 - Architetture Software - Software product line
7 - Architetture Software - Software product line
 
6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation6 - Architetture Software - Model transformation
6 - Architetture Software - Model transformation
 
5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture5 - Architetture Software - Metamodelling and the Model Driven Architecture
5 - Architetture Software - Metamodelling and the Model Driven Architecture
 
4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio4 - Architetture Software - Architecture Portfolio
4 - Architetture Software - Architecture Portfolio
 
3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles3 - Architetture Software - Architectural styles
3 - Architetture Software - Architectural styles
 
2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture2 - Architetture Software - Software architecture
2 - Architetture Software - Software architecture
 
1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product1 - Architetture Software - Software as a product
1 - Architetture Software - Software as a product
 
10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles10 - Architetture Software - More architectural styles
10 - Architetture Software - More architectural styles
 
Uml3
Uml3Uml3
Uml3
 
Uml2
Uml2Uml2
Uml2
 
6
66
6
 
5
55
5
 
4 (uml basic)
4 (uml basic)4 (uml basic)
4 (uml basic)
 
3
33
3
 
2
22
2
 
1
11
1
 
Tmd template-sand
Tmd template-sandTmd template-sand
Tmd template-sand
 
26 standards
26 standards26 standards
26 standards
 

Calcolo Numerico - Esercizi 1

  • 1. Programmi MATLAB Luca Zanni, Marco Prato Calcolo Numerico Corsi di Laurea in Matematica e Informatica
  • 2. Somma di M numeri reali (1) inizio M = input(‘Inserire il numero di … M numeri naturali da sommare: ’); S = 0; i = 1; S 0 while i <= M S = S + i; i 1 i = i + 1; end fprintf(‘n La somma dei primi %i… V F i≤M numeri naturali risulta %i n’,… M,S); S S+i S i i+1 fine
  • 3. Somma di M numeri reali (2) inizio M = input(‘Inserire il numero di … M numeri naturali da sommare: ’); S = 0; for i = 1 : M S 0 S = S + i; end i 1 fprintf(‘n La somma dei primi %i… numeri naturali risulta %i n’,… M,S); V F i≤M S S+i S i i+1 fine
  • 4. Media aritmetica di M numeri reali (1) inizio M = input(‘Inserire il numero di … M valori reali di cui fare la media: ’); S = 0; i = 1; S 0 while i <= M x = input(‘Inserire valore: ’); i 1 S = S + x; i = i + 1; end V F i≤M fprintf(‘n La media dei %i numeri… reali inseriti risulta %e n’,… x S M,S/M); S S+x fine i i+1
  • 5. Media aritmetica di M numeri reali (2) inizio M = input(‘Inserire il numero di … M valori reali di cui fare la media: ’); S = 0; for i = 1 : M S 0 x = input(‘Inserire valore: ’); S = S + x; i 1 end fprintf(‘n La media dei %i numeri… reali inseriti risulta %e n’,… V F i≤M M,S/M); x S S S+x fine i i+1
  • 6. Fattoriale di un numero naturale (1) inizio N = input(‘Inserire il numero naturale… N di cui fare il fattoriale: ’); P = 1; while N > 1 P 1 P = P * N; N = N - 1; V F end N>1 fprintf(‘n Il fattoriale del numero… P P*N inserito risulta %e n’, P); P N N-1 fine
  • 7. Fattoriale di un numero naturale (2) inizio N = input(‘Inserire il numero naturale… N di cui fare il fattoriale: ’); P = 1; for i = 2 : N P 1 P = P * i; end V F fprintf(‘n Il fattoriale del numero… N>1 inserito risulta %e n’, P); P P*N P N N-1 fine
  • 8. Massimo e minimo di tre numeri a = input(‘Primo numero: ’); inizio b = input(‘Secondo numero: ’); c = input(‘Terzo numero: ’); a,b,c m a M = a; if b > M Ma V b<m M = b; end m b V F b>M if c > M M = c; Mb F end V c<m m = a; m c if b < m V F c>M m = b; Mc end F if c < m M,m m = c; end fine fprintf(‘n Valore massimo: %e n’, M); fprintf(‘n Valore minimo: %e n’, m);
  • 9. Ordinamento di tre numeri V inizio a = input(‘Primo numero: ’); a>c b = input(‘Secondo numero: ’); v c a,b,c F c = input(‘Terzo numero: ’); if a > b V a>b c a v = a; va a = b; a v F b = v; ab end V b>c if a > c bv v = c; v c F c = a; a = v; c b end b v if b > c v = c; c = b; M,m b = v; end fine fprintf(‘n Valori ordinati: %e %e %en’,a,b,c);
  • 10. Massimo e minimo di un vettore (1) x = input(' fornire un vettore '); n = length(x); valmax = x(1); valmin = x(1); cont = 2; while cont <= n if x(cont) > valmax valmax = x(cont); end if x(cont) < valmin valmin = x(cont); end cont = cont + 1; end fprintf('n massimo del vettore = %e n',valmax); fprintf('n minimo del vettore = %e n',valmin);
  • 11. Massimo e minimo di un vettore (2) x = input(' fornire un vettore '); n = length(x); valmax = x(1); valmin = x(1); for cont = 2 : n if x(cont) > valmax valmax = x(cont); end if x(cont) < valmin valmin = x(cont); end end fprintf('n massimo del vettore = %e n',valmax); fprintf('n minimo del vettore = %e n',valmin);
  • 12. Ordinamento di un vettore x = input('Vettore da ordinare: '); n = length(x); for i = 1 : n - 1 pmin = i; for j = i + 1 : n if x(j) < x(pmin) pmin = j; end end if pmin > i v = x(i); x(i) = x(pmin); x(pmin) = v; end end disp('Vettore ordinato: ') disp(x)
  • 13. Kernel polinomiale Scrivere una funzione per costruire una matrice quadrata G i cui elementi sono definiti dalla relazione 3   m Gi , j =  ∑ Ai ,k ⋅ A j ,k + 1 , (*) i, j = 1,..., n  k =1  dove Ai,k, (i = 1,…,n, k = 1,…,m) denota l’elemento di posto (i,k) di una matrice n x m A. La matrice A deve essere parametro di ingresso del sottoprogramma e la matrice G deve essere parametro di uscita. Scrivere una macro che: - legga da file una matrice A di dimensione n x m; - utilizzi la funzione costruita in precedenza per calcolare la matrice n x n G con elementi definiti da (*); - calcoli il numero di righe di G che soddisfano la condizione n Gi ,i > ∑ Gi , j j =1 j ≠i
  • 14. Kernel polinomiale (1.1) function G = kernelpol(A) [n,m] = size(A); for i = 1 : n for j = i : n s = 0; for k = 1 : m s = s + A(i,k)*A(j,k); end G(i,j)=(s+1)^3; end for j = 1 : i-1 G(i,j) = G(j,i); end end
  • 15. Kernel polinomiale (1.2) function G = kernelpol_mat(A) G = (A*A'+1).^3; ‘.^’ esegue l’operazione di elevamento a potenza su ogni sommare uno scalare a una componente della matrice matrice equivale a sommare lo scalare ad ogni elemento della matrice stessa  7 10  A^ 2 = A * A = 15 22   Vale anche per le operazioni ‘*’ e ‘/’   1 2 1 4  Esempio: A =  3 4 A.^ 2 = A. * A =  9 16       
  • 16. Kernel polinomiale (2.1) load matrice G = kernelpol(A); [n,m] = size(A); cont1 = 0; for i = 1:n s= 0; for j=1:n if (j ~= i) s = s + abs(G(i,j)); end end if (abs(G(i,i)) > s) cont1 = cont1 + 1; end end fprintf(‘Numero di righe che soddisfano la condizione: %i... n n’, cont1);
  • 17. Kernel polinomiale (2.2) load matrice G = kernelpol_mat(A); cont1 = length(find(diag(abs(G)) > sum(abs(G-diag(diag(G)))’)’)); fprintf(‘Numero di righe che soddisfano la condizione: %i n n’, cont1); diag(matrice) restituisce un sum(matrice) restituisce un vettore contenente gli vettore riga in cui l’i-esima elementi sulla diagonale della componente coincide con la matrice somma degli elementi della i-esima colonna della matrice diag(vettore) restituisce una find(expr) valuta l’espressione ‘expr’ matrice quadrata con gli elementi avente al proprio interno un array e del vettore sulla diagonale e tutti ritorna le componenti dell’ array in cui gli elementi non diagonali nulli expr è verificata
  • 18. Kernel gaussiano Scrivere una funzione per costruire una matrice quadrata G i cui elementi sono definiti dalla relazione  ∑ (A − A )2  m   i ,k j ,k (*) Gi , j = exp − , i, j = 1,..., n k =1 2   2σ   dove Ai,k, (i = 1,…,n, k = 1,…,m) denota l’elemento di posto (i,k) di una matrice n x m A. La matrice A e il valore σ devono essere parametri di ingresso del sottoprogramma e la matrice G deve essere parametro di uscita. Scrivere una macro che: - definisca la matrice A = hilb(500) (matrice di Hilbert di ordine 500) e la variabile sigma = 1; - utilizzi la funzione costruita in precedenza per calcolare la matrice n x n G con elementi definiti da (*); n ∑ - calcoli la norma ∞ della matrice G, definita come max Gi , j i =1,...,n j =1
  • 19. Kernel gaussiano (1.1) function G = kernelgauss(A,sigma) [n,m] = size(A); for i = 1 : n for j = 1:n s= 0; for k=1:m s = s + (A(i,k)-A(j,k))^2; end G(i,j) = exp(-s/(2*sigma^2)); end end
  • 20. Kernel gaussiano (1.2) function G = kernelgauss_mat(A,sigma) norm(vettore,n) calcola la norma n n = size(A,1); di un vettore (la norma di default è quella euclidea (n=2)) for i = 1 : n for j = i+1 : n G(i,j) = exp(-(norm(A(i,:)- A(j,:))^2)/(2*sigma)); end end G = triu(G) + triu(G,1)‘ + eye(n); 1. 2. 3. 1. costruisco la parte strettamente la matrice G è simmetrica e triangolare superiore di G ha ogni elemento diagonale 2. la ribalto nella parte strettamente uguale a 1 triangolare inferiore 3. metto 1 sulla diagonale
  • 21. Kernel gaussiano (2.1) A = hilb(500); sigma = 1; G = kernelgauss(A,sigma); n = size(A,1); norma_inf = 0; for i = 1 : n s = 0; for j = 1 : n s = s + abs(G(i,j)); end if (s > norma_inf) norma_inf = s; end end fprintf('n Norma infinito della matrice: %e n n',norma_inf);
  • 22. Kernel gaussiano (2.2) A = hilb(500); sigma = 1; G = kernelgauss_mat(A,sigma); fprintf('n Norma infinito della matrice: %e n n',... norm(A,inf);); norm(matrice,n) calcola la norma n di una matrice (la norma di default è la norma 2). Le possibili opzioni per n sono 1, 2, inf e ‘fro’
  • 23. Metodo di Doolittle Scrivere un sottoprogramma per calcolare la decomposizione LU di una matrice n x n B, dove L è una matrice n x n triangolare inferiore con elementi diagonali uguali a 1 e U è una matrice n x n triangolare superiore, con il metodo di Doolittle: per i = 1,2,…,n, U ij = Bij − ∑i −1 LikU kj j = i, i + 1,..., n  k =1  ( )  L ji = B ji − ∑k =1 L jkU ki U ii i −1 j = i + 1, i + 2,..., n   Lii = 1  Deve essere inoltre verificata l’applicabilità del metodo. Scrivere un programma che: - legga una matrice n x n A e un vettore n x 1 b; - utilizzi la funzione costruita in precedenza per calcolare le matrici L e U tali che A = L*U; - calcoli la soluzione del sistema Ax = b risolvendo i due sistemi triangolari Ly = b e Ux = y (usare il sottoprogramma sist_tria); - scriva la soluzione del sistema Ax = b.
  • 24. Metodo di Doolittle (2) function x = sist_tria(T,b,info) % % risoluzione sistema triangolare inferiore (info==0) % o triangolare superiore (info==1) % n=length(T); x = zeros(n,1); if info == 0 x(1) = b(1)/T(1,1); for i = 2 : n x(i) = ( b(i) - T(i,1:i-1) * x(1:i-1) ) / T(i,i); end end if info == 1 x(n) = b(n)/T(n,n); for i = n-1 : -1 : 1 x(i) = ( b(i) - T(i,i+1:n) * x(i+1:n) ) / T(i,i); end end