Mam do napisania taki temat :
Przekształcić uogólniony problem własny
\(\displaystyle{ (A - \lambda_2 B)wektor2=0}\)
w odpowiedni problem standardowy
\(\displaystyle{ (Z - \lambda I)wektorwlasny=0}\)
Macierz A =
Kod: Zaznacz cały
4 1 1
1 6 2
1 2 6
Kod: Zaznacz cały
6 0 0
0 4 1
0 1 8
Kod: Zaznacz cały
1
0
0
Napisać funkcje zawierające:
1. Rozkład Choleskiego A= L L(')
2. Obliczającą macierz Z
3. Znajdującą najmniejszą wartość własną Lambda oraz odpowiadający jej wektor własny x.
Napisałem tak :
Kod: Zaznacz cały
function l=chole(A)
n=size(A);
for k=1:n
s=0;
for p=1:k-1
s=s+(l(k,p)^2);
end
l(k,k)=sqrt(A(k,k)-s);
for i=k+1:n
s=0;
for p=1:k-1
s=s+l(i,p)*l(k,p);
end
l(i,k)=(A(k,i)-s)/l(k,k);
end
end
end
function[Z]=StandaryzacjaMacierzy(L,B)
Lto=inv(L);
Lc=(Lto)';
Z=(Lto*B*Lc);
end
function [x,lam,it]= IterOdwrotna(A,n,epsl,epsr)
A=inv(A);
x=[1;0;0];
c=sqrt(x'*x);
u0=x/c;
it=1;
epl=1;
epr=1;
lam0=1;
while (epl>epsl & epr>epsr);
x1=A*u0;
lam1=u0'*x1;
c=sqrt(x1'*x1);
u1=x1/c;
epl=(abs(lam1-lam0))/lam1;
epr=sqrt((u1-u0)'*(u1-u0));
it=it+1;
if it>200
printf("proces rozbiezny\n")
return
end
lam0=lam1;
u0=u1;
end
lam=1/lam1;
x=u1;
end
A=[4,1,1;1,6,2;1,2,6]
B=[6,0,0;0,4,1;0,1,8]
L=chole(A)
Z=StandaryzacjaMacierzy(L,B)
[wektorwlasny,lambda,it]=IterOdwrotna(Z,1,0.0000000000001,0.0000000000001)
[C,M]=eig(Z)
lambda2=1/lambda
wektor2=(inv(L))'*(wektorwlasny)
Proszę o jakieś sprawdzenie, nie mam pojęcia czy to dobrze liczy.