ĐẠI HỌC BÁCH KHOA HÀ NỘIVIỆN TOÁN ỨNG DỤNG VÀ TIN HỌCCÁC PHƯƠNG PHÁP TÍNH GẦN ĐÚNG MATRẬN NGHỊCH ĐẢOHà Minh Dũng - MSSV 20200096GIẢNG VIÊN HƯỚNG DẪNTS... ChomatrậnvuôngA cấpn.Tìmmatrậnng
Trang 1ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN TOÁN ỨNG DỤNG VÀ TIN HỌC
CÁC PHƯƠNG PHÁP TÍNH GẦN ĐÚNG MATRẬN NGHỊCH ĐẢO
Hà Minh Dũng - MSSV 20200096GIẢNG VIÊN HƯỚNG DẪN
TS Hà Thị Ngọc Yến
Hà Nội, tháng 1, 2022
Trang 22.2 Lí do chọn X0= AT∥ ∥A2 3
4.2 Ví dụ 2 (Ma trận chéo trội hàng) 15
4.3 Ví dụ 3 (Ma trận chéo trội cột gần suy biến) 18
4.4 Ví dụ 4 (Ma trận chéo trội cỡ lớn) 20
5 Phân tích và tổng kết các phương pháp 265.1 Nhận xét các ví dụ 26
5.2 Ưu, nhược diểm của các phương pháp 26
5.2.1 Ưu điểm 26
5.2.2 Nhược điểm 26
6 Hướng dẫn sử dụng chương trình 276.1 Phương pháp Newton 27
6.2 Phương pháp Jacobi 27
6.3 Phương pháp Gauss-Seidel 28
Trang 31 Đặt vấn đề
1.1 Phát biểu bài toán
Bài toán ChomatrậnvuôngA cấpn.Tìmmatrậnnghịchđảocủa nếucó.A
Trong báo cáo này, ta sẽ nghiên cứu các phương pháp tìm gần đúng ma trận nghịch đảo củamột ma trận thực vuông cấp n
1.2 Lí do cần giải gần đúng ma trận nghịch đảo
Do khuyết điểm của các phương pháp tính đúng ma trận nghịch đảo:Máy tính bắt buộc phải thực hiện tính toán quá nhiều khi cần độ chính xác caoKhông kiểm soát được sai số tính toán do giới hạn tính toán của máy tính
Nên ta đề xuất sử dụng các phương pháp lặp để làm tăng độ chính xác của các ma trậnnghịch đảo có độ chính xác thấp và để kiểm soát sai số dễ dàng hơn.
1.3 Các phương pháp giải
Báo cáo này sẽ trình bày 3 phương pháp giải bao gồm phương pháp Newton có thể áp dụngvới ma trận bất kì và hai phương pháp Jacobi và Gauss-Seidel áp dụng với ma trận chéo trội.
Trang 4Suy ra
Gk=G2−1= G4
(1)Như vậy, nếu ta chọn xấp xỉ ban đầuX0gần A−1, sao cho
∥G0∥ = ∥E − AX0∥ < 1Thì ∥A−1− Xk∥→0 rất nhanh khi k →∞ hay dãy (Xk) hội tụ và
Kí hiệu λ(A) là giá trị lớn nhất của các trị tuyệt đối của các trị riêngλi(A)của ma trận A.Khi đó, với i bất kì, ta có
AATxi= λi(AAT)xi
Trang 5Trong đó ilà một vector khác Nhân hai vế với i ta đượcxT
iAATx= xT
iλi(AAT)xi⇔ (xTiA)(xT
iA)T= λi(AAT)xTixi
iA∥2= λi(AAT)∥xi∥⇔ λ AAi( T) =∥x
Trước hết ta sẽ xét trường hợpdet(A) = 0.
Do det(A) = 0 và xi = 0 nên ta suy raλi(AAT) > , ∀i0 Từ đó ta có
0 <λi(AA
T)λ(AAT)<1, ∀iĐặt
Trong đó
α= 1∥A∥2= 1
λ AA( T)Ta cóE− AX0= E −αAATlà ma trận đối xứng nên
∥E − AX0∥ =q
<1Như vậy, ma trận X0= AT
∥ ∥A2thỏa mãn điều kiện hội tụ.
Mặt khác, ta xét trường hợp det(A) = 0 Lúc này, phương trình Ax = 0 có nghiệmx0khác0 nên λ0= 0 là một giá trị riêng của ma trậnA.
Từ (2) ta suy raλi(AAT) ≥0, kéo theo
0 ≤λi(AAT)λ(AAT)<1, ∀iSuy ra
|1 −λi(AAT)λ AA( T)|≤1, ∀iĐẳng thức xảy ra khii= 0nên
Trang 6max|1 − i
λ AA( T)| = 1Mà biến đổi (3) vẫn đúng nên ta có∥E − AX0∥ = 1.Vậy với cách chọn X0= AT
∥ ∥A2thì nếu ma trậnAkhông khả nghịch, ta luôn có∥E−AX0∥ = 1.Mà ngược lại, nếu ma trậnAkhả nghịch thì lại có∥E − AX0∥ < 1 nên dãy (Xk)sẽ luôn hội tụ.
∥A−1∥ − ∥A−1∥qt≤∥A−1∥ − ∥A−1∥∥G0∥t
≤∥A−1∥ − ∥A−1Gt0∥≤∥A−1− A−1Gt
0∥= ∥A−1(E − Gt
0)∥= ∥X0(E + G0+ G2+ +Gt
0)∥= ∥X0∥∥E +G0+G2+ + Gt
0∥≤∥X0∥(∥E∥ + G∥ 0∥ + G∥ 2 ∥ + +∥Gt
0∥)≤∥X0∥(1 +q+ q2+ + qt)
=∥X0∥(1 − q
t+1)1 − qCho t →∞ ta được ∥A−1∥≤∥X0∥
1−q Kết hợp với (1) ta có công thức sai số∥A−1− Xk∥≤∥X0∥q
2k1 − q
Trang 7q←∥E − AX0∥q2k
← qerror←ε×(1−q)
Bước 2: Nếu q = 1, thông báo ma trận không khả nghịch và trả về ma trận NaNBước 3: Whileq2k :
≥ errorX← X(2E − AX)q2k q
← (2k)2
Bước 4: Trả về ma trận X0
Chươngtrìnhnewton_inverse(A, ,n ε)Input: Ma trận , kích cỡA n, sai số εOutput: Ma trậnX∗xấp xỉ củaA−1
Bước 1: Chương trình tự chọn xấp xỉ đầu X0= AT
∥ ∥A2Bước 2: Trả về newton_iter(A, ,n ε, X0)
Trang 83 Các phương pháp tìm gần đúng nghịch đảo của ma trậnchéo trội
i=j aij∥ < ajj∥ (chéo trội cột)
Ý tưởng của các phương pháp này là áp dụng các phương pháp giải gần đúng hệ vuông đểgiải hệ phương trình AX = E trong đóAlà ma trận chéo trội Các phương pháp sẽ được trìnhbày ở đây là:
Phương pháp lặp JacobiPhương pháp lặp Gauss-Seidel
3.2 Phương pháp lặp Jacobi
3.2.1 Lí thuyếtĐặt T = diag a{−1
11, a−1
22, , a−1}, B = E − T A, B1= E − ATCông thức lặp:
Xk+1=BXk+TCông thức sai số:
– Trường hợp chéo trội hàng: Với ∥ ∥B∞≤ q < 1∥Xk− X∗∥
1 − q∥Xk− Xk−1∥1
∥Xk− X∗∥ ≤ λ qk
1 − q∥X1−X0 1∥
Trang 93.2.2 Thuật toánHàmcheck_dom(A, n)Input: Ma trận , kích cỡA nOutput: Trả về trạng thái trội 1, −1, 0
tương ứng với ma trậnAchéo trội hàng, chéo trội cột hoặc không chéo trộiBước 1: K ←|diag(A)|
sumRowlà dãy tổng trị tuyệt đối các phần tử trên các hàng củaAtrừ các phần tử trongKsumCollà dãy tổng trị tuyệt đối các phần tử trên các cột củaAtrừ các phần tử trongKBước 2:
Nếu K[i] > sumRow i], ∀i = 1, n, hàm trả về giá trị 1[Nếu K[i] > sumCol i], ∀i = 1, n, hàm trả về giá trị -1[Nếu cả hai trường hợp trên không xảy ra, hàm trả về giá trị 0
Hàmget_norm(A, domStatus)
Input: Ma trận , trạng thái trộiA domStatusOutput: Chuẩn của A theo trạng thái trội
Nếu domStatus = 1, trả về∥ ∥A∞ Nếu không, trả về∥A∥1.
Hàmget_lambda(A, domStatus)
Input: Ma trận , trạng thái trộiA domStatusOutput: Trả về λ = 1 nếu A chéo trội hàng, λ =max a∥ii∥
min a∥ii∥nếu A chéo trội cộtNếu domStatus = 1, trả về giá trị 1
Nếu không, tính K ←|diag(A)|, trả vềmax(Kmin(K)
Trang 10Góiđánhgiátiênnghiệmpredecessor_iter( 0,B, T domStatus,, λ, q ε, )Input: Ma trận X0, , ,B T domStatus, λ, hệ số q, sai số εOutput: Ma trậnX∗xấp xỉ củaA−1
Bước 1: Tính các giá trị
norm← get_norm((BX0+ T ) −X0,domStatus)X← X0
qk← 1error←ε×(1 q)−
λ norm×
Bước 2: Whileqk> error:X← BX+Tqk←qk× qBước 3: Trả về X
Góiđánhgiáhậunghiệmsuccessor_iter(X0,B, T domStatus,, λ, q ε, )Input: Ma trận X0,B, T domStatus, λ, hệ số q, sai số ε,Output: Ma trậnX∗xấp xỉ củaA−1
Bước 1: Tính các giá trịoldX← X0
newX← BX0+Terror←ε(1−q)
Bước 2: While get_norm(newX− oldX, domStatus) > error:oldX← newX
newX← B × oldX+TBước 3: Trả về newX
Trang 11Chươngtrìnhjacobi_inverse(A, ,n ε, mode)
Input: Ma trận , kích cỡA n, sai số ε, chế độ đánh giámode
Output: Ma trậnX∗xấp xỉ củaA−1theo chế độ đánh giá tiên nghiệm nếumode= 1.Nếu không, thực hiện theo chế độ đánh giá hậu nghiệm.
Bước 1: domStatus ← check_dom(A, n)
Nếu domStatus = 0, thông báoAkhông chéo trội và dừng chương trìnhBước 2: Tính các giá trị
E←ma trận đơn vị cỡ nT← diag{a−1
11, a−122, , a−1}B← E − T A
λ← get_lambda(A, domStatus)q← get_q(B, E, T , A, domStatus)Bước 3: Chọn chế độ đánh giá
Nếu mode = 1, trả về predecessor_iter(A,B, T domStatus,, λ, q ε, )Nếu không, trả về successor_iter(A, ,B T, domStatus λ, , q, ε)
3.3 Phương pháp lặp Gauss-Seidel
3.3.1 Lí thuyếtĐặt T = diag a{−1
11, a−1
22, , a−1}, B = E − T A, B1= E − ATKí hiệuX(i)là dòng thứ của ma trậni X
Công thức lặp:X( )i
Trang 12– Trường hợp chéo trội cột: Đặt
q= max
Pi j=1|b1ji|
1 −Pn j=i+1|b1ji|≤∥B1∥1<1S= max
⇒Công thức sai số là:∥Xk− X∗∥ ≤ λq
Input: Ma trận , kích cỡ , trạng thái trộiB n domStatusOutput: Hệ số q
Bước 1: q ← 0Bước 2:
NếudomStatus= 1:For i from 1 to :n
j=i|bij|, q2←Pi−1j=1|bij|q← max(q, q1
1−q2)Nếu không:
For i from 1 to :nq1←Pi
=1|bji|, q2←Pn j=i+1|bji|q← max(q, q1
1−q2)Bước 3:Trả về q
Trang 13Hàmget_S(B1, n)Input: Ma trậnB1, kích cỡnOutput: Hệ số SBước 1: S ← 0Bước 2: For i from 1 to :n
tmp←Pnj=i+1|b1ji|S← max(S, tmp)Bước 3: Trả về S
Hàmnext_iter(oldX, , ,B T n)Input: Ma trậnoldX, B, T, kích cỡnOutput: Ma trận lặp tiếp theo newXBước 1: For i from 1 to :n
newX( )i
k+1+P(k)j=i+1bijoldX(j)k + T(i)
Bước 2: Trả về newX
Góiđánhgiátiênnghiệmpredecessor_iter(X0, B, T , ,n domStatus λ, , S, q, ε)Input: Ma trận X0, ,B T, kích cỡ n, domStatus, λ, hệ số S, q, sai số εOutput: Ma trậnX∗xấp xỉ củaA−1
Bước 1: Tính các giá trịqk← 1
X← X0
X1← next_iter(X0, B, T , n)norm← get_norm(X1−X0,domStatus)error←ε(1−q)(1−S)
Bước 2: Whileqk> error:
X← next_iter(X, B, T , n)qk←qk× q
Bước 3: Trả về X
Trang 14Góiđánhgiáhậunghiệmsuccessor_iter(X0, B, T , n, , , S, q, )Input: Ma trận X0, ,B T, kích cỡ n, domStatus, λ, hệ số S, q, sai số εOutput: Ma trậnX∗xấp xỉ củaA−1
Bước 1: oldX ← X0; newX ← next_iter(X0, B, T , n); error ←ε(1−q)(1−S)λ norm×
Bước 2: While get_norm(newX− oldX, domStatus) > error:oldX← newX
newX← next_iter(newX, B, T , n)Bước 3: Trả về newX
Chươngtrìnhgauss_seidel_inverse(A, n, ,ε mode)
Input: Ma trận , kích cỡA n, sai số ε, chế độ đánh giámode
Output: Ma trậnX∗xấp xỉ củaA−1theo chế độ đánh giá tiên nghiệm nếumode= 1.Nếu không, thực hiện theo chế độ đánh giá hậu nghiệm.
Bước 1: domStatus ← check_dom(A, n)
Nếu domStatus = 0, thông báoAkhông chéo trội và dừng chương trìnhBước 2: Tính các giá trị
E←ma trận đơn vị cỡ nT← diag{a−1
11, a−122, , a−1}B← E − T A
λ← get_lambda(A, domStatus)NếudomStatus= 1:
S← 0
q← get_q(B, n, domStatus)Nếu không:
B1← E − ATS← get_S(B1, n)q← get_q(B1, n, domStatus)Bước 3: Chọn chế độ đánh giá
Nếu mode = 1, trả về predecessor_iter(A,B, T n domStatus,, , λ, ,S q ε, )Nếu không, trả về successor_iter(A, ,B T, n domStatus λ, , , S, q, )ε
Trang 16Gauss-4.2 Ví dụ 2 (Ma trận chéo trội hàng)
Trang 194.3 Ví dụ 3 (Ma trận chéo trội cột gần suy biến)
Tìm nghịch đảo ma trận sau:
2 7 1 0 0001.0 4 0 001.Vẫn với sai số là10−10, ta thu được các kết quả sau:
Trang 214.4 Ví dụ 4 (Ma trận chéo trội cỡ lớn)
Trang 27Phương pháp Gauss-Seidel hội tụ nhanh hơn phương pháp Jacobi Điều này là hoàn toànphù hợp với lí thuyết do phương pháp lặp Gauss-Seidel là một cải tiến của phương pháplặp Jacobi.
5.2 Ưu, nhược diểm của các phương pháp
5.2.1 Ưu điểm
Các phương pháp giải gần đúng ma trận nghịch đảo đều giúp ta kiểm soát và cải thiệnsai số tính toán sau một số lần lặp nhất định, đây là điều mà các phương pháp giải đúngkhông làm được.
Với phương pháp Newton, công thức lặp hội tụ rất nhanh và không yêu cầu nhiều với matrận đầu vào, thuật toán lại đơn giản, dễ nhớ.
Trang 28Bước 1: Nhập sai số vào dòng đầu của file input.txt.
Bước 2: Nhập ma trận cần tìm nghịch đảo vào các dòng sau, lưu ý cần phân tách các giátrị trong cùng một hàng của ma trận bởi dấu cách và xuống dòng khi sang hàng tiếp theo.Bước 3: Chạy chương trình newton.py, chương trình sẽ đưa ra số lần lặp, ma trận nghịchđảo và kết quả kiểm tra nhân ngược Trường hợp ma trận không khả nghịch, chương trìnhsẽ báo lỗi và đưa ra ma trận NaN.
6.2 Phương pháp Jacobi
Đặt các file sau trong cùng một thư mục:Chương trình chính: jacobi.pyFile dữ liệu đầu vào: input.txtCác bước sử dụng:
Bước 1: Nhập chế độ đánh giá vào dòng đầu của file input.txt ( Nhập "1" tương ứng vớichế độ đánh giá tiên nghiệm, nếu không chương trình sẽ chạy theo chế độ đánh giá hậunghiệm)
Bước 2: Nhập sai số vào dòng thứ hai của file input.txt
Bước 3: Nhập ma trận cần tìm nghịch đảo vào các dòng sau, lưu ý cần phân tách các giátrị trong cùng một hàng của ma trận bởi dấu cách và xuống dòng khi sang hàng tiếp theo.Bước 4: Chạy chương trình jacobi.py, chương trình sẽ đưa ra số lần lặp, ma trận nghịchđảo và kết quả kiểm tra nhân ngược Trường hợp ma trận không chéo trội, chương trìnhsẽ báo lỗi và đưa ra ma trận NaN.
Trang 296.3 Phương pháp Gauss-Seidel
Đặt các file sau trong cùng một thư mục:Chương trình chính: gauss_seidel.pyFile dữ liệu đầu vào: input.txtCác bước sử dụng:
Bước 1: Nhập chế độ đánh giá vào dòng đầu của file input.txt ( Nhập "1" tương ứng vớichế độ đánh giá tiên nghiệm, nếu không chương trình sẽ chạy theo chế độ đánh giá hậunghiệm)
Bước 2: Nhập sai số vào dòng thứ hai của file input.txt
Bước 3: Nhập ma trận cần tìm nghịch đảo vào các dòng sau, lưu ý cần phân tách các giátrị trong cùng một hàng của ma trận bởi dấu cách và xuống dòng khi sang hàng tiếp theo.Bước 4: Chạy chương trình jacobi.py, chương trình sẽ đưa ra số lần lặp, ma trận nghịchđảo và kết quả kiểm tra nhân ngược Trường hợp ma trận không chéo trội, chương trìnhsẽ báo lỗi và đưa ra ma trận NaN.
Tài liệu
[1] J Douglas (Douglas Faires) Faires, Richard L.Burden - Numericalmethods (2003)[2] Lê Trọng Vinh -Giáotrìnhgiảitíchsố (2007)
[3] Phạm Kỳ Anh -Giảitíchsố (1996)
[4] Jaan Kiusalaas - NumericalMethodsinEngineeringwithPython (2010)
[5] Adi Ben-Israel - ANoteonanIteractiveMethodforGeneralizedInversionofMatrices (1966)[6] Samuel Daniel Conte - Elementarynumericalanalysis,analgorithmicapproach (1980)