Calcolo Numerico - Esercizi 1
-
Upload
majong-devjfu -
Category
Documents
-
view
2.044 -
download
2
Transcript of Calcolo Numerico - Esercizi 1
ProgrammiProgrammiMATLABMATLAB
Luca Zanni, Marco Prato
Calcolo Numerico
Corsi di Laurea in Matematica e Informatica
SommaSomma didi M M numerinumeri realireali (1)(1)
M = input(‘Inserire il numero di …
numeri naturali da sommare: ’);
S = 0;
i = 1;
while i <= M
S = S + i;
i = i + 1;
inizio
M
S 0
i 1i = i + 1;
end
fprintf(‘\n La somma dei primi %i…
numeri naturali risulta %i \n’,…
M,S);
V Fi ≤ M
S S+i
i i+1
S
fine
SommaSomma didi M M numerinumeri realireali (2)(2)
M = input(‘Inserire il numero di …
numeri naturali da sommare: ’);
S = 0;
for i = 1 : M
S = S + i;
end
fprintf(‘\n La somma dei primi %i…
inizio
M
S 0
i 1fprintf(‘\n La somma dei primi %i…
numeri naturali risulta %i \n’,…
M,S); V Fi ≤ M
S S+i
i i+1
S
fine
Media Media aritmeticaaritmetica didi M M numerinumeri realireali (1)(1)
M = input(‘Inserire il numero di …
valori reali di cui fare la media: ’);
S = 0;
i = 1;
while i <= M
x = input(‘Inserire valore: ’);
S = S + x;
inizio
M
S 0
i 1S = S + x;
i = i + 1;
end
fprintf(‘\n La media dei %i numeri…
reali inseriti risulta %e \n’,…
M,S/M);
V Fi ≤ M
x
S S+x
S
fine
i i+1
Media Media aritmeticaaritmetica didi M M numerinumeri realireali (2)(2)
M = input(‘Inserire il numero di …
valori reali di cui fare la media: ’);
S = 0;
for i = 1 : M
x = input(‘Inserire valore: ’);
S = S + x;
end
inizio
M
S 0
i 1end
fprintf(‘\n La media dei %i numeri…
reali inseriti risulta %e \n’,…
M,S/M);
V Fi ≤ M
x
S S+x
S
fine
i i+1
FattorialeFattoriale didi un un numeronumero naturalenaturale (1)(1)
N = input(‘Inserire il numero naturale…
di cui fare il fattoriale: ’);
P = 1;
while N > 1
P = P * N;
N = N - 1;
end V F
inizio
N
P 1
N > 1end
fprintf(‘\n Il fattoriale del numero…
inserito risulta %e \n’, P);
V FN > 1
P P*N P
fineN N-1
FattorialeFattoriale didi un un numeronumero naturalenaturale (2)(2)
N = input(‘Inserire il numero naturale…
di cui fare il fattoriale: ’);
P = 1;
for i = 2 : N
P = P * i;
end
fprintf(‘\n Il fattoriale del numero… V F
inizio
N
P 1
N > 1fprintf(‘\n Il fattoriale del numero…
inserito risulta %e \n’, P);
V FN > 1
P P*N P
fineN N-1
Massimo e Massimo e minimominimo didi tretre numerinumeri
a = input(‘Primo numero: ’);
b = input(‘Secondo numero: ’);
c = input(‘Terzo numero: ’);
M = a;
if b > M
M = b;
end
if c > M
M = c;
V
inizio
a,b,c
M a
b > M
M b
V
F
m a
b < m
m b
M = c;
end
m = a;
if b < m
m = b;
end
if c < m
m = c;
end
fprintf(‘\n Valore massimo: %e \n’, M);
fprintf(‘\n Valore minimo: %e \n’, m);
M,m
fine
FM b
F
c > M
M c
F
c < m
m c
V
V
OrdinamentoOrdinamento didi tretre numerinumeri
a = input(‘Primo numero: ’);
b = input(‘Secondo numero: ’);
c = input(‘Terzo numero: ’);
if a > b
v = a;
a = b;
b = v;
end
if a > c
V
F
inizio
a,b,c
a > b
v a
a b
b v
V
F
a > c
v c
c a
a v
V b > cif a > c
v = c;
c = a;
a = v;
end
if b > c
v = c;
c = b;
b = v;
end
fprintf(‘\n Valori ordinati: %e %e %e\n’,a,b,c);
M,m
fine
b vV
F
b > c
v c
c b
b v
Massimo e Massimo e minimominimo didi un un vettorevettore (1)(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);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 Massimo e minimominimo didi un un vettorevettore (2)(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);
endend
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);
OrdinamentoOrdinamento didi un un vettorevettore
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;
endend
end
if pmin > i
v = x(i);
x(i) = x(pmin);
x(pmin) = v;
end
end
disp('Vettore ordinato: ')
disp(x)
Kernel Kernel polinomialepolinomialeScrivere una funzione per costruire una matrice quadrata G i cuielementi sono definiti dalla relazione
(*) njiAAGm
k
kjkiji ,...,1, ,1
3
1
,,, =
+⋅= ∑
=
dove Ai,k, (i = 1,…,n, k = 1,…,m) denota l’elemento di posto (i,k) diuna matrice n x m A. La matrice A deve essere parametro diingresso del sottoprogramma e la matrice G deve essereparametro di uscita.ingresso del sottoprogramma e la matrice G deve essereparametro 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 lamatrice n x n G con elementi definiti da (*);- calcoli il numero di righe di G che soddisfano la condizione
∑≠=
>n
ijj
jiii GG1
,,
Kernel Kernel polinomialepolinomiale (1.1)(1.1)
function G = kernelpol(A)
[n,m] = size(A);
for i = 1 : n
for j = i : n
s = 0;
for k = 1 : m 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 Kernel polinomialepolinomiale (1.2)(1.2)
function G = kernelpol_mat(A)
G = (A*A'+1).^3;
‘.^’ esegue l’operazione di elevamento a potenza su ogni componente della matricesommare uno scalare a una
matrice equivale a sommare matrice equivale a sommare lo scalare ad ogni elemento della matrice stessa
Vale anche per le operazioni ‘*’ e ‘/’
Esempio:
=
43
21A
==
2215
107*2^ AAA
==
169
41*.2.^ AAA
Kernel Kernel polinomialepolinomiale (2.1)(2.1)
load matrice
G = kernelpol(A);
[n,m] = size(A);
cont1 = 0;
for i = 1 : n
s = 0;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 Kernel polinomialepolinomiale (2.2)(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); cont1);
diag(matrice) restituisce un vettore contenente gli elementi sulla diagonale della matrice
diag(vettore) restituisce una matrice quadrata con gli elementi del vettore sulla diagonale e tutti gli elementi non diagonali nulli
sum(matrice) restituisce un vettore riga in cui l’i-esima componente coincide con la somma degli elementi della i-esima colonna della matrice
find(expr) valuta l’espressione ‘expr’ avente al proprio interno un array e ritorna le componenti dell’ array in cuiexpr è verificata
Kernel Kernel gaussianogaussianoScrivere una funzione per costruire una matrice quadrata G i cuielementi sono definiti dalla relazione
(*)( )
njiσ
AA
G
m
kkjki
ji ,...,1, ,2
exp2
1
2
,,
, =
∑ −
−= =
dove Ai,k, (i = 1,…,n, k = 1,…,m) denota l’elemento di posto (i,k) diuna matrice n x m A. La matrice A e il valore σ devono essereuna matrice n x m A. La matrice A e il valore σ devono essereparametri di ingresso del sottoprogramma e la matrice G deveessere parametro di uscita.
Scrivere una macro che:- definisca la matrice A = hilb(500) (matrice di Hilbert di ordine500) e la variabile sigma = 1;- utilizzi la funzione costruita in precedenza per calcolare lamatrice n x n G con elementi definiti da (*);- calcoli la norma ∞ della matrice G, definita come ∑
==
n
j
jini
G1
,,...,1
max
Kernel Kernel gaussianogaussiano (1.1)(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 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 Kernel gaussianogaussiano (1.2)(1.2)
function G = kernelgauss_mat(A,sigma)
n = size(A,1);
for i = 1 : n
for j = i+1 : n
G(i,j) = exp(-(norm(A(i,:)- A(j,:))^2)/(2*sigma));
end
norm(vettore,n) calcola la norma n di un vettore (la norma di default è quella euclidea (n=2))
end
end
G = triu(G) + triu(G,1)‘ + eye(n);
la matrice G è simmetrica e ha ogni elemento diagonale uguale a 1
1. costruisco la parte strettamente triangolare superiore di G2. la ribalto nella parte strettamente triangolare inferiore3. metto 1 sulla diagonale
1. 2. 3.
Kernel Kernel gaussianogaussiano (2.1)(2.1)
A = hilb(500);
sigma = 1;
G = kernelgauss(A,sigma);
n = size(A,1);
norma_inf = 0;
for i = 1 : nfor 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 Kernel gaussianogaussiano (2.2)(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’
MetodoMetodo didi DoolittleDoolittleScrivere un sottoprogramma per calcolare la decomposizione LU diuna matrice n x n B, dove L è una matrice n x n triangolareinferiore con elementi diagonali uguali a 1 e U è una matrice n x ntriangolare superiore, con il metodo di Doolittle: per i = 1,2,…,n,
( )
=
++=−=
+=−=
∑
∑−
=
−
=
1
,...,2,1
,...,1,
1
1
1
1
ii
i
k kijkjiji
i
k kjikijij
L
niijUULBL
niijULBU
=1iiL
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 lematrici L e U tali che A = L*U;- calcoli la soluzione del sistema Ax = b risolvendo i due sistemitriangolari Ly = b e Ux = y (usare il sottoprogramma sist_tria);- scriva la soluzione del sistema Ax = b.
MetodoMetodo didi Doolittle (2)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); 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