62
Chương 3
GIẢI TÍCH MA TRẬN VÀ ĐẠI SỐ TUYẾN TÍNH
3.1 GIẢI TÍCH MA TRẬN
Để các bạn làm quen với các công cụ của Matlab trong đại số tuyến tính,
trước hết chúng tôi cần nhắc lại một số khái niệm về ma trận và các phép toán
trên ma trận.
3.1.1 Chuyển vị ma trận
Cho ma trận A=(a
ij
)
mxn
. Ma trận chuyển vị của A là ma trận A' =(a'
ij
)
nxm
sao
cho a'
ij
=a
ji
. Nếu A’=A thì A được gọi là một ma trận đối xứng.
Thí dụ 1.
Nếu
1 2 3 4
5 6 7 8
9 10 11 12
A
thì
1 5 9
2 6 10
'
3 7 11
4 8 12
A
.
3.1.2 Định thức của ma trận vuông
Cho ma trận vuông A cấp n . Ta gọi ma trận con của ma trận A tương ứng
với phần tử a
ij
là ma trận vuông cấp n-1 suy từ A bằng cách bỏ đi các phần tử
hàng i và cột j .
Thí dụ 2. Sau đây là ma trận A và các ma trận con M
23
và M
12
tương ứng
với các phần tử a
23
và a
12
của nó:
23 12
1 2 3
1 2 4 6
4 5 6 , ,
7 8 7 9
7 8 9
A M M
.
Định thức của ma trận A vuông cấp n, gọi là định thức cấp n, được định
nghĩa theo phương pháp qui nạp như sau:
- Nếu A là ma trận cấp 1 hay A=(a
11
), thì det(A)=a
11
;
63
- Nếu A là ma trận cấp 2 hay
11 12
21 22
a a
A
a a
thì
det(A) = a
11
a
22
- a
12
a
21
=a
11
det(M
11
) - a
12
det(M
12
);
- Tổng quát: Nếu A là ma trận cấp n≥2 thì
det( )
A
a
11
det(M
11
)-a
12
det(M
12
)+ + (-1)
1+n
a
1n
det(M
1n
),
hay
1
1 1
1
det( ) ( 1) det( )
n
j
j j
j
A a M
. (3.1)
Để tính định thức của ma trận cấp n theo công thức qui nạp, ta phải tính n
định thức cấp n-1. Do đó số phép tính để tính định thức của ma trận cấp n sẽ tăng
theo tốc độ của n!. Trong thực tế, khi cần giải các bài toán về đại số tuyến tính cỡ
lớn, người ta cố gắng tránh các phương pháp có sử dụng định thức.
3.1.3 Ma trận trận nghịch đảo
Giả sử A là ma trận vuông cấp n. Nếu tồn tại ma trận B vuông cấp n sao cho
AB=BA=E (E là ma trận đơn vị cấp n) thì A được gọi là ma trận khả nghịch. Khi
đó B được gọi là ma trận nghịch đảo của A và được kí hiệu là B =A
-1
.
Chỉ ma trận có định thức khác không (hay ma trận không suy biến) mới khả
nghịch đảo và ma trận nghịch đảo của A có thể tính được bằng công thức:
11 21 1
1
12 22 2
1 2
1 1
det( ) det( )
n
T
n
n n nn
c c n
c c c
A C
A A
c c c
. (3.2)
trong đó C=(c
ij
)
nxn
, với c
ij
=(-1)
i+j
det(M
ij
) gọi là phần phụ đại số của phần tử a
ij
của ma trận A.
Chú ý rằng với khái niệm về phần phụ đại số ta có:
1 1
det( ) .
n n
ij ij ij ij
j i
A a c a c
Với công thức trên, để tính ma trận nghịch đảo của ma trận cấp n thì cần
phải tính n
2
định thức cấp n-1. Rõ ràng đây là phương pháp rất kém hiệu quả. Vì
vậy ta cần phải tìm kiếm các phương pháp tính khác, hiệu quả hơn. Sau đây là
một số các hàm ma trận và vector trong Matlab:
64
Bảng 3-1
Một số hàm ma trận và vector trong Matlab
Hàm Ý nghĩa
inv(A)
Tính ma trận nghịch đảo của ma trận vuông A.
det(A)
Tính định thức của ma trận vuông A.
A' hoặc A.' Tạo ma trận chuyển vị của ma trận A.
trace(A)
Hàm vết của ma trận hay tổng các phần tử trên đường chéo
của ma trận A.
rank(A)
Tính hạng của ma trận A.
[m,k]=min(x)
Tính giá trị nhỏ nhất m trong các toạ độ của vector x và vị trí
k đạt min. Nếu x là ma trận thì kết quả là vector hàng gồm giá
trị min của các cột.
[M,k]=max(
x)
Tính giá trị lớn nhất M trong các toạ độ của vector x và vị trí
k đạt max. Nếu x là ma trận thì kết quả là vector hàng gồm giá
trị max của các cột.
mean(x)
Tính giá trị trung bình của các phần tử của vector x. Nếu x là
ma trận thì kết quả là vector hàng gồm giá trị trung bình của
các cột.
[y,k]=sort(x)
Sắp xếp lại các phần tử của x theo thứ tự tăng dần, kết quả trả
cho vector y. Vector k là vector số thứ tự cũ trong x của các
phần tử trong y. Nếu x là ma trận thì các cột của x được sắp
xếp tăng dần.
sum(x)
Tính tổng các phần tử của vector x. Nếu x là một ma trận thì
kết quả là 1 vector hàng, mà mỗi phần tử của vector là tổng
các phần tử của một cột tương ứng.
cumsum(x)
Cộng dồn các phần tử của vector x.
prod(x)
Tính tích các phần tử của vector x. Nếu x là một ma trận thì
kết quả là 1 vector hàng, mà mỗi phần tử của vector là tích các
phần tử của một cột tương ứng.
cumprod
Nhân dồn các phần tử của vector x.
65
Thí dụ 3.
>> A=[ 1 2 3
1 5 1
3 2 1];
>> det(A)
ans =
-32
>> inv(A)
ans =
-3/32 -1/8 13/32
-1/16 1/4 -1/16
13/32 -1/8 -3/32
>> max(A)
ans =
3 5 3
>> min(A)
ans =
1 2 1
>> sum(A)
ans =
5 9 5
>> cumsum(A)
ans =
1 2 3
2 7 4
5 9 5
>> x= [ 0 0 1 -2 3 4 5 -6 -7 -8];
>> [M,k]=max(x)
M =
66
5
k =
7
Chú ý k là vị trí đầu tiên của phần tử đạt max trong x.Tương tự ta có:
>> [m,p]=min(x)
m =
-8
p =
9
>> mean(x)
ans =
-10/9
>> sort(x)
ans =
-8 -7 -6 -2 0 0 1 3 4 5
>> [y,k]=sort(x)
y =
-8 -7 -6 -2 0 0 1 3 4 5
k =
10 9 8 4 1 2 3 5 6 7
>> D= sort(A)
D =
1 2 1
1 2 1
3 5 3
>> prod(A)
ans =
3 20 3
67
>> cumprod(A)
ans =
1 2 3
1 10 3
3 20 3
>>rank (D)
ans =
2
3.1.4 Tích vô hướng
Trong không gian vector V, tích vô hướng của 2 vector x và y, được ký hiệu
là <x,y>, là một số thực hoàn toàn xác định đối với mọi cặp vector x và y, thoả
mãn các tính chất:
- <x , y >= < y, x >;
- <x + y, z> = < x, z > + <y, z >;
- <k x, y > = <x, ky >= k <x, y>, với mọi kR;
- <x, x> 0 ; <x, x>= 0 x=0.
Trong mỗi không gian vector có thể định nghĩa nhiều tích vô hướng khác
nhau. Tuy nhiên, tích vô hướng Euclide là loại tích vô hướng được sử dụng nhiều
nhất trong không gian R
n
. Tích vô hướng Euclide của hai vector x và y
được xác
định như sau:
1 1 2 2
1
,
n
n n i i
i
x y x y x y x y x y
. (3.3)
3.1.5 Chuẩn của vector
Cho một hàm vector hàm f(x) xác định trên không gian vector V, ký hiệu là
x
. Nếu nó thoả mãn các tính chất sau đây với
x
V:
1) 00,0 xxx ,
2) x .
x , R,
3) yxyx (gọi là bất đẳng thức tam giác),
thì
x
được gọi là chuẩn của vector x.
68
Từ định nghĩa về chuẩn vector, với mỗi số p>0 có một chuẩn loại p tương
ứng trong R
n
như sau:
p
p
n
i
i
p
xx
/1
1
với 0 < p +.
Trong đó có 3 loại chuẩn vector thường được sử dụng nhiều nhất là:
-
x max x
i
i
;
-
1 2
1
= x
n
x x x
;
-
1
2 2 2
2
1 2
2
x
n
x x x
.
Từ đó có 3 loại chuẩn của ma trận tương thích với chuẩn vector. Cho A là
một ma trận vuông A =( a
ij
)
n
n
, khi đó:
-
ij
j
= max
i
A a
;
-
ij
1
=max
j
i
A a
;
-
2
= max
j
j
A
, với
j
là các trị riêng của ma trận đối xứng A
T
A.
j
còn được gọi là các trị kì dị (single value) của ma trận A.
Các chuẩn của ma trận cũng thỏa mãn các tính chất 1)-3) của chuẩn vector.
Ngoài ra, giữa chuẩn loại p=0,1,2 của vector và chuẩn loại tương ứng của ma trận
thoả mãn tính chất sau:
p p p
Ax A x
.
Bất đẳng thức trên gọi là tính tương thích của chuẩn ma trận đối với chuẩn
vector. Chuẩn loại 2 cúa vector trong không gian R
n
:
2 2 2
1 2
2
x
n
x x x
còn được gọi là chuẩn Euclide.
Thí dụ 4. Để tính các tích vô hướng và các chuẩn ma trận và chuẩn vector
trong Matlab có thể làm như sau:
69
>> x = [1 2 3 4];
>> y = [ 5 6 7 8];
>> tvh = x*y' %% Tích vô hướng Euclide
tvh=
70
>> chuanVC=max(abs(x))
chuanVC =
4
>> chuan1=sum(abs(x))
chuan1 =
10
>> chuan2 = sqrt(x*x')
chuan2 =
5.4772
>> chuan =sqrt(x' *x); %% Lỗi : sai kích thước
>> A=[ 1 2 3; 4 5 6; 7 8 9];
>>ChuanVC =max(sum(abs(A')))
ChuanVC =
24
>> Chuan1 =max(sum(abs(A)))
Chuan1 =
18
Hàm NORM
Cú pháp:
norm(V,p)
Giải thích. Hàm NORM tính chuẩn loại p của ma trận và vector V.
- Nếu V là một vector p > 0 hoặc inf thì
norm(V,p) = sum(abs(V).^p)^(1/p) : Chuẩn loại p;
norm(V) = norm(V,2) : Chuẩn Euclide;
70
norm(V,inf) = max(abs(V)) : Chuẩn loại vô cùng;
norm(V,-inf) = min(abs(V)).
- Nếu V là một ma trận thì p chỉ có thể 1, 2, inf hoặc 'fro' và
norm (V) = max(svd(V)) : Trị kì dị lớn nhất của V;
norm (V,2) = norm (V);
norm (V,1) = max(sum(abs(V)));
norm (V,inf) = max(sum(abs(V')));
norm (V,'fro')= sqrt(sum(diag(V'*V))) : chuẩn Frobenius.
3.1.6 Phân loại ma trận
Khi nghiên cứu các bài toán trong đại số tuyến tính, người ta thường chia
ma trận thành 2 loại:
- Ma trận lưu trữ được: Các ma trận mà các phần tử của chúng có thể lưu
trữ và xử lí được trong bộ nhớ của MTĐT. Kích thước của các ma trận này
thường không lớn lắm n = 0(10
3
).
- Ma trận thưa: Ma trận có kích thước rất lớn, nhưng phần lớn các phần tử
của chúng đều bằng 0 hoặc ma trận có phần tử không cần lưu trữ mà có thể tính
được bằng qui tắc nào đó.
Thí dụ 5. Một ma trận thưa có dạng 3 đường chéo:
4 1 0 0 0 0 0
1 4 1 0 0 0 0
0 1 4 1 0 0 0
0 0 1 4 0 0 0
0
0 0 0 0 1 4 1
0 0 0 0 0 1 4
A
.
3.1.7 Số điều kiện của ma trận
Giả sử . là một chuẩn nào đó của vector và ma trận và A là một ma trận
vuông. Nếu đặt :
M =
x
Ax
x
sup
0
và m =
x
Ax
x
inf
0
71
thì dễ dàng chứng minh rằng M = A và nếu A không suy biến thì m =
1
1-
A
.
Khi đó, tỷ số
-1
A . A
M
m
.được gọi là số điều kiện của ma trận A và được ký
hiệu là cond(A).
Giả sử x là nghiệm đúng của hệ phương trình tuyến tính Ax = b và x+
x là
nghiệm của hệ phương trình xấp xỉ ( )
A x x b b
. Khi đó
b Ax M x
và
b A x m x
. Từ đó suy ra:
( )
x b b
M
cond A
x m b b
. (3.4)
Biểu thức trên cho thấy sai số tương đối của nghiệm có thể lớn bằng sai số
tương đối của vế phải nhân với cond(A). Ma trận A được gọi là ma trận có số
điều kiện xấu (ill-conditioned-matrix ) nếu cond(A)>>1. Vì vậy việc giải gần
đúng một hệ phương trình với ma trận hệ số A có số điều kiện xấu rất kém ổn
định; Vế phải b chỉ cần thay đổi nhỏ cũng có thể gây sai số khá lớn cho lời giải
của hệ phương trình.
Số điều kiện của ma trận có các tính chất:
i) cond(A) 1;
ii) Nếu A là ma trận trực giao (tức là A'=A
-1
) thì con(A)=1;
iii) Với mọi c
0
R : ta đều có cond(cA) = cond(A);
iv) Nếu D = diag
n
i
d
1
thì cond(D) =
max
min
i
i
d
d
.
Thí dụ 6. Giả sử A=diag
100
1
1,0 , khi đó det(A)=10
-100
nên A là ma trận gần
suy biến. Tuy nhiên do A=0,1E nên A là ma trận có số điều kiện rất tốt và hệ
phương trình Ax=1 dễ dàng giải được một cách chính xác là: x
i
=10,
1,100
i .
Hàm COND
Cú pháp:
cond(A,p)
Giải thích. Hàm COND tính số điều kiện của ma trận A theo chuẩn loại p.
cond(A,p)= norm(A,p)*norm(inv(A),p), nếu p=1,2, inf hoặc 'fro';
cond(A) = cond(A,2).
72
Thí dụ 7.
>> A=hilb(10);
>> C = cond(A)
C =
1.6025e+013
Ta thấy ma trận Hilbert là ma trận có số điều kiện rất xấu.
3.2 MỘT SỐ MA TRẬN ĐẶC BIỆT TRONG MATLAB
Bảng 3-2
Danh sách một số ma trận đặc biệt có trong Matlab
Ma trận Ý nghĩa
magic(n) Ma trận ma phương cấp n
pascal(n)
Ma trận Pascal cấp n
hadamard(n) Ma trận Hadamard cấp n, với n>2. Nó chỉ tồn tại khi n
chia hết cho 4.
hilb(n)
Ma trận Hilber cấp n
invhilb(n)
Ma trận nghịch đảo của ma trận Hilbert cấp n
kron(x,y)
Ma trận tích tensor Kronecker của ma trận x và y.
vander(x)
Ma trận Vandermonde của vector x
Ma trận ma phương là ma trận vuông cấp n sinh bởi các số 1, 2, 3, , n
2
có
các tổng của cột, các tổng hàng và các tổng đường chéo đều bằng nhau.
Thí dụ 8. Ma trận magic cấp 3:
magic(3) =
8 1 6
3 5 7
4 9 2
.
Ma trận Pascal là ma trận vuông cấp n chứa số của tam giác Pascal.
Thí dụ 9. Ma trận Pascal cấp 4:
73
pascal (4)=
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
.
Ma trận Hilber là ma trận vuông cấp n, có phần tử a
ij
= 1/(i+j-1).
Thí dụ 10.
>> A= hilb(4) %% Ma trận Hilbert cấp 4
A =
1.0000 0.5000 0.3333 0.2500
0.5000 0.3333 0.2500 0.2000
0.3333 0.2500 0.2000 0.1667
0.2500 0.2000 0.1667 0.1429
>> B=hilb(10);
>> C = cond(B)
C =
1.6025e+013
Kết quả trên cho thấy ma trận Hilbert là ma trận có số điều kiện rất xấu.
Đây là thí dụ điển hình về ma trận có số điều kiện xấu. Do đó ma trận Hilbert
thường được dùng để thử nghiệm về tính ổn định nghiệm của một phương pháp
giải hệ phương trình tuyến tính.
Ma trận Hadamard là ma trận vuông H cấp n gồm các phần tử 1 và -1 sao
cho H'*H= n*eye(n). Nó chỉ tồn tại khi n chia hết cho 4. Matlab chỉ tính được
ma trận Hadamard khi n, n/12 hay n/20 là lũy thừa của 2.
Thí dụ 10.
>> H=hadamard(4)
H =
1 1 1 1
1 -1 1 -1
1 1 -1 -1
1 -1 -1 1
Ma trận Vandermonde của vector x=(x
1
,x
2
, , x
n
) là ma trận:
74
vander(x) =
1
1
1
21
2
2
2
1
2
1
2
1
1
1
nn
n
n
n
n
xxx
xxx
xxx
.
Ma trận Vandermonde được sử dụng trong nội suy bằng đa thức.
Tích tensor Kronecker của 2 ma trận A
mxn
và B là ma trận có dạng:
kron(A,B) =
11 12 1
21 22 2
1 2
n
n
m m mn
a B a B a B
a B a B a B
a B a B a B
.
Bảng 3-3
Các hàm trích phần tử từ một ma trận.
Hàm Ý nghĩa
diag
(A,p)
Nếu A là 1 ma trận thì hàm sẽ tạo ra 1 vector cột từ đường chéo thứ
p của ma trận A. Nếu A là 1vector thì hàm sẽ tạo ra 1 ma trận vuông
có đường chéo thứ p là vector A, còn các phần tử khác đều bằng 0.
Mặc định của p là 0 (đường chéo chính).
triu
(A,p) Hàm sẽ tạo ra một ma trận cùng cỡ với ma trận A, có các phần tử từ
đường chéo thứ p trở lên được lấy từ A, còn các phần tử khác (phía
dưới đường chéo thứ p) đều bằng 0. Mặc định của p là 0.
tril
(A,p) Hàm sẽ tạo ra một ma trận cùng cỡ với ma trận A, có các phần tử từ
đường chéo thứ p trở xuống được lấy từ A, còn các phần tử khác
(phía trên đường chéo thứ p) đều bằng 0. Mặc định của p là 0.
Thí dụ 11.
>> A =[ 1 2 3 4
5 6 7 8
9 10 11 12];
>> B = diag(A)
B =
75
1
6
11
>> C = diag(A, 2)
C =
3
8
>> D = diag(A,-3)
D =
Empty matrix: 0-by-1
>> E = tril(A)
E =
1 0 0 0
5 6 0 0
9 10 11 0
>> F=diag(B)
F =
1 0 0
0 6 0
0 0 11
>> G = triu(A)
G =
1 2 3 4
0 6 7 8
0 0 11 12
>> H = triu(A,2)
H =
0 0 3 4
76
0 0 0 8
0 0 0 0
>> C = tril(A,-2)
C =
0 0 0 0
0 0 0 0
9 0 0 0
3.3 CÁC PHƯƠNG PHÁP GIẢI HỆ PHƯƠNG TRÌNH
TUYẾN TÍNH
Xét hệ phương trình đại số tuyến tính có dạng Ax=b, trong đó A là một ma
trận vuông cấp n và b là một vector cột n chiều. Để giải hệ phương trình Ax=b ta
có các phương pháp giải như sau:
3.3.1 Phương pháp Cramer
Nếu A là ma trận không suy biến thì hệ phương trình có duy nhất nghiệm
xác định bởi biểu thức:
det( )
; 1,
det( )
j
j
A
x j n
A
(3.5)
trong đó A
j
là ma trận vuông cấp n suy từ A bằng cách thay cột thứ j của A
bởi vector vế phải b.
Xét về hiệu quả tính toán thì phương pháp này rất tồi. Người ta tính được
số phép tính số học (+, -, và / ) của phương pháp này là:
N
C
(n)=(n+1)!n .
Bạn hãy tưởng tượng, nếu phải giải hệ phương trình 15 ẩn (n=15) theo
phương pháp Cramer trên MTĐT có tốc độ tính toán là 1 tỷ phép tính/giây thì
phải mất 3,6 ngày tính toán liên tục; Còn nếu số ẩn là n=20 thì thời gian tính toán
là 32 nghìn năm. Những con số thật khủng khiếp. Tuy nhiên công thức Cramer
có ý nghĩa khi ta nghiên cứu một số tính chất của lời giải.
77
3.3.2 Phương pháp ma trận nghịch đảo
Đây là một hình thức thể hiện khác của phương pháp Cramer. Nếu A là ma
trận không suy biến thì từ biểu thức Ax=b suy ra hệ phương trình có duy nhất
nghiệm xác định bởi biểu thức x=A
-1
b. Vì vậy bạn dễ dàng có thể sử dụng Matlab
để tính nghịch đảo của ma trận A và giải hệ phương trình như sau:
>> x= inv(A)*b
Thoạt nhìn công thức thì có vẻ đơn giản và rõ ràng, nhưng phương pháp
trên lại rất kém hiệu quả khi tính toán. Vì vậy việc giải hệ phương trình tuyến
tính trên MTĐT rất hiếm khi người ta sử dụng ma trận nghịch đảo A
-1
. Tuy nhiên
việc tính ma trận nghịch đảo rõ ràng là vẫn rất cần thiết bởi vì biểu diễn trên là
công thức “chính xác” để giải bài toán đại số tuyến tính. Nhiều khi chúng ta cần
quan tâm vector nghiệm x và các tính chất của nó.
3.3.3 Phương pháp Gauss
Xét hệ phương trình Ax =b trong trường hợp A là ma trận tam giác trên và
các hệ số trên đường chéo chính đều khác 0:
11 12 1, 1 1
1 1
22 2, 1 2
2 2
1 1
1, 1 1,
0
0 0
0 0 0
n n
n n
n n
n n n n
n n
nn
a a a a
x b
a a a
x b
x b
a a
x b
a
Khi đó hệ phương trình Ax=b có thể giải một cách đơn giản bằng phương
pháp thế ngược từ dưới lên theo công thức sau đây mà không phải tính một định
thức nào:
n
n
nn
b
x
a
,
1
, 1 1 , 2 2
- -
n
k kj j
j k
k k k k k k k kn n
k
kk kk
b a x
b a x a x a x
x
a a
,
với
, 1, ,1
k n n
.
Tương tự, nếu A là ma trận tam giác dưới với các phần tử trên đường chéo
chính khác 0, thì có thể giải hệ phương trình bằng phương pháp thế xuôi từ trên
78
xuống như sau:
1
1
11
x
b
a
,
1
1
1 1 2 2 , 1 1
- -
k
k kj j
j
k k k k k k
k
kk kk
b a x
b a x a x a x
x
a a
, với
2,
k n
Phương pháp Gauss
Nếu A không phải một ma trận tam giác, có thể dùng các phép biến đổi sơ
cấp về hàng của ma trận để biến đổi dần ma trận mở rộng
A
=[A,b] của ma trận
A về dạng ma trận tam giác trên, rồi dùng phương pháp thế ngược nói trên để tính
vector x. Công việc đó được gọi là quá trình xuôi của phương pháp Gauss:
- Trước hết đặt A
(0)
=[A,b].
- Quá trình xuôi gồm n-1 bước. Tại bước thứ k=
1,1 n
thực hiện:
+ Đặt A
(k)
=A
(k-1)
;
+ Tại hàng i >k tính
1 1
1
1
.
, , 1
k k
k k
ik kj
ij ij
k
kk
a a
a a j k n
a
. (3.6)
Nếu trong quá trình tính toán các phần trử trụ
k 1
kk
a
đều khác không thì khi
kết thúc quá trình xuôi ta được ma trận A
(n-1)
có dạng tam giác trên.
Phương pháp Gauss -Jordan (Còn gọi là phương pháp Gauss cải tiến
hay phương pháp Chọn trụ tối đại).
Trong quá trình tính toán của phương pháp Gauss, nếu gặp phần tử trụ
0
1
k
kk
a thì không thể tiến hành bước tiếp theo được; Hoặc nếu phần tử trụ có
giá trị quá nhỏ thì kết quả của phép chia cũng sẽ kém chính xác vì vậy cần phải
cải tiến phương pháp Gauss như sau:
- Đặt A
(0)
= [A,b].
- Quá trình xuôi gồm n bước. Tại bước thứ k=
n,1
thực hiện:
+ Tìm
1
k
ik
r arg max a :i k,n
;
79
+ Nếu a
rk
=0 thì ma trận A suy biến, nên phải ngừng giải; Ngược lại, nếu
r
k thì tiến hành đổi chỗ 2 hàng r và k của ma trận A
(k-1)
;
+ Đặt A
(k)
=A
(k-1)
;
+ Tại hàng k tính
1
1
, , 1
k
k
kj
kj
k
kk
a
a j k n
a
;
+ Tại hàng i >k tính
1 1
1
1
.
, , 1
k k
k k
ik kj
ij ij
k
kk
a a
a a j k n
a
,
hay
1 1
. , , 1
k k k k
ij ij
ik kj
a a a a j k n
.
Kết quả của thủ tục là thu được ma trận tam giác trên A
(n)
có các phần tử
trên đường chéo chính bằng 1. Có thể tính được số phép tính số học cần sử dụng
cho phương pháp Gauss (kể cả 2 quá trình xuôi và ngược) là:
3 2
G
1
n (4 9 7 )
6
N n n n
.
3.3.4 Phương pháp phân tích QR và phương pháp phân tích LU
Để giải hệ phương trình tuyến tính trên MTĐT người ta thường phân tích
ma trận A thành tích của 2 ma trận, mỗi ma trận đó dễ nghịch đảo hơn ma trận A.
Do đó sẽ giảm nhẹ khối lượng tính toán. Có 2 phương pháp phân tích ma trận:
Phương pháp phân tích QR
Phân tích ma trận A thành tích của ma trận trực giao Q (ma trận unitar) và
ma trận tam giác trên R. Ta có thể viết lại hệ phương trình gốc như sau:
Ax = QRx = b
Việc tính nghịch đảo của ma trận Q là tầm thường; Và khi đó hệ phương
trình trở thành:
Rx = Q
T
b
Hệ phương trình mới có dạng tam giác trên nên có thể dễ dàng giải bằng
quá trình thế ngược. Như vậy việc giải hệ không cần phải tính nghịch đảo của ma
trận A. Để xác định các ma trận Q và R có thể sử dụng hàm QR của Matlab có cú
pháp như sau:
[Q,R,P] =qr(A)
80
Giải thích:
- A là một ma trận vuông cần phân tích;
- Q là ma trận trực giao và R là ma trận tam giác trên;
- P là ma trận giao hoán thỏa mãn Q*R = P*A.
Sở dĩ cần phải sử dụng thêm ma trận giao hoán vì trong quá trình tính toán,
giống như phương pháp Gauss, khi gặp trường hợp phải chia cho 0 thì cần phải
hoán vị các hàng của ma trận.
Phương pháp phân tích LU
Hãy xem xét lại phương pháp khử Gauss. Tại bước thứ k=
1,1 n
của
phương pháp Gauss, ta giữ lại k hàng đầu của ma trận A
(k-1)
và biến đổi phần tử
1k
ik
a (i>k) thành 0. Mỗi bước như vậy tương đương với việc nhân bên trái ma
trận A
(k-1)
với một ma trận sơ cấp có dạng tam giác dưới E
k
. Quá trình đó đưa dần
dần ma trận A về dạng ma trận tam giác trên U có các phần tử trên đường chéo
bằng 1. Nói cách khác E
n
E
n-1
E
1
A= MA=U hay A =M
-1
U=LU.
Phép phân tích này thực hiện được nếu như tất cả các phần tử trụ
1
0 1
k
kk
a , k ,n
tức là các định thức con chính của ma trận A đều phải khác
không. Tuy nhiên trong khi tính toán ta có thể gặp trường hợp
1
0
k
kk
a
, giống
như phương pháp Gauss cải tiến, ta cần đổi chỗ hàng k với một hàng r nào đó ở
dưới. Vì vậy cũng cần lưu trữ các phép đổi chỗ bằng một ma trận giao hoán để sử
dụng cho việc biến đổi tương ứng vector vế phải của hệ phương trình.
Để tìm các ma trận L và U ta có thể dùng thủ tục Crout gồm n-1 bước. Vì L
là ma trận tam giác dưới có các phần tử đường chéo bằng 1 và U là ma trận tam
giác trên nên trong khi tính toán ta có thể lưu trữ chúng chung vào ma trận kí
hiệu là B có dạng:
11 12 1
21 22 2
1 2
n
n
n n nn
u u u
l u u
B
l l u
.
Quá trình tính toán được thực hiện theo thủ tục gồm n bước sau đây.
81
Thủ tục Crout
Bước 1 . Đặt D
1
= A.
Bước k=2,3 n. Tại bước k-1 ma trận A đã được biến đổi thành:
11 12 1 1 1
21 22 2 1 2
1,1 1,2 -1, -1 1,
1 2 , -1
,
u
k n
k n
k k k k k n
n n n k
u u u u
l u u u
l l u
l l l
trong đó D
k
là ma trận vuông cấp n-k+1 (tức là có k-1 hàng và k-1 cột của B
đã được tính toán xong). Tiếp tục biến đổi D
k
=
1kk
T
kkk
Hs
uu
thành
1kk
T
kkk
Dl
uu
theo công thức:
1
k k
kk
l s
u
và
1 1
T
k k k k
D H l u
.
Bằng phép phân tích trên ta đã biểu diễn A thành tích của hai ma trận tam
giác dưới L và tam giác trên U. Vì vậy chúng ta có:
Ax = LUx = b
Đặt Ux = y, rồi giải hệ phương trình Ly = b. Vì L là tam giác dưới nên dễ
dàng giải bằng quá trình thế xuôi để tính y. Sau đó ta lại giải hệ phương trình
Ux=y bằng quá trình thế ngược để tìm nghiệm x. Như vậy chúng ta cũng không
cần phải tính ma trận nghịch đảo nào cả.
Để xác định các ma trận L và U có thể sử dụng lệnh của Matlab theo cú
pháp như sau:
[L,U,P] =lu(A)
Giải thích:
- A là một ma trận vuông cần phân tích ;
- L là ma trận tam giác dưới và U là ma trận tam giác trên;
- P là ma trận giao hoán thỏa mãn L*U = P*A
82
Tuy nhiên, để giải hệ phương trình Ax=b bằng phương pháp phân tích LU
ta có thể dùng dòng lệnh của Matlab sau:
>> x = A\ b %% Giải phương trình bằng phương pháp phân tích LU và
%% hai thủ tục giải tiến và lùi luân phiên nhau.
Cần chú ý là cả hai phương pháp ma trận nghịch đảo và phương pháp phân
tích LU đều dẫn đến một kết quả vì đều là các phương pháp chính xác. Tuy
nhiên tính bằng phương pháp phân tích LU có hiệu quả hơn. Do đó nên chọn
phương pháp này để giải hệ phương trình tuyến tính. Việc phân tích LU đặc biệt
có lợi nếu ta phải giải nhiều hệ phương trình có ma trận hệ số A giống nhau,
nhưng vector vế phải khác nhau.
Hãy xem xét một thí dụ về ứng dụng của giải hệ phương trình.
Thí dụ 12. Hãy tính các cường độ dòng điện i
1
, i
2
, i
3
của một mạch điện
như trên hình vẽ:
R1 R3 R5
+
i
1
i
2
i
3
+
V1 -
R2 R4 - V2
Giả sử các điện trở và điện áp đã biết. Để tính các dòng điện trong mạch
điện ta sẽ sử dụng định luật Kitchhoff : tổng điện áp rơi trên mỗi mạch vòng phải
bằng không để mạch điện cân bằng. Ta có hệ phương trình:
- V
1
+ R
1
i
1
+ R
2
(i
1
- i
2
) = 0
R
2
(i
2
- i
1
) + R
3
i
2
+ R
4
(i
2
- i
3
) = 0
R
4
(i
3
- i
2
) + R
5
i
3
+ V
2
= 0
Có thể viết lại hệ phương trình dưới dạng ma trận như sau:
1 2 2 1 1
2 2 3 4 4 2
4 4 5 3 2
0
0
0
R R R i V
R R R R R i
R R R i V
.
Sau đây là một chương trình Matlab cho bài toán trên:
83
% MATLAB code for electric circuit analysis
R1 = input( 'Enter resistor R1');
R2 = input( 'Enter resistor R2');
R3 =input( 'Enter resistor R3');
R4 = input( 'Enter resistor R4');
R5= input( 'Enter resistor R5');
V1= input( 'Enter voltage source V1');
V2= input( 'Enter voltage source V2');
b= [ V1; 0; -V2]; %% Forming the right-hand-side vector
A=[ R1+R2 -R3 0
-R2 R2+R3+R4 -R4
0 -R4 R4+R5]; %% Forming the matrix
x = A\ b %% Solving and printing the three currents.
3.3.5 Phương pháp Cholesky (Phương pháp căn bậc 2)
Đâylà một trường hợp riêng của phương pháp phân tích LU. Nếu A là ma
trận đối xứng, tức là A=A
T
, người ta đã chứng minh được rằng khi đó tồn tại tam
giác trên S =(s
ij
)
nxn
sao cho A=S
T
S. Khi đó hệ phương trình Ax=b trở thành
S
T
Sx=b. Đặt Sx=y thì S
T
y=b. Cần chú ý là s
ij
=0 nếu i>j và ma trận S
T
là ma trận
tam giác dưới. Nên có thể tính vector y như sau:
y
1
=
1
11
b
s
1
1
1
1 1 2 2 -1, -1
-
- -
k
k k j
j
k k k k k k
k
kk kk
b s y
b s y s y s y
y
s s
, k=2,3, n.
Và công thức giải hệ tam giác trên Sx=y trở thành:
x
n
=
n
nn
y
s
x
k
=
1
, 1 1 , 2 2
-
- - -
n
k kj j
j k
k k k k k k k kn n
kk kk
b s x
y s x s x s x
s s
, k=n-1,n-2, 1.
84
Vấn đề còn lại là tìm cách tính ma trận S như thế nào. Từ phương trình
S
T
S=A ta có:
,
ij
1 1
n i
kj ki kj
ik
k k
a s s s s
a
ij
, với
i j
.
Từ đó suy ra:
s
11
=
11
a
, s
1j
= a
1j
/ a
11
với j=2,3, ,n;
1
2
1
i
ii ii ki
k
s a s
với i=1,2, ,n;
1
ij ij
1
/
i
ki kj ii
k
s a s s s
với j >i ; s
ij
= 0 với j <i.
Chú ý rằng nếu các phần tử trên đường chéo chính (s
ii
) của ma trận S đều
khác không thì det(A)=
2
1
ii
n
i
s
0 khi đó hệ phương trình có duy nhất nghiệm.
Phương pháp Cholesky tính toán được cả trong trường hợp s
ij
có thể là các số
phức. Tổng khối lượng tính toán của phương pháp là:
N
ch
(n) =
nnnn 25152
6
1
23
.
3.3.6 Các phương pháp lặp
Phương pháp lặp đơn
Khi giải một hệ phương trình cỡ lớn trong thực tế. Nhiều khi ta không cần
phải tính nghiệm của hệ một cách quá chính xác. Đối với nhiều bài toán ta chỉ
cần tìm nghiệm xấp xỉ của hệ với một sai số cho phép và giải bằng một phương
pháp không mất quá nhiều công sức tính toán.
Xét hệ phương trình Ax=b. Bằng cách nào đó ta đưa hệ về dạng tương
đương x=Bx+g. Sau đó tính toán theo thủ tục lặp đơn như sau:
- Chọn nghiệm xấp xỉ đầu x
(0)
;
- Bước lặp k=1,2,3 : tính x
(k)
= Bx
(k-1
+g;
Thuật toán sẽ dừng lại khi x
(k)
đạt được sai số cho phép.
85
Nếu B = q<1 thì phương pháp lặp đơn hội tụ với mọi vector xấp xỉ đầu
x
(0)
và có sai số của lời giải tại bước k được ước lượng theo công thức như sau:
1 0
1
k
k
q
x x x
q
hoặc
1
1
k k k
q
x x x
q
.
Phương pháp lặp Seidel
Cũng như phương pháp lặp đơn, đầu tiên ta đưa hệ phương trình Ax=b về
dạng tương đương x=Bx+g. Rồi phân tích B =B
1
+ B
2
,
trong đó:
1
11 12 13 1
21
22 23 2
31 32
2
33 3
1 2 3
0 0 0 0
0 0 0
0
0 0
,
0 0
0 0 0
0
n
n
n
nn
n n n
b b b b
b
b b b
b b
B B
b b
b
b b b
.
Sau đó tính lặp :
- Chọn nghiệm xấp xỉ đầu x
(0)
;
- Bước lặp k=1,2,3…: tính x
(k)
= B
1
x
(k)
+ B
2
x
(k-1)
+g;
Thuật toán sẽ dừng lại khi đạt được sai số cho phép.
Dạng toạ độ của công thức lặp trong bước k là :
1
1
1
i n
k k k
ij ij
i j j
j j i
x b x b x
(3.7)
Ý tưởng của phương pháp Seidel là thông tin càng được khai thác sớm càng
tốt. Vì thế khi
1
k
i
x
vừa được tính xong, nó được được sử dụng ngay để tính
k
i
x
.
Nếu B =q<1 thì phương pháp lặp Seidel sẽ hội tụ với mọi vector xấp xỉ đầu x
(0)
và có thể sử dụng công thức sai số như của phương pháp lặp đơn.
Phương pháp Gauss-Seidel
Ma trận vuông A được gọi là ma trận chéo trội nếu thoả mãn một trong hai
điều kiện:
86
a)
ij
j i
1 , a
ii
i ,n a
;
b)
ij
i
1 , a
jj
j
j ,n a
.
Phương pháp Gauss-Seidel là phương pháp Seidel được sự áp dụng cho
trường hợp ma trận A có dạng chéo trội.
+ Trường hợp A là chéo trội dạng (a). Phương trình thứ i của hệ phương
trình Ax = b được biến đổi theo phương pháp Jacoby như sau:
Phương trình
ii i ij j i
j i
a x a x b
với
i 1,n
được biến đổi thành
, i 1,n
ij
i
i j
ii ii
j i
a
b
x x
a a
. (3.8)
Khi đó, hệ có dạng x=Bx+g trong đó:
ij
0 khi
b
- khi
ij
ii
j i
a
j i
a
và g
i
=
ii
i
a
b
. (3.9)
Rõ ràng là
1
B
, nên có thể sử dụng công thức Seidel để tính vector x.
+ Trường hợp A là chéo trội dạng (b). Đổi biến z
i
= x
i
.a
ii
, rồi thay vào
(3.8) ta được:
, i 1,n
ij
i j i
jj
j i
a
z z b
a
. (3.10)
Hệ (3.10) có dạng z=Bz+g trong đó:
ij
ij
jj
0 khi j i
a
b
- khi j i
a
và g
i
=b
i
. (3.11)
Rõ ràng là 1
1
B , nên có thể sử dụng công thức Seidel để tính vector z.
Sau đó lại tính vector x theo công thức x
i
= z
i
/a
ii
.