1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Báo cáo bài tập lớn Đại số tuyến tính Đề tài phân tích lu và plu

19 3 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Phân tích LU và PLU
Tác giả Phan Phạm Nguyên Khôi, Phùng Tuấn Minh, Tô Đình Nguyên, Trà Huỳnh Anh Tuấn, Trần Anh Khoa, Trần Bá Trị, Trần Bảo Thiên, Trần Đình Trí
Người hướng dẫn Th.S Nguyễn Hữu Hiệp
Trường học Đại học Bách Khoa
Thể loại báo cáo
Năm xuất bản 2024
Thành phố Thành phố Hồ Chí Minh
Định dạng
Số trang 19
Dung lượng 652,18 KB

Nội dung

Định nghĩa Phân tích LU LU Decomposition: Phân tích LU là quá trình phân tách một ma trận vuông A thành tích của hai ma trận: - L là ma trận tam giác dưới với các phần tử trên đường c

Trang 1

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH

TRƯỜNG ĐẠI HỌC BÁCH KHOA

BÁO CÁO BÀI TẬP LỚN ĐẠI SỐ TUYẾN TÍNH

ĐỀ TÀI: Phân tích LU và PLU

Nhóm: L03_12

Giảng viên hướng dẫn: Th.S Nguyễn Hữu Hiệp

Thành phố Hồ Chí Minh, tháng 11 năm 2024

Trang 2

Thành viên nhóm

Trang 3

LỜI CẢM ƠN

Chúng em xin gửi lời cảm ơn chân thành đến Thầy Nguyễn Hữu Hiệp đã hướng dẫn và cung cấp những kiến thức quang trọng trong môn học Đại số Tuyến tính, giúp chúng em hiểu rõ hơn về các khái niệm, thuật toán, và ứng dụng thực tiễn của phân tích LU và PLU

Chúng em cũng xin cảm ơn Trường Đại học Bách Khoa – Đại học quốc gia thành phố Hồ Chí Minh đã tạo điều kiện cho chúng em học tập và nghiên cứu trong một môi trường năng động và chuyên nghiệp

Ngoài ra, chúng em muốn bày tỏ lòng biết ơn đến các thành viên trong nhóm vì

đã phối hợp làm việc hiệu quả, chia sẻ kiến thức và cùng nhau vượt qua những khó khăn trong quá trình hoàn thành bài báo cáo này

Bài báo cáo này không thể tránh khỏi những sai sót, chúng em rất mong nhận được những ý kiến đóng góp từ Thầy và các bạn để có thể hoàn thiện hơn trong những bài nghiên cứu tiếp theo

Trân trọng cảm ơn!

Nhóm L03_12

Trang 4

MỤC LỤC

I Giới thiệu 4

1 Mục tiêu của báo cáo 4

2 Phạm vi và cấu trúc báo cáo 4

II Cơ sở lý thuyết 4

1 Định nghĩa 4

2 Điều kiện tồn tại và duy nhất 5

III Phương pháp phân tích LU và PLU 5

1 Phương pháp Doolittle 5

2 Phương pháp Crout 6

IV Giải hệ phương trình tuyến tính và ứng dụng thực tiễn 6

1 Giải hệ phương trình tuyến tính 6

2 Ứng dụng thực tiễn 7

V Ví dụ minh họa và các bước giải 7

1 Ví dụ minh họa 7

2 Các bước giải 8

VI Code Matlab và giải thích code 9

1 Thuật toán phân tích 9

2 Code Matlab 10

3 Kết quả 12

4 Các hàm Matlab đã sử dụng 15

5 Giải thích code Matlab 15

VII Đánh giá 16

VIII Kết luận 17

IX Tài liệu tham khảo 18

Trang 5

I Giới thiệu

1 Mục tiêu của báo cáo

Báo cáo này nhằm giới thiệu và phân tích chi tiết về phương pháp phân tích LU

và PLU, các thuật toán liên quan, và ứng dụng trong thực tiễn Mục tiêu chính là:

- Hiểu rõ bản chất toán học của phân tích LU và PLU

- Nắm vững các thuật toán Doolittle và Crout

- Làm code Matlab phân tích LU và PLU

- Thấy được giá trị ứng dụng của các phương pháp này trong thực tế

2 Phạm vi và cấu trúc báo cáo

Báo cáo bao gồm phần lý thuyết nền tảng, thuật toán tính toán, code Matlab, một ví dụ minh họa chi tiết, và ứng dụng thực tế Đồng thời, chúng em cũng đánh giá

ưu điểm và hạn chế của các phương pháp này

II Cơ sở lý thuyết

1 Định nghĩa

Phân tích LU (LU Decomposition): Phân tích LU là quá trình phân tách một

ma trận vuông A thành tích của hai ma trận:

- L là ma trận tam giác dưới với các phần tử trên đường chéo bằng 1 (lower

triangular matrix)

- U là ma trận tam giác trên (upper triangular matrix)

A=L⋅U

Phân tích PLU (PLU Decomposition): Phân tích PLU là một dạng tổng quát

của phân tích LU Nếu ma trận A không thể phân tích trực tiếp thành LU, thì một ma trận hoán vị P được đưa vào, và quá trình phân tích sẽ trở thành:

P⋅A=L⋅U Trong đó:

- P là ma trận hoán vị, làm thay đổi thứ tự các hàng của ma trận A trước khi thực

hiện phân tích LU

- L và U lần lượt là ma trận tam giác dưới và tam giác trên như trong phân tích

LU

Ma trận hoán vị P: Là một ma trận vuông, có các phần tử chỉ là 0 hoặc 1, và

có một hàng hoặc cột chứa 1 tại mỗi vị trí Ma trận này thực hiện một phép hoán vị các hàng hoặc cột của ma trận A Trong phân tích PLU, ma trận P dùng để điều chỉnh thứ

Trang 6

tự các hàng của ma trận A trước khi phân tích LU, giúp đảm bảo sự ổn định và khả thi trong quá trình phân tách

2 Điều kiện tồn tại và duy nhất

a Điều kiện để tồn tại và duy nhất phân tích LU

Ma trận vuông: Ma trận A phải là ma trận vuông cấp n

Ma trận khả nghịch (Invertible Matrix): Một ma trận A được gọi là khả

nghịch nếu tồn tại ma trận 𝐴−1 sao cho:

A𝐴−1= 𝐴−1A= I

Tính duy nhất của phân tích LU: Nếu tất cả các phần tử chéo của ma trận

L được quy định bằng 1 (phương pháp Doolittle), thì phân tích LU là duy nhất

b Phân tích PLU

Với ma trận hoán vị P, mọi ma trận khả nghịch A – bất kể vuông hay không – đều có phân tích PLU

Khi sử dụng các phép biến đổi sơ cấp mà trên đường chéo chính xuất hiện phần tử 0, lúc này ta có thể dùng phương pháp hoán đổi vị trí hai hàng để làm cho phần tử ở vị trí này khác 0 Điều này tương đương với việc nhân bên trái cho ma trận

sơ cấp tương ứng với phép hoán đổi

Ta rút ra được kết quả: Với mọi ma trận A không suy biến luôn tồn tại ma

trận hoán vị P sao cho ma trận A có thể phân tích thành dạng P⋅A=L⋅U

III Phương pháp phân tích LU và PLU

Phân tích LU và PLU có thể thực hiện theo hai phương pháp: Doolittle và Crout

0

1

1 Phương pháp Doolittle

Phương pháp Doolittle phân tích một ma trận A thành tích của ma trận tam giác dưới L và ma trận tam giác trên U

Các bước của phương pháp Doolittle:

a Khởi tạo các phần tử của L và U:

- Đặt tất cả phần tử lii=1 trên đường chéo chính của L

- Khởi tạo tất cả phần tử khác 0 của L và U là 0

Trang 7

b Tính toán phần tử của ma trận U:

Sử dụng công thức:

𝑢𝑖𝑗 = 𝑎𝑖𝑗 − ∑ 𝑙𝑖𝑘𝑢𝑘𝑗

𝑖−1

𝑘=1

Với i ≤ j, nghĩa là các phần tử phía trên và trên đường chéo chính của U

c Tính toán phần tử của ma trận L:

Sử dụng công thức:

𝑙𝑖𝑗 =𝑎𝑖𝑗 − ∑ 𝑙𝑖𝑘𝑢𝑘𝑗

𝑗−1 𝑘=1

𝑢𝑗𝑗 Với i > j, nghĩa là các phần tử phía dưới đường chéo chính của L

d Lặp lại cho tất cả các phần tử của ma trận:

Tiến hành tính toán theo thứ tự từng hàng và cột để hoàn thành các phần

tử của L và U

2 Phương pháp Crout

Phương pháp Crout cũng là một dạng phân tích LU, nhưng phân tích ma trận A

thành tích của ma trận tam giác dưới L và ma trận tam giác trên U với một khác biệt

nhỏ

Các bước của phương pháp Crout:

a Khởi tạo các phần tử của L và U:

- Đặt tất cả phần tử 𝑢𝑖𝑖=1 trên đường chéo chính của U

- Khởi tạo tất cả phần tử khác 0 của L và U là 0

b Tính toán phần tử của ma trận U:

Sử dụng công thức:

𝑙𝑖𝑗 = 𝑎𝑖𝑗 − ∑ 𝑙𝑖𝑘𝑢𝑘𝑗

𝑗−1

𝑘=1

Với i ≥ j, nghĩa là các phần tử phía dưới và trên đường chéo chính của L

c Tính toán phần tử của ma trận U:

Sử dụng công thức:

𝑢𝑖𝑗 =𝑎𝑖𝑗− ∑ 𝑙𝑖𝑘𝑢𝑘𝑗

𝑖−1 𝑘=1

𝑙𝑖𝑖 Với i < j, nghĩa là các phần tử phía dưới đường chéo chính của U

d Lặp lại cho tất cả các phần tử của ma trận:

Tiến hành tính toán theo thứ tự từng hàng và cột để hoàn thành các phần

tử của L và U

IV Giải hệ phương trình tuyến tính và ứng dụng thực tiễn

1 Giải hệ phương trình tuyến tính

Trang 8

Khi muốn giải một hệ phương trình tuyến tính dạng Ax=b (với A và b cho trước), trong đó A là ma trận vuông, ta có thể sử dụng phân tích LU (hoặc PLU) để đơn giản hóa quá trình giải:

Phân tích LU: Tách ma trận A thành tích của hai ma trận L (ma trận tam giác

dưới) và U(ma trận tam giác trên), tức là A=LU Ta có hệ LU.X=b

o Khi đó, việc giải hệ Ax=b sẽ chuyển thành giải hai hệ con:

1 Ly=b (đặt y=U.x) Tìm được y

2 Ux=y Tìm được x

Phân tích PLU: Khi ma trận A có thể không khả nghịch hoặc không thể phân

tích trực tiếp thành LU, ta dùng phép hoán vị để chuyển A thành PA=LU(với P

là ma trận hoán vị)

o Trong trường hợp này, hệ phương trình được giải bằng cách giải các hệ tương tự như trên nhưng với ma trận hoán vị P

1 y=𝐿−1 𝑏

2 x=𝑈−1 𝑦

2 Ứng dụng thực tiễn

Giả sử ta đang quản lý một công ty chuyên phân phối hàng hóa, và ta phải đảm bảo việc vận chuyển từ các kho hàng đến các cửa hàng một cách hiệu quả Ta cần tính toán sao cho:

- Nhu cầu của các cửa hàng được đáp ứng

- Nguồn cung từ các kho hàng không vượt quá giới hạn

- Chi phí vận chuyển thấp nhất có thể hoặc tuân thủ các quy định phân phối cụ thể

Để giải quyết vấn đề này, ta cần lập kế hoạch phân bổ nguồn hàng sao cho mọi điều kiện trên được thỏa mãn

V Ví dụ minh họa và các bước giải

1 Ví dụ minh họa

Có 3 kho hàng (A,B,C) và cần phân phối hàng đến 3 cửa hàng (X,Y,Z) Tuy nhiên, khả năng cung cấp hàng của từng kho hàng là có giới hạn, và tìm ra cách phân phối hợp lý nhất

Khả năng cung cấp của các kho

o Kho A: 11 đơn vị hàng

o Kho B: 27 đơn vị hàng

o Kho C: 25 đơn vị hàng

Ta có x1, x2, x3 lần lượt là số lượng hàng hóa được vận chuyển từ kho A,B,C đến các của hàng, với các điều kiện chi phí, thời gian và yêu cầu như sau:

o Tổng hàng từ kho A đến các cửa hàng là 11:

Trang 9

2x1 + 3x2 + x3 = 11

o Tổng hàng từ kho B đến các cửa hàng là 27:

4x1 + 7x2 + 3x3 = 27

o Tổng hàng từ kho C đến các cửa hàng là 25:

2x1 + 4x2 + 5x3 = 25

Hệ phương trình trên có thể biểu diễn dưới dạng ma trận như sau:

A.x = b Với:

o Ma trận A:

𝐴 = (

2 3 1

4 7 3

2 4 5

)

o Ma trận ẩn x:

𝑥 = (

𝑥1

𝑥2

𝑥3)

o Ma trận kết quả b:

𝑏 = (

11 27 25 )

2 Các bước giải

Bước 1: Kiểm tra phần tử đầu tiên 𝒂𝟏𝟏

Xét phần tử 𝑎11 = 2 Vì phần tử này không bằng 0, chúng ta có thể tiếp tục mà không cần hoán vị hàng Vì vậy, trong ví dụ này, không cần dùng đến ma trận P, và ta chỉ cần phân tích LU

Bước 2: Thiết lập các ma trận L và U

Giả sử:

𝐿 = [

1 0 0

𝑙21 1 0

𝑙31 𝑙32 1

] , 𝑈 = [

𝑢11 𝑢12 𝑢13

0 𝑢22 𝑢23

0 0 𝑢33

]

Bước 3: Tìm các phân tử của U

o Xác định 𝑢11, 𝑢12, 𝑢13:

𝑢11 = 𝑎11= 2

𝑢12 = 𝑎12= 3

𝑢13 = 𝑎13= 1

o Tính 𝑙21và cập nhật hàng thứ hai của U:

Trang 10

𝑢11 =

4

2= 2

Sử dụng 𝑙21để làm không phần tử bên dưới 𝑢11:

𝑢2∗ = 𝑎2∗− 𝑙21× 𝑢1∗ = [4 7 3] − 2 × [2 3 1] = [0 1 1] Như vậy:

𝑢22 = 1, 𝑢23 = 1

o Tính 𝑙31và cập nhật hàng thứ ba của U:

𝑙31=𝑎31

𝑢11 =

2

2= 1

Bước 4: Tính 𝒍𝟑𝟐

o Tính 𝑙32:

𝑙32 =𝑎32− 𝑙31× 𝑢12

𝑢22 =

4 − 1 × 3

1 =

1

1= 1

𝑢33 = 𝑎33− (𝑙31× 𝑢13+ 𝑙32× 𝑢23) = 5 − (1 × 1 + 1 × 1) = 3 Như vây, chúng ta có:

𝐿 = [

1 0 0

2 1 0

1 1 1

] , 𝑈 = [

2 3 1

0 1 1

0 0 3

]

Bước 5: Tính y = L -1 b

𝑦 = (

1 0 0

2 1 0

1 1 1

)

−1

× (

11 27 25 ) = (

11 5 9 )

Bước 6: Tính x = U -1 y

𝑥 = (

2 3 1

0 1 1

0 0 3

)

−1

× (

11 5 9 ) = (

1 2 3 )

→ Vậy ta tìm được số lượng hàng hóa được phân phối từ các kho A,B,C đến

cửa hàng X,Y,Z lần lượt là 1, 2, 3 đơn vị hàng

VI Code Matlab và giải thích code

1 Thuật toán phân tích

Bước 1: Khởi tạo:

o Nhập ma trận A và B

o Kiểm tra xem A có phải là ma trận vuông hay không

o Khởi tạo:

• L = ma trận đơn vị

Trang 11

• U = ma trận zero

• P = ma trận đơn vị

Bước 2: Vòng lặp với chỉ số j (từ 1 đến n):

o Tìm các phần tử ma trận U

• Tìm chỉ số của phần tử lớn nhất từ hàng 1 đến hàng n trong cột j

• Hoán đổi hàng j với hàng chứa phần tử lớn nhất (nếu cần)

• Cập nhật ma trận P, A, L tương ứng

• Đánh dấu rằng đã xảy ra hoán vị (LU_Error)

o Kiểm tra nếu U(j,j) = 0:

o Tính các phần tử ma trận U và L

Bước 3: Giải hệ phương trình:

o Tính y = L-1.b

o Tính x = U-1.y

Bước 4: Hiển thị kết quả và nghiệm của hệ phương trình

2 Code Matlab

Đoạn code phân tích LU và giải hệ phương trình

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

clc;

clear;

disp('BÀI TẬP LỚN ĐSTT - NHÓM 12');

A = input('Nhập ma trận A: ');

B = input('Nhập ma trận B: ');

Abd = A;

[m, n] = size(A);

if n ~= m || n ~= length(B)

disp('Ma trận không phải là ma trận vuông, vui lòng nhập lại!');

return;

end

L = eye(n);

U = zeros(n);

P = eye(n);

LU_Error = false;

if det(A) == 0

disp('Ma trận suy biến, không thể phân tích!');

return;

end

for j = 1:n

for i = 1:j

U(i, j) = A(i, j) - sum(L(i, 1:i-1) * U(1:i-1, j)');

end

if U(j,j) == 0

[~, i_max] = max(abs(A(j:n, j)));

i_max = i_max + j - 1;

if i_max ~= j

A([j, i_max], :) = A([i_max, j], :);

Trang 12

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

P([j, i_max], :) = P([i_max, j], :);

L([j, i_max], 1:j-1) = L([i_max, j], 1:j-1);

LU_Error = true;

end

end

for i = 1:j

U(i, j) = A(i, j) - sum(L(i, 1:i-1) * U(1:i-1, j)');

end

for i = j+1:n

L(i, j) = (A(i, j) - sum(L(i, 1:j-1) * U(1:j-1, j)')) / U(j, j); end

end

disp('Ma trận A (ban đầu) = ');

disp(Abd);

disp('Ma trận B = ');

disp(B);

if LU_Error

disp('Ma trận A (sau khi hoán vị nếu có) = ');

disp(A);

disp('Phân tích PA = LU');

disp('Ma trận P = ');

disp(P);

B = P * B;

else

disp('Phân tích A = LU');

end

disp('Ma trận L = ');

disp(L);

disp('Ma trận U = ');

disp(U);

Y = L \ B;

X = U \ Y;

disp('Nghiệm của hệ phương trình là:');

disp(X);

Trang 13

3 Kết quả

Cho ma trận

A

Phân tích A=LU

Hình 1 Kết quả phân tích A=LU

Trang 14

Cho ma trận

A

Phân tích PA=LU

Hình 2 Kết quả phân tích PA=LU

Trang 15

Giải hệ phương trình sau:

{

2𝑥 + 3𝑦 + 𝑧 = 11 4𝑥 + 7𝑦 + 3𝑧 = 27 2𝑥 + 4𝑦 + 5𝑧 = 25

Từ đề bài ta có:

A = (

2 3 1

4 7 3

2 4 5

) B = (

11 27 25 ) Giải hệ phương trình bằng chương trình:

Hình 3 Kết quả giải hệ phương trình

Vậy nghiệm của hệ phương trình là: x = 1; y = 2 ; z = 3

Trang 16

4 Các hàm Matlab đã sử dụng

clc Xóa sạch màn hình Command Window

disp Hiển thị văn bản hoặc giá trị của biến lên Command

Window

input Nhận dữ liệu từ người dùng

[m, n] = size(A) Kích thước của ma trận (số hàng và số cột)

length(B) Giá trị lớn nhất giữa số hàng và số cột của ma trận

return Kết thúc chương trình hoặc hàm sớm khi gặp điều

kiện không hợp lệ

eye(n) Tạo ma trận đơn vị cấp n

zeros(n) Tạo ma trận chứa toàn số 0 cấp n

A(i,j) Phần tử nằm ở hàng thứ i và cột thứ j của ma trận

A

sum Tính tổng [M, idx] = max(X) Tìm giá trị lớn nhất trong một mảng và trả về giá trị

đó cùng chỉ số của phần tử tương ứng

A([i, k], :) = A([k,

i], :); Đổi vị trí của hai dòng trong một ma trận

A(i, j) Truy cập phần tử tại dòng i, cột j

5 Giải thích code Matlab

Các lệnh Matlab Giải thích

8

9

10

11

if n ~= m || n ~= length(B)

disp('Ma trận không phải là

ma trận vuông, Vui lòng nhập

lại!');

return;

end

Nếu m và n của A không bằng nhau hoặc

n không bằng length(B)

Chương trình sẽ hiển thị thông báo và sau

đó kết thúc (return) chương trình tại đó

16

17

18

19

if det(A) == 0

disp('Ma trận suy biến, không

thể phân tích!');

return;

end

Nếu định thức ma trận A nhập vào bằng 0 Chương trình sẽ hiển thị thông báo và sau

đó kết thúc (return) chương trình tại đó

20

40

for j = 1:n

end

Vòng lặp ngoài, chạy từ cột 1 đến n

21

22

23

for i = 1:j

U(i, j) = A(i, j) - sum(L(i, 1:i-1)

.* U(1:i-1, j)');

end

Xác định các phần tử của ma trận U tại hàng i cột j, sử dụng công thức phân tích

LU

24 if U(j,j) == 0 Nếu phần tử trên đường chéo chính của U

bằng 0, thì ta thực hiện như sau:

Trang 17

25

26

27

28

29

30

31

32

33

[~, i_max] = max(abs(A(j:n, j)));

i_max = i_max + j - 1;

if i_max ~= j A([j, i_max], :) = A([i_max, j], :);

P([j, i_max], :) = P([i_max, j], :);

L([j, i_max], 1:j-1) = L([i_max, j], 1:j-1);

LU_Error = true;

end end

Tìm chỉ số của phần tử lớn nhất trong cột

j, từ dòng j đến dòng n

Chuyển nó về chỉ số thực tế trong toàn bộ

ma trận

Nếu dòng chứa phần tử lớn nhất imax có phải là dòng j thì: Hoán đổi dòng j và dòng i_max trong ma trận A

Hoán đổi dòng j và dòng i_max trong ma trận P

Hoán đổi các phần tử của ma trận L trong vùng đã được tính toán (từ cột 1 đến j−1)

Không thể phân tích LU là đúng

34

35

36

for i = 1:j U(i, j) = A(i, j) - sum(L(i, 1:i-1) * U(1:i-1, j)');

end

Xác định các phần tử ma trận U tại hàng i cột j cho cả phân tích LU hoặc PLU theo công thức

37

38

39

for i = j+1:n L(i, j) = (A(i, j) - sum(L(i, 1:j-1) * U(1:j-1, j)')) / U(j, j);

end

Xác định các phần tử ma trận L tại hàng j+1 cột j cho cả phân tích LU hoặc PLU

theo công thức

VII Đánh giá

1 Ưu điểm của phân tích LU và PLU

o Hiệu quả tính toán:

• Phân tích LU giúp tách hệ phương trình thành hai hệ tam giác, dễ giải bằng phép thế xuôi và thế ngược, do đó tiết kiệm thời gian so với phương pháp trực tiếp như phương pháp Gauss

• Với cùng một ma trận A, nếu chỉ có các vế phải b thay đổi, phân tích

LU chỉ cần thực hiện một lần, sau đó có thể tái sử dụng trong nhiều lần giải hệ phương trình, giảm thiểu lượng phép tính khi so với các phương pháp khác

o Độ ổn định:

• Phân tích PLU giúp tăng cường độ ổn định bằng cách sử dụng ma trận hoán vị P, giúp khắc phục các vấn đề nảy sinh khi có các phần tử rất nhỏ hoặc rất lớn trên đường chéo chính của A Phép (hoán vị) chọn phần tử lớn nhất làm phần tử trục, giảm thiểu sai số tính toán trong các

hệ có điều kiện xấu

Ngày đăng: 24/12/2024, 23:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w