Esercizi Per Calcolo Numerico Matlab
Esercizi Per Calcolo Numerico Matlab
Esercizio 1
x = [1 ; 4];
y = [2; 8];
t1 = x .* y; %t1 [2;32] 2×1 double
t2 = x * y; %Errore non si usa * per moltiplicare ma .*
t3 = x * y'; % [2,8;8,32] 2×2 double
t4 = x ./ y; % [0.5000;0.5000] 2×1 double
A = [-1 2; 5 4];
B = A .^ 2; %[1,4;25,16] 2×2 double
C = exp(A); %[0.3679, 7.3891 ;148.4132, 54.5982]
D = sqrt(A); %[0 + 1i,1.4142 + 0i;2.2361 + 0i,2 + 0i]
Esercizio 2
% Vettore z di dimensione 20
z_for = zeros(1, 20);
for k = 1:20
z_for(k) = k;
end
z_vec = 1:20;
Esercizio 3
function n = norma2(x)
n = sqrt(sum(x.^2));
end
x = [5, -8, 7];
y = [-3.2, 5, 10^-4, 2.8, 3*10^2];
w = zeros(1, 30); % Inizializzazione di w
w(1) = 1;
for i = 2:30
w(i) = 3 * i / (i - 1); % Calcolo degli elementi di w
end
fprintf('Norma di x (funzione norma2): %.4f\n', norm_x);
Esercizio 4
function n = norma_p(x, p)
% Controlla se p è minore di 1
if p < 1
error('Il valore di p deve essere maggiore o uguale a 1');
end
% Calcola la norma p
if p == inf
% Norma infinita: massimo valore assoluto degli elementi di x
n = max(abs(x));
else
% Norma p: (somma dei valori assoluti elevati a p)^(1/p)
n = (sum(abs(x).^p))^(1/p);
end
end
x = [3, -4, 5, -6];
esempio = norma_p(x, 2);
fprintf('Norma di x con p = inf: %.4f\n', esempio);
Esercizio 5
for i=1:m
for j=1:n
if(A(i,j)<minA)
minA=A(i,j);
rigaA=i;
colA=j;
end
end
end
end
A = [4,2,3;4,5,6;7,1,9];
[min_elem, row_idx, col_idx] = minimo_elemento(A);
fprintf('Il minimo elemento di A è: %.2f\n', min_elem);
fprintf('Posizione: (%d, %d)\n', row_idx, col_idx);
Esercizio 6
for i=1:m
for j=1:n
if(A(i,j)<maxA)
maxA=abs(A(i,j));
end
end
end
end
A = [1.504e-33, 2, 1.550e-1;
3, 21, 5;
5, 1e-2, -4e2];
norma_inf_mia = elem_maggiore(A);
fprintf('La norma infinito di A è: %.2f\n', norma_inf_mia);
norma_inf_matlab =norm(A, inf);
fprintf('La norma infinito di A NATIVA è: %.2f\n', norma_inf_matlab);
fprintf('Errore relativo: %.4e\n', (abs(norma_inf_mia - norma_inf_matlab/norma_inf_matlab)));
Esercizio 7
function y = prodottoMatriceVettore(A,x)
[n,m] = size(A);
t = length(x);
if t~=n
error("devono avere lo stesso numero di riche o colonne");
end
y = zeros(m,1); %1 column
for i = 1:n
sum = 0;
for j=1:m
sum=sum + A(i,j)*x(j);
end
y(i) = sum;
end
end
Esercizio 8
k = 0;
somma = 0;
N = 0;
% Ciclo while finché la somma non supera 2000
while somma <= 2000
somma = somma + 3 * k^2;
k = k + 1;
N = N + 1;
end
fprintf('Il numero minimo di termini richiesti è: %d\n', N);
fprintf('La somma finale è: %.0f\n', somma);
Esercizio 9
function y = approssima_esponenziale(x, n)
y = 0;
for k = 0:n
y = y + (x^k) / factorial(k);
end
end
y1_esatto = exp(x1);
errore_relativo1 = abs(y1_approssimato - y1_esatto) / abs(y1_esatto);
fprintf('Errore relativo per e^30: %.4e\n\n', errore_relativo1);
Esercitazione 2
Esercizio 1 solupper
Esercizio 2 sollower
b1 = rand(5,1);
L1 = rand(5);
L1 = tril(L1);
Esercizio 3 gauss1
for k = 1:n-1
if abs(A(k,k)) < eps
error('Fattorizzazione non calcolabile: elemento diagonale zero');
else
for i = k+1:n
A(i,k) = A(i,k)/A(k,k);
for j = k+1:n
A(i,j) = A(i,j) - A(k,j)*A(i,k);
end
end
end
end
U = triu(A);
L = (A - U) + eye(n);
end
% Script per verificare la correttezza di gauss1
[L,U] = gauss1(A);
y = L \ b;
xc = U \ y;
temp = A(k,:);
A(k,:) = A(ind,:);
A(ind,:) = temp;
end
U = triu(A);
L = (A - U) + eye(n);
end
% Script per verificare la correttezza di gauss2
[L,U,p] = gauss2(A);
b = b(p);
y = L \ b;
x = U \ y;
idx = 1:3;
if ~isequal(p, idx)
fprintf('Pivoting effettuato\n');
else
fprintf('No pivoting\n');
end
function A = hilbert(n)
A = zeros(n);
for i = 1:n
for j = 1:n
A(i,j) = 1/(i+j-1);
end
end
end
Esercizio 6 sol_sist
for n = 4 : 2 : 10
A = hilbert(n);
x_es = ones(n, 1);
b = A * x_es;
fprintf('Caso n = %d \n', n)
fprintf('Ncond = %e \n', ncond)
fprintf('Norma residuo = %e \n', normr)
fprintf('Stima errore = %e \n', d)
fprintf('Errore effettivo = %e \n\n', norm(xc - x_es)/norm(x_es))
end
Esercitazione 3
Esercizio 1 Cholesky
for j = 1:n
for i = j:n
% Calcola il valore s
s = A(i, j) - L(i, 1:j-1) * L(j, 1:j-1)';
% Nota: L(i, 1:j-1) * L(j, 1:j-1)' rappresenta la somma per k = 1, ..., j-1
if i == j % Caso diagonale
if s <= 0
error("La matrice non è definita positiva");
else
L(j, j) = sqrt(s); % Calcola l'elemento diagonale
deter = deter * s; % Aggiorna il determinante
end
else % Caso non diagonale
L(i, j) = s / L(j, j); % Calcola l'elemento fuori diagonale
end
end
end
end
Esercizio 2 QR
for k = 1:n
% Calcolo del vettore di Householder per il k-esimo passo.
sigma(k) = sqrt(sum(A(k:n, k).^2)); % Calcola la norma 2 del vettore colonna k a
partire dalla riga k.
A(k, k) = A(k, k) + sigma(k); % Modifica il pivot per costruire il vettore di
Householder.
alpha = sigma(k) * A(k, k); % Calcola il parametro alpha per la normalizzazione.
for j = k+1:n
% Calcolo di tau per eliminare gli elementi sotto il pivot.
tau = (A(k:n, k)' * A(k:n, j)) / alpha; % Proiezione del vettore j lungo il
vettore di Householder.
A(k:n, j) = A(k:n, j) - tau * A(k:n, k); % Aggiorna il vettore colonna j.
end
end
% Calcolare la diagonale di A
d = diag(A);
for i = 1:n
if abs(d(i)) < eps
error('Un elemento diagonale è nullo');
end
end
% Iterazioni di Jacobi
for k = 1:kmax
xold = x;
for i = 1:n
s = 0;
for j = 1:n
if j ~= i
s = s + A(i,j) * xold(j);
end
end
x(i) = (b(i) - s) / A(i,i);
end
err(k) = norm(x - xes) / norm(xes); % Calcolo errore relativo
end
end
% Script per testare il metodo di Jacobi
n = 20;
A = diag(-3*ones(1, n)) + diag(ones(1, n-1), 1) + diag(ones(1, n-1), -1);
b = ones(n, 1); % Vettore b di dimensione n
d = diag(A);
for i = 1:n
if abs(d(i)) < eps
error('Un elemento diagonale è nullo');
end
end
for k = 1:kmax
for i = 1:n
% Calcola la somma dei termini prima dell'elemento diagonale
somma_prima = A(i, 1:i-1) * x(1:i-1);
n = 20;
A = diag(-3*ones(1, n)) + diag(ones(1, n-1), 1) + diag(ones(1, n-1), -1); % Matrice
tridiagonale
b = ones(n, 1); % Vettore b di dimensione n
err_GS'
Esercitazione 4
1) Metodo di Bisezione per la Radice Quadrata
% Valutazione iniziale
fa = f(a);
fb = f(b);
% Algoritmo di bisezione
for k = 1:Nmax
% Calcolo del punto medio
c = a + (b - a) / 2;
fc = f(c);
% Risultato
fprintf('La radice trovata è c = %.10f dopo %d iterazioni.\n', c, k);
if x <= 0
error('Dato iniziale non compatibile')
end
for k = 1 : Nmax
if x == 0
error('Metodo non applicabile, x = 0')
end
fx = x^2 - N;
dfx = 2*x;
xnew = x - fx/dfx;
fxnew = xnew^2 - N;
x = xnew;
end
if k == Nmax
fprintf('Criterio di arresto non raggiunto')
end
Esercitazione 5
1) Matrice di Vandermonde
%Soluzione:
function V = vandermonde(x)
n = length(x);
function p = val_pol(a,x)
% val_pol - function per la valutazione di un polinomio
% p(x) = a(1)+a(2)x+...+a(n)x^n
% in un vettore di nodi x
% Input: a, vettore di n componenti contenente i coefficienti del
% polinomio
% x, vettore di m componenti contenente i nodi in cui
% valutare il polinomio
% Output: p, vettore di m componenti contenente i valori
% del polinomio in x_1,...,x_m
n = length(a);
p = a(1);
pot = x;
for i = 2 : n
p = p + a(i)*pot;
pot = pot.*x;
end
3) Polinomio Interpolante
Soluzione:
clear
close all % chiude tutte le finestre grafiche aperte
% Punti di interpolazione
x = (1:4)';
y = [3;5;6;4];
% Coefficienti polinomio interpolante
a = interp(x,y);
pz = val_pol(a,3.5)
4) Funzione di Runge
clear
close all
for n = 5 : 3 : 20
% Dati e funzione
%x = linspace(-1,1,n)'; % nodi equidistanti
i = (0 : n-1)';
x = cos( (2*i+1)*pi/(2*(n))); % nodi di Chebychev
y = 1./(1+25*x.^2);
figure % aprire una nuyova finestra grafica
plot(x,y,'rx','LineWidth',2)
hold on
fplot(@(x) 1./(1+25*x.^2),[-1,1])
% Polinomio interpolante
V = vander(x);
V = V(:,n:-1:1);
a = V \ y;
end
5) Polinomio di Lagrange
clear
close all % chiude tutte le finestre grafiche aperte
% Punti di interpolazione
x = (1:4)';
y = [3;5;6;4];
Soluzione:
clear
close all
% Dati
n = 10;
x = [1900 : 10: 1990]';
y = [76 92 105.7 122.8 131.7 150.7 179 205 226.5 248.7]';
plot(x,y,'x','LineWidth',3)
hold on
% Vandermonde
V = vander(x);
V = V(:,n:-1:1);
a = V \ y;
z = linspace(1900,1990,100);
pz = polyval(a(n:-1:1),z);
plot(z,pz,'b','LineWidth',1)
% Lagrange
pzz = interp_lag(x,y,z);
plot(z,pzz,'g','LineWidth',1)
8) Funzione di Runge
clear
close all
for n = 5 : 3 : 20
% Dati e funzione
x = linspace(-1,1,n)'; % nodi equidistanti
y = 1./(1+25*x.^2);
figure % aprire una nuyova finestra grafica
plot(x,y,'rx','LineWidth',2)
hold on
fplot(@(x) 1./(1+25*x.^2),[-1,1])
end
function lv = interp_lag(x,y,v)
if length(x)~=length(y)
error('Dimensioni di x e y incompatibili')
end
n = length(y);
lv = zeros(size(v));
for j = 1 : n
ljv = ones(size(v));
for i = 1 : n
if i ~=j
ljv = ljv.*(v-x(i))/(x(j)-x(i));
end
end
lv = lv + y(j)*ljv;
end
Esercitazione 6
1) Problema ai Minimi Quadrati
if rank(A) < n
error('Caso degenere')
end
% Dati
t = [0 10 20 30 40 80 90 100]'; %x
s = [68.0 67.1 66.4 65.6 64.6 61.8 61.0 60.0]'; %y
%POLINOMIO
%calcolo dei coefficienti del polinomio interpolante
V = vander(t);
V = V(:,m:-1:1);%significa che stai prendendo tutte le righe, ma le colonne in ordine inverso
a = V \s;
%l'ordine degli elementi è inverso, volgiamo da t^0 a t^m-1
a = a(m:-1:1); %vettore dei coefficineti del polinomio interpolante
% Dati
t = [0 1 1.5 2 2.5 3 3.5 4]';
s = [0 1.2 3.0 3.7 7.9 11.6 15.5 19.8]';
% Grafico
plot(t,s,'ro')
hold on
z = linspace(t(1),t(m));
pz = alpha(1) + alpha(2)*z + alpha(3)*z.^2;
plot(z,pz,'b')
pz_interp = polyval(a,z);
plot(z,pz_interp,'k')
4) Legge di Moore
% Script es_4
close all
clear
% Dati
t = [0 3 7 10 14 18 20]';
y = [4500 29000 90000 229000 1200000 3100000 5500000]';
% Dati covid:
1 229
2 322
3 400
4 650
5 888
6 1128
7 1694
8 2036
9 2502
10 3089
% Dati
dati_covid = importdata("dati_covid.txt");
t = dati_covid(:,1);
y = dati_covid(:,2);