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