Documente Academic
Documente Profesional
Documente Cultură
EXERCITII
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')
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);
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.