You are on page 1of 5

I.

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 ... ↓ ↓

cos(a) sin(a) → Hàng i


...
1
Pij=
-sin(a) cos(a) → Hàng j
1 ...

Giả sử có một vectơ cột v=(v1, v2,..., vi,...,vj,...,vn)T.


Mục tiêu là dùng một phép quay P để khử phần tử thứ j của vectơ cột v
dựa vào phần tử thứ i của v.
Chọn phép quay sao cho khi thực hiện phép nhân P ijv thì vị trí thứ j bằng 0,
tức là:
- visin(a) + vjcos(a) = 0
Ta chọn:
vj
sin(a) =
√ v i + v j2
2

vi
cos(a) =
√ v i + v j2
2

3. Giải thích cách làm


BƯỚC 1:
-kiểm tra xem ma trận A có các vectơ cột độc lập tuyến tính với nhau hay
không. Nếu không sẽ xuất ra màn hình: “ma trận A có các vectơ cột không
độc lập tuyến tính với nhau”. Nếu có thì ta tiếp tục với bước tiếp theo.
BƯỚC 2:

a11 a12 a13 . . . a1n


a21 a22 a23 . . . a2n Vòng lặp chạy theo hướng mũi

Amn = a31→a32 a33 . . . a3n tên qua những phần tử màu

... 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

You might also like