Đị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 2Thành viên nhóm
Trang 3LỜ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 4MỤ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 5I 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 6tự 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 7b 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 8Khi 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 92x1 + 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 1229
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 133 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 14Cho ma trận
A
Phân tích PA=LU
Hình 2 Kết quả phân tích PA=LU
Trang 15Giả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 164 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 1725
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