Sunteți pe pagina 1din 8

ANALIZA NUMERICA LABORATOR 1 – INFO 3

EXERCITII

1. Scrieti o functie in MATLAB care pentru un set de date introdus de la linia de


comanda sa ploteze graficul polinomului care aproximeaza cel mai bine setul de
date in sensul celor mai mici patrate.
function c=fit(n,t,b)
%aceasta functie calculeaza coeficientii polinomului de grad n in sensul celor mai
mici patrate
%care aproximeaza un set de date (t,b)
if(n>=length(t))
error('grad prea mare')
end
%generam matricea sistemului liniar
%functia fliplr inverseaza ordinea coloanelor in matricea v (ultima coloana
%devine prima, etc)
v=fliplr(vander(t))
% din v consideram primele n+1 coloane pt a determina polinomul de grad n
% daca cumva n=lenght(t)-1, atunci polinomul pe care il vom determina este
% polinomul de interpolare
v=v(:,1:(n+1))
%vectorul b trebuie sa fie vector coloana
c=v\b'
%in vectorul c obtinut anterior coeficientii sunt in ordinea crescatoare a
% puterilor lui x; noua ne trebuie in ordine descrescatoare
c=fliplr(c')
%generam o diviziune echidistanta (de 100 de puncte) pentru
%intervalul (min(t), max(t))
x=linspace(min(t),max(t));
%calculam valoarea polinomului p (cu coeficientii in vectorul c) in punctul x
clf
ANALIZA NUMERICA LABORATOR 1 – INFO 3

w=polyval(c,x);
plot(t,b,'ro',x,w,'b-');
% exista predefinita functia polyfit care face acelasi lucru; al treilea
% parametru reprezinta gradul polinomului cautat
ee=polyfit(t,b',4)
ff=polyval(ee,x);
hold on
plot(x,ff,'g--');
title(sprintf(' polinomul in sensul celor mai mici patrate de grad n=%2.f',n))
legend('setul de date','polinomul in sensul celor mai mici patrate','polinomul
determinat cu functia polyfit')

2. Revedeti comenzile MATLAB aferente descompunerilor SVD si QR pentru o


matrice din fisierul TUTORIAL MATLAB_1.pdf. Verificati pe un exemplu faptul
ca valorile singulare pentru o matrice A sunt radacinile valorilor proprii pentru
matricea AAt, iar matricele U si V au ca si coloane vectorii proprii ortonormati
pentru matricele AtA, respectiv AAt.
3. Scrieti o functie in MATLAB care pentru o matrice introdusa de la linia de
comanda sa ploteze discurile Gersghorin si valorile proprii.
function C = Gershg(A)
%aceasta este o functie in Matlab care are ca parametri de intrare matricea
%A si ca data de iesire matricea C;
% aceasta functie ploteaza discurile Gershgorin pentru o matrice

d = diag(A);
cx = real(d);
cy = imag(d);
B = A - diag(d)
n= size(A);
%sum(matrice) intoarce intr-un vector suma elementelor pe coloana
% si de aceea trebuie sa transpunem matricea, pentru a calcula suma pe
ANALIZA NUMERICA LABORATOR 1 – INFO 3

% linie
r = sum(abs(B'))
%daca elementele de pe diagonala matricei sunt reale, atunci vectorul cy este vector
de
%zerouri
C = [cx cy r(:)]
t = 0:pi/100:2*pi;
[v,d] = eig(A);
d = diag(d);
% in vectorul u1 se memoreaza partile reale ale valorilor proprii
% in vectorul u2 se memoreaza coeficientii partilor imaginare ale valorilor proprii
u1 = real(d);
v1 = imag(d);
hold on
%vrem sa apara si gridul/grila pe sistemul de axe
grid on
%scaleaza axele a.i. unitatea de masura sa fie aceeasi
axis square
ylabel('Im')
%se ploteaza cu cerculete (o) rosii (r) valorile proprii
valpro = plot(u1,v1,'or');
%setam grosimea liniei la 1.4 pt
set(valpro,'LineWidth',1.4)
c = cos(t);
s = sin(t);
for i=1:n
x = zeros(1,length(t));
y = zeros(1,length(t));
%scriem ecuatia cercului in coordonate polare
x = cx(i) + r(i)*c;
y = cy(i) + r(i)*s;
ANALIZA NUMERICA LABORATOR 1 – INFO 3

disc_g = plot(x,y);
%setam grosimea liniei la 1.1 pt
set(disc_g,'LineWidth',1.1)
end
hold off
title('Discurile Gershgorin si valorile proprii pentru matricea A')
De asemenea, verificati si comanda compass.
4. Modificati scriptul realizat la exercitiul anterior astfel incat matricea sa fie
generata prin program.
5. Scrieti o functie in MATLAB care pentru o matrice simetrica de 2x2 introdusa de
la linia de comanda sa calculeze si afiseze matricea de rotatie Givens care o
aduce la forma sa diagonala (adica JtAJ=D).
function [D, G] = diag_mat_Givens(A);

% Function diag_mat_Givens are ca parametru de intrare o matrice 2x2 si intoarce


matricea diagonala D,
%dar si matricea de rotatie Givens J cu proprietatea ca J'*A*J=D

%verificam daca matricea este simetrica


if ( A(1,2)~=A(2,1) )
error('Matricea nu este simetrica!')
end

%verificam daca matricea nu este 'aproape' diagonala; eps=2^{-52} pt


%formatul double
%daca da, atunci D=A si matricea de rotatie este I
if ( abs(A(1,2)) < eps & abs(A(2,1)) < eps )
D=A
G = eye(2)
return
end
ANALIZA NUMERICA LABORATOR 1 – INFO 3

%se pune conditia ca J'*A*J=D si se obtine o ecuatie de gradul 2;


%radacinile le gasim cu functia roots
r = roots([-1 (A(1,1)-A(2,2))/A(1,2) 1]);
%in k se memoreaza pozitia elementului de modul minim
[t, k] = min(abs(r));
t = r(k);
c = 1/sqrt(1+t^2);
s = c*t;
G = zeros(size(A));
G(1,1) = c;
G(2,2) = c;
G(1,2) = s;
G(2,1) = -s;
D = G.'*A*G
G
Verificati ca intrarile principale pentru matricea diagonala D sunt valorile proprii
pentru matricea A.
6. Pentru matricea (simetrica) generata prin program (deci si cu dimensiunea
variabila) sa se afiseze forma sa diagonala, dar si vectorii proprii, dar neutilizand
matricele de rotatie Givens.
7. Pentru o matrice A data, sa se ploteze in acealasi sistem de coordinate vectorii
proprii x si vectorii Ax pentru a verifica faptul ca sunt coliniari.
8. Sa se scrie un script/functie care sa obtina descompunerea QR pentru o matrice
dreptunghiulara folosind doar rotatii Givens.

function [Q, A] = Givens_QR(A)


% Aceasta functie aduce pe A in forma A= Q*R, unde Q
% este o matrice ortogonala. Ultima valoare a matricei A este, de fapt,
% matricea R
[m, n] = size(A);
if m == n
ANALIZA NUMERICA LABORATOR 1 – INFO 3

k = n-1;
elseif m > n
k = n;
else
k = m-1;
end
Q = eye(m);
for j=1:k
%se lucreaza pe coloana j
for i=j+1:m
J = GivJ(A(j,j),A(i,j));
A = inmGiv(A,J,j,i);
%in matricea Q memoram produsul rotatiilor Givens
Q = inmGiv(Q,J,j,i);
end
end
A
Q = Q'
unde
function A = inmGiv(A, J, i, k)
% Inmulteste matricea A cu rotatia Givens J
% De fapt, se schimba doar liniile i si k
A([i k],:) = J*A([i k],:);
si
function J = GivJ(xi, xk)
% Aceasta functie determina rotatia Givens J= [c s;-s c]. Valorile c si s
% sunt calculate folosind valorile xi si xk.
if xi == 0 & xk == 0
J = eye(2);
return end
if abs(xk) >= abs(xi)
ANALIZA NUMERICA LABORATOR 1 – INFO 3

t = xi/xk;
s = 1/sqrt(1+t^2);
c = s*t;

else
t = xk/xi;
c = 1/sqrt(1+t^2);
s = c*t;
end
J = [c s;-s c]
9. Repetati exercitiul anterior folosind, de data aceasta, doar transformari
Householder.
10. Folosind Exercitiul 5 si introducand si un vector b, calculati xLS.
11. Scrieti un script care sa calculeze matricea P*A, unde P este matricea
Householder data de un vector oarecare u, prin doua metode.
Una dintre metode este urmatoarea.
function P = inm_House(u, A)
% Calculeaza produsul U = P*A, unde P este matricea Householder
% determinata de vectorul u si de matricea A
[n, p] = size(A);
m = length(u);
if m ~= n
error('Dimensiunile nu se potrivesc!!')
end
%normam vectorul u
v = u/norm(u);
%pe v il consideram vector coloana
v = v(:);
U = [];
for j=1:p
aj = A(:,j);
ANALIZA NUMERICA LABORATOR 1 – INFO 3

U = [U aj-2*v*(v.'*aj)]
end
12. Calculati xLS folosind pseudoinversa Moore-Penrose.

S-ar putea să vă placă și