Professional Documents
Culture Documents
Phương Pháp Given
Phương Pháp Given
Nội dung
1. Yêu cầu đặt ra:
Nhập vào một ma trận A có các vectơ cột độc lập tuyến tính, viết chương
trình dựa vào phương pháp phép quay Given xuất ra hai ma trận Q và R
thỏa A=Q*R với Q là ma trận vuông có các vectơ cột độc lập tuyến tính và
trực giao, R là ma trận tam giác trên.
2. Cơ sở lí thuyết:
Cho A thuộc Mn (R). Tìm các ma trận trực giao P1, P2,..., Pk-1, Pk (là ma
trận của phép quay trong Rn) với k thuộc N để:
(P1P2...Pk-1,Pk)A = R
=> A = (P1P2...Pk-1,Pk)-1R = QR
Với Q = (P1P2...Pk-1,Pk)-1
*Cách chọn ma trận P là:
P có dạng(P luôn trực giao):
Cột i Cột j
1 ... ↓ ↓
vi
cos(a) =
√ v i + v j2
2
... xanh
am1 →am2 →am3 . . . amn
-Như hình trên ta chạy vòng lặp từ hàng h=2 đến hàng h=m từ cột k=1
đến cột k=i-1 từ trên xuống dưới, từ trái qua phải. Trường hợp tại vị trí số
hàng lớn hơn số cột hai đơn vị trở lên ta sẽ cho chạy từ cột k=1 đến k=n
để tránh xét thiếu trường hợp, có thể xem ma trận dưới đây để rõ hơn:
a11 a12 a13
a21 a22 a23
a31 a32 a33
A6x3 = a41 a42 a43
a51 a52 a53 ↓
a61 a62 a63
Nếu chỉ dừng ở việc xét đến h-1 thì tại hàng h=5 => k=5-1=4 => vòng lặp
sẽ chạy từ cột 1 đến cột 4, điều này SAI vì ma trận của chúng ta chỉ có 3
cột, vậy để cho đúng thì k phải chạy đến n=3
BƯỚC 3: Tìm ma trận P
-Gán: P bằng ma trận đơn vị cấp m.
Q bằng 1.
-Tại mỗi vị trí theo thứ tự của vòng lặp ta xét xem phần từ tại đó có
bằng 0 chưa, nếu chưa thì ta tạo một ma trận P nhân với A để phần tử tại
đó bằng 0. P là ma trận vuông bậc m được tạo thành từ việc thay 4 phần
tử cos(a), sin(a), -sin(a), cos(a) vào 4 vị trí thích hợp của ma trận đơn vị
ban đầu. Theo như cơ sở lý thuyết phía trên thì tại phần tử có vị trí (h,k)
của ma trận A, ta có:
i=k
=>
j=h
Phk=-sin(a)
Phh=cos(a)
=>
Pkk=cos(a)
Pkh=sin(a)
Pkk=cos(a)
BƯỚC 4: Gán: - Phk=-sin(a)
- Pkk=cos(a)
- Pkh=sin(a)
- Phh=cos(a)
- R bằng P nhân A
- Q bằng P nhân Q
BƯỚC 5: Xuất ra màn hình phần ma trận Q và phần ma trận R:
-PhầnQ bằng nghịch đảo của Q
-PhầnR bằng R
4. Code
disp('Phan tich QR bang phuong phap Given');
a=input('Nhap vao ma tran A can phan tich QR: A=');
if rank(a')<size(a,2)
disp('ma tran A co cac vec to cot khong doc lâp tuyen tinh');
else
p=eye(size(a,1));
Q=1;
aconst=a;
for i=2:size(a,1)
n=i-1;
if n<=size(aconst,2)
for j=1:i-1
if a(i,j)~=0
p(i,j)=-a(i,j)/sqrt(a(i,j)^2+a(j,j)^2);
p(i,i)=a(j,j)/sqrt(a(i,j)^2+a(j,j)^2);
p(j,j)=a(j,j)/sqrt(a(i,j)^2+a(j,j)^2);
p(j,i)=a(i,j)/sqrt(a(i,j)^2+a(j,j)^2);
a=p*a;
Q=p*Q;
p=eye(size(aconst,1));
end
end
else
for j=1:size(aconst,2)
if a(i,j)~=0
p(i,j)=-a(i,j)/sqrt(a(i,j)^2+a(j,j)^2);
p(i,i)=a(j,j)/sqrt(a(i,j)^2+a(j,j)^2);
p(j,j)=a(j,j)/sqrt(a(i,j)^2+a(j,j)^2);
p(j,i)=a(i,j)/sqrt(a(i,j)^2+a(j,j)^2);
a=p*a;
Q=p*Q;
p=eye(size(aconst,1));
end
end
end
end
disp('ket qua la:');
PhanQ= inv(Q)
PhanR= a
end