• Like
Calcolo Numerico - Esercizi 1
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

Calcolo Numerico - Esercizi 1

  • 1,919 views
Published

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,919
On SlideShare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
23
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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