You are on page 1of 22

Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

Chương 2

MA TRẬN VÀ MẢNG TRONG MATLAB


Tất cả mọi sự tính toán đều có một điểm chung là có sử dụng đến các đại lượng
vô hướng gọi là scalars. Phép toán có liên quan đến scalars là các phép toán cơ
bản, nhưng một lúc nào đó phép toán phải lập lại nhiều lần khi tính trên nhiều số.
Ðể giải quyết vấn đề này MATLAB đưa ra các khái niệm và thao tác tính toán
trên mảng và ma trận.

2.1. Mảng đơn


2.1.1. Cấu trúc các mảng cơ bản
- Ðể tạo mảng, ta đặt các phần tử của mảng vào giữa hai dấu ngoặc vuông, giữa
hai phần tử của mãng có thể là dấu cách hoặc dấu phẩy.
- Với mảng có số lượng phần tử ít thì ta có thể nhập vào trực tiếp, nhưng với
mảng có số lượng lớn các phần tử thì ta có thể dùng các cách sau:
x = first : last : tạo vectơ hàng x bắt đầu tại first, phần tử sau bằng phần tử trước
cộng với 1, kết thúc là phần tử có giá trị bằng hoặc nhỏ hơn last.
x = first : increment : last : tạo vectơ hàng x bắt đầu tại first, giá trị cộng là
increment, kết thúc là phần tử có giá trị bằng hoặc nhỏ hơn last.
x = linspace (first,last,n): tạo vectơ hàng x bắt đầu tại first, kết thúc là last, có n
phần tử.
x = logspace (first,last,n): tạo vectơ hàng không gian logarithm x bắt đầu tại
10first, kết thúc tại 10last, có n phần tử.

Ví dụ:
>> a=1:5
a=
1 2 3 4 5
>> b=[6 7 8]
b=
6 7 8
>> c=[a b]
c=
1 2 3 4 5 6 7 8

2.1.2. Vectơ hàng và vectơ cột


Trong các ví dụ trước, mảng chứa một hàng và nhiều cột, thường gọi là vectơ
hàng. Mảng có một cột và nhiều hàng gọi là vectơ cột.

12
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

Ðể tạo vectơ cột, ta dùng dấu chấm phẩy để phân cách các phần tử. Ngoài ra, ta
cũng có thể dùng các hàm linspace, logspace, hay từ các vectơ hàng, sau đó
dùng phương pháp chuyển vị.
Ví dụ:
>> x=linspace(0,pi,5)
x=
0 0.7854 1.5708 2.3562 2.1416
>> y=x'
y=
0
0.7854
1.5708
2.3562
2.1416

2.2. Ma trận
2.2.1. Nhập một ma trận trong MATLAB
2.2.1.1. Nhập một ma trận từ một danh sách tường minh:
Một ma trận trong MATLAB được định nghĩa như một mảng nhiều chiều và theo
nguyên tắc sau:
Mỗi phần tử trên từng dòng của ma trận được cách nhau bởi dấu phẩy hoặc
khoảng trống.
Mỗi hàng được phân cách bởi một dấu chấm phẩy.
Bao quanh ma trận bởi một cặp ngoặc vuông.
Ví dụ:
Tạo ma trận 3x3:
1 2 3
 4 5 6
 
7 8 9
Lệnh MATLAB:
>> A=[1 2 3;4 5 6;7 8 9]
A=
1 2 3
4 5 6
7 8 9
2.1.1.2. Tạo ma trận từ những hàm có sẵn trong MATLAB:
MATLAB có một thư viện các hàm cho phép tạo ma trận. Sau đây là một số
hàm:
zeros(n,m): tạo một ma trận kích thước n x m, với các phần tử đều bằng không.
eye(n): tạo một ma trận đơn vị kích thước n x n.
ones(n,m): tạo ma trận kích thước n x m, với các phần tử đều bằng một.
13
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

rand(n,m): tạo ma trận kích thước n x m, với các phần tử có giá trị ngẫu nhiên từ
0 -1
diag(V): nếu V là một vectơ sẽ tạo ra ma trận đường chéo, với các phần tử của
vectơ V nằm trên đường chéo.
Ví dụ:
>> zeros(2,3)
ans =
0 0 0
0 0 0
>> diag([1 2 3])
ans =
1 0 0
0 2 0
0 0 3

2.1.1.3. Nhập ma trận từ một file


Lệnh Load trong MATLAB dùng để đọc file chứa ma trận tạo ra từ những lệnh
MATLAB trước đó. Lệnh này còn dùng để đọc text file chứa những dữ liệu số.
Text file phải được tổ chức như một bảng số mà các phần tử được cách nhau bởi
các khoảng trống, mỗi hàng của ma trận chiếm mỗi hàng của text file. Số phần tử
của mỗi hàng phải bằng nhau.

2.1.1.4. Sử dụng M-file


Trên màn hình MATLAB, chọn File → New → M-file. Trên màn hình soạn thảo
nhập vào các lệnh sau:
A=[1 2 3
456
7 8 9]
Save file với tên matran. Sau đó từ màn hình MATLAB đánh vào: matran
Kết quả là:
A=
1 2 3
4 5 6
7 8 9

2.2.2. Các thao tác đối với ma trận


2.2.2.1. Sự móc nối ma trận
MATLAB cho phép kết hợp các ma trận con để tạo nên một ma trận lớn hơn.
Ví dụ:
>> b=ones(3,3);
>> c=zeros(3,3);
>> a=[b c;c b]
14
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

a=
1 1 1 0 0 0
1 1 1 0 0 0
1 1 1 0 0 0
0 0 0 1 1 1
0 0 0 1 1 1
0 0 0 1 1 1

2.2.2.2. Xóa dòng và cột của ma trận


MATLAB cho phép xóa dòng hoặc cột của ma trận bằng cách gán các giá trị
rỗng cho hàng hoặc cột của ma trận. Một giá trị rỗng được kí hiệu bởi [].
Ví dụ:
>> a=[1 2 3;4 5 6;7 8 9]
a=
1 2 3
4 5 6
7 8 9
>> a(2,:)=[]
a=
1 2 3
7 8 9
>> a(:,3)=[]
a=
1 2
7 8

2.2.2.3. Ma trận chuyển vị


Ma trận chuyển vị của ma trận A là một ma trận mà các hàng của ma trận A là
các cột của ma trận này.
Ví dụ:
>> a=[1 2 3;4 5 6;7 8 9]
a=
1 2 3
4 5 6
7 8 9
>> b=a'
b=
1 4 7
2 5 8
3 6 9

15
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

2.2.2.4. Lệnh diag


Dùng để tạo ma trận đường chéo và rút ra đường chéo của ma trận
Cú pháp:
diag(v,k): nếu v là một vectơ gồm n phần tử thì kết quả là một ma trận
vuông bậc n + |k|.
Trong đó các phần tử của v nằm trên đường chéo thứ k. Nếu k = 0,
đường chéo là đường chéo chính, k > 0 là đường chéo thứ k nằm trên
đường chéo chính, k < 0 là đường chéo thứ k nằm dưới đường chéo
chính.
diag(X,k): nếu X là một ma trận thì kết quả là một vectơ cột hình thành
từ những phần tử của đường chéo thứ k.
diag(X): trả về một vectơ là đường chéo chính của ma trận.
diag(diag(X)): trả về một ma trận đường chéo.

Ví dụ:
>> v=[1 2 3];
>> diag(v,1)
ans =
0 1 0 0
0 0 2 0
0 0 0 3
0 0 0 0
>> X=[1 2 3;4 5 6;7 8 9];
>> diag(X,0)
ans =
1
5
9

2.2.2.5. Lệnh sum


Tính tổng các hàng hay các cột của ma trận.
Cú pháp:
sum(X) hay sum(X,1): trả về một vectơ mà mỗi phần tử là tổng của từng cột
trong ma trận.
sum(X,2): trả về một vectơ mà mỗi phần tử là tổng của từng hàng trong ma trận.

Ví dụ:
>> a=[1 2 3;4 5 6;7 8 9]
a=
1 2 3
4 5 6

16
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

7 8 9
>> tong_cot=sum(a)
tong_cot =
12 15 18
>> tong_hang=sum(a,2)
tong_hang =
6
15
24

2.2.2.6. Ma trận symbolic


Có hai cách định nghĩa một ma trận symbolic:
- Từ các tham số
- Từ các số thực
Ðể định nghĩa ma trận symbolic, hai lệnh sym và syms thường được sử dụng:
sym(‘a’): trả về kết quả là một biến symbolic tên là a.
sym(‘[…;…;…]’):trả về một ma trận symbolic.
sym(A): với A là một số thực hay ma trận số thực sẽ trả về một biến hay ma trận
symbolic.
syms arg1 arg2 tương đương với arg1 = sym(‘arg1’) ; arg2 = sym(‘arg2’)

2.2.2.7. Lệnh det


Dùng để tính định thức của ma trận.
Cú pháp:
det(A): kết quả là biểu thức symbolic nếu A là ma trận symbolic, là một
giá trị số nếu A là một ma trận số.

Ví dụ:
>> syms a b c d
>> A=[a b;c d];
>> r=det(A)
r=
a*d-b*c

Ðối với một số ma trận đặc biệt ta có một số kết quả sau:
- Ðịnh thức của một ma trận đơn vị bằng một.
- Ðịnh thức của một ma trận đường chéo đơn giản là tích của của các
phần tử đường chéo.
Một ma trận mà định thức của nó có giá trị bằng không người ta gọi đó là ma trận
suy biến. Ngoài việc dùng định thức để giải hệ phương trình tuyến tính, người ta
còn dùng nó để xác định điều kiện có nghiệm hay không của hệ.

17
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

2.2.2.8. Các toán hạng ma trận


Trong MATLAB tồn tại các toán hạng sau:
Cộng ma trận A và B. A và B phải có cùng kích thước, ngoại trừ một trong
A+B
hai là một giá trị vô hướng.
Trừ ma trận A và B. A và B phải có cùng kích thước, ngoại trừ một trong hai
A–B
là một giá trị vô hướng.
Nhân ma trận A và B. Số cột của ma trận A phải bằng số hàng của ma trận B,
A*B
ngoại trừ một trong hai là một giá trị vô hướng.
Nhân từng phần tử của ma trận A với từng phần tử của ma trận B. Kết quả là
A .* B một ma trận. A và B phải có cùng kích thước, ngoại trừ một trong hai là một
giá trị vô hướng
Chia trái ma trận. X = A\B tương đương với việc giải hệ phương trình tuyến
A\B
tính A*X = B
Chia trái mảng. A .\ B tương đương với B(i,j)/A(i,j). A và B phải có cùng kích
A .\ B
thước, ngoại trừ một trong hai là một giá trị vô hướng.
Chia phải ma trận. X = A/B tương đương với việc giải hệ phương trình tuyến
A/B
tính B*X = A.
Chia phải mảng. A ./ B tương đương với A(i,j)/B(i,j). A và B phải có cùng
A ./ B
kích thước, ngoại trừ một trong hai là một giá trị vô hướng.
A ^ B Lũy thừa ma trận. Lỗi sẽ phát sinh nếu A và B đều là ma trận.
Lũy thừa mảng. Kết quả là một ma trận mà các số hạng là A(i,j)^B(i,j). A và
A .^ B
B phải có cùng kích thước, ngoại trừ một trong hai là một giá trị vô hướng.

2.3. Gải hệ phương trình tuyến tính


Một hệ phương trình tuyến tính có dạng tổng quát sau:
a11x1 + a12x2 + a1nxn = b1
a21x1 + a22x2 + a2nxn = b2
M M
am1x1 + am2x2 + amnxn = bm
Với: A = [aij]m x n là ma trận hệ số.
A* = [A b]m x (n +1) là ma trận đầy đủ.
Một số phương pháp để giải hệ này:
- Nghịch đảo ma trận
- Phương pháp khử Gauss
- Phương pháp khử Gauss - Jordan
- Phương pháp phân rã ma trận (LU)

Một trong những ứng dụng của MATLAB là để giải hệ phương trình đại số tuyến
tính. Trong MATLAB có một số hàm đã được xây dựng để sử dụng cho các
phương pháp này.

18
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

2.3.1. Nghịch đảo ma trận


Xét hệ phương trìng tuyến tính. Dưới dạng ma trận hệ có dạng sau:
AX = B ⇒ X = A-1B
Với A-1 là ma trận nghịch đảo của ma trận hệ số A.
 a 11 a 12 L a 1n   x1   b1 
a a L a 2n  x  b 
   
A =  21 22  X= 2 B= 2
 M M O M  M M
  x n  b n 
a n1 a n2 K a nn 

2.3.1.1. Lệnh inv


inv(A): dùng để tính ma trận nghịch đảo.

Ví dụ: giải hệ phương trình tuyến tính A*X = B sau:


1 1 - 2   x1  4 
     
A = 1 3 - 1  X = x 2  B = 7 
2 1 - 5 x  7 
 3  
>> A=[1 1 -2;1 3 -1;2 1 -5];
>> B=[4;7;7];
>> A_inv=inv(A)
A_inv =
14.0000 -3.0000 -5.0000
-3.0000 1.0000 1.0000
5.0000 -1.0000 -2.0000
>> X=A_inv*B
X=
0
2.0000
-1.0000
2.3.1.2. Lệnh pinv
pinv(A): dùng để tính giả nghịch đảo của ma trận m x n, với m ≠ n. Lệnh pinv
không sử dụng được với phương pháp symboic.

Ví dụ: giải hệ phương trình tuyến tính A*X = B sau:


 x1 
x 
1 -2 -1 5 4 4  2 − 6
2 2 − 2 
-2 0 -2 -6  x   
A= X =  3 B= 
0 1 0 0 3 0 x 4  0
  x 5   − 3
2 -2 1 4 -8 5
 
x 6 

19
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

>> A=[1 -2 -1 5 4 4;2 -2 0 -2 -6 2;0 1 0 0 3 0;2 -2 1 4 -8 5];


>> B=[-6;-2;0;-3];
>> X=pinv(A)*B
X=
-0.4031
0.8008
0.3984
-0.0157
-0.2669
-0.6126
Vì A không phải là ma trận vuông nên một thông báo lỗi sẽ hiện ra khi ta thay
lệnh inv(A) bằng lệnh pinv(A).
Có thể giải lại hệ phương trình tuyến tính trên bằng phương pháp symbolic:

>> A=sym([1 -2 -1 5 4 4;2 -2 0 -2 -6 2;0 1 0 0 3 0;2 -2 1 4 -8 5]);


>> B=sym([-6;-2;0;-3]);
>> X=A\B
X=
[ 0]
[ 0]
[ 2]
[ 0]
[ 0]
[ -1]

2.3.1.3. Lệnh invhilb


Dùng để tính nghịch đảo ma trận Hilbert.
Cú pháp: invhilb(n)
n là kích thước của ma trận Hilbert. Ma trận Hilbert được xem là điều kiện yếu
“ill condition”, có nghĩa là định thức của ma trận có giá trị rất nhỏ.
Ma trận Hilbert n xn có dạng như sau:
1 1/2 1/3 K 1/n 
1/2 1/3 1/4 L 1/(n + 1) 

H = 1/3 1/4 1/5 L 1/(n + 2)
 
 M M M O M 
1/n 1/(n + 1) 1/(n + 2) L 1/(2n) 

Ví dụ:
Giải phương trình H*X = B bằng hai phương pháp số, symbolic và dùng lệnh
invhilb. Trong đó H là một ma trận Hilbert 8 x 8 và B là vectơ cột [1 1 1 1 1 1 1
1].
20
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

Phương pháp số:


>> H=hilb(8)
H=
1.0000 0.5000 0.3333 0.2500 0.2000 0.1667 0.1429 0.1250
0.5000 0.3333 0.2500 0.2000 0.1667 0.1429 0.1250 0.1111
0.3333 0.2500 0.2000 0.1667 0.1429 0.1250 0.1111 0.1000
0.2500 0.2000 0.1667 0.1429 0.1250 0.1111 0.1000 0.0909
0.2000 0.1667 0.1429 0.1250 0.1111 0.1000 0.0909 0.0833
0.1667 0.1429 0.1250 0.1111 0.1000 0.0909 0.0833 0.0769
0.1429 0.1250 0.1111 0.1000 0.0909 0.0833 0.0769 0.0714
0.1250 0.1111 0.1000 0.0909 0.0833 0.0769 0.0714 0.0667
>> B=ones(8,1)
B=
1
1
1
1
1
1
1
1
>> X=inv(H)*B
X=
1.0e+005 *
-0.0001
0.0050
-0.0756
0.4620
-1.3860
2.1622
-1.6817
0.5148
Phương pháp symbolic:
>> H=sym(hilb(8))
H=
[ 1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8]
[ 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9]
[ 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 1/10]
[ 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 1/10, 1/11]
21
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

[ 1/5, 1/6, 1/7, 1/8, 1/9, 1/10, 1/11, 1/12]


[ 1/6, 1/7, 1/8, 1/9, 1/10, 1/11, 1/12, 1/13]
[ 1/7, 1/8, 1/9, 1/10, 1/11, 1/12, 1/13, 1/14]
[ 1/8, 1/9, 1/10, 1/11, 1/12, 1/13, 1/14, 1/15]

>> B=ones(8,1);
>> X=inv(H)*B
X=
[ -8]
[ 504]
[ -7560]
[ 46200]
[ -138600]
[ 216216]
[ -168168]
[ 51480]

Dùng lệnh invhilb:


>> B=ones(8,1);
>> X=invhilb(8)*B
X=
-8
504
-7560
46200
-138600
216216
-168168
51480

2.3.2. Phương pháp khử Gauss - Jordan


rref(A): trả về ma trận là bước cuối cùng trong phương pháp khử Gauss - Jordan.
Trong đó A là ma trận vuông hay chữ nhật. Lệnh rref cho phép sử dụng với
phương pháp symbolic.

Ví dụ: giải hệ phương trình tuyến tính:


1 - 2 - 2 0  x 1  18 
0 1
 - 1 3 x 2  18 
. =  
0 1 - 1 1   x 3  54
 
1 2 0 4 x 4  36
>> A=[1 -2 -2 0;0 1 -1 3; 0 1 -1 1;1 2 0 4];
22
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

>> B=[18;18;54;36];
>> G_J=rref([A B])
G_J =
1 0 0 0 30
0 1 0 0 39
0 0 1 0 -33
0 0 0 1 -18
>> X=G_J(:,length(A)+1)
X=
30
39
-33
-18
Khi sử dụng phương pháp khử Gauss - Jordan sẽ dẫn tới một bất tiện là ta phải
tiến hành lại từ đầu thủ tục Gauss - Jordan cho từng vectơ cột B. Một phương
pháp cho phép tiết kiệm được số lần tính toán mà đạt cùng hiệu quả là dùng
phương pháp phân rã ma trận.

2.3.3. Phương pháp phân rã ma trận


[L,u] = lu(A): trả về ma trận tam giác trên U, ma trận tam giác dưới L.
Phân rã ma trận A thành các ma trận tam giác: A = L*U
L: ma trận tam giác dưới cỡ n x n, các phần tử đường chéo đều bằng 1.
U: ma trận tam giác trên.

α 11 0 L 0   β11 β12 L β1n 


α α 22 L 0  0 β 22 L β 2n 
L =  21 và U=
 M M O M   M M O M 
   
α n1 α n2 K α nn  0 0 L β nn 

Như vậy hệ phương trình được viết lại như sau:


A*X = B ⇒ (LU)*X = B
Ðặt U*X = Y thì:
L*Y = B
A*X = B  ⇔
U * X = Y
Cả hai phương trình trong hệ đều dễ dàng tìm ra nghiệm vì các ma trận L và U
đều ở dạng tam giác.
Bằng cách thế ngược một lần nữa để tìm X. Như vậy nghiệm của hệ A*X =B là:
X = U\(L\B)

23
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

Ví dụ: giải hệ phương trình A*X = B, trong đó:


 3 -7 -2 2  - 9 
- 3 5 1 0  5
A=  B= 
 6 - 4 0 - 5 7
   
- 9 5 - 5 12  11
>> A=[3 -7 -2 2;-3 5 1 0;6 -4 0 -5;-9 5 -5 12];
>> B=[-9;5;7;11];
>> [L,U]=lu(A)
L=
-0.3333 1.0000 0 0
0.3333 -0.6250 -0.1304 1.0000
-0.6667 0.1250 1.0000 0
1.0000 0 0 0
U=
-9.0000 5.0000 -5.0000 12.0000
0 -5.3333 -3.6667 6.0000
0 0 -2.8750 2.2500
0 0 0 0.0435
>> X=U\(L\B)
X=
3.0000
4.0000
-6.0000
-1.0000

2.4. Hạng của ma trận và điều kiện có nghiệm của hệ A*X = B


Hạng của ma trận A là số hàng khác không có trong dạng rút gọn của A. Kí hiệu:
r (A)
Ðiều kiện có nghiệm của hệ phương trình tuyến tính A*X = B, có n ẩn số:
- r (A) = r (A*) = n thì hệ có nghiệm duy nhất.
- r (A) = r (A*) < n thì hệ có vô số nghiệm phụ thuộc n – r (A) tham số.
- r (A) ≠ r (A*): không tồn tại lời giải của hệ phương trình A*X = B.
Trong toolbox của MATLAB có một số lệnh liên quan đến hạng của một ma
trận, không gian cơ sở của ma trận.

2.4.1. Lệnh rank


rank(A): trả về một số nguyên là hạng của ma trận A.
Ví dụ:
Xét điều kiện có nghiệm của các hệ phương trình tuyến tính sau:

24
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

1 11  1 
1   x1  - 1
2 -1     
a)  x 2  =  
1 0 3    3
  x 3   4 
2 1 4 
>> A=[1 1 1;1 2 -1;1 0 3;2 1 4];
>> B=[1;-1;3;4];
>> r_A=rank(A)
r_A =
2
>> r_AB=rank([A B])
r_AB =
2
⇒ r_A = r_AB = 2 < n =3 nên hệ tồn tại vô số nghiệm.

1 1 0  x1  1
   
b) 0 1 1
 x 2  =  2 
1 2 1 x  - 2
 3  

>> A=[1 1 0;0 1 1;1 2 1];


>> B=[1;2;-2];
>> r_A=rank(A)
r_A =
2
>> r_AB=rank([A B])
r_AB =
3
⇒ r_A = 2 < r_AB =3 nên hệ tồn tại vô nghiệm.
1 2 5  - 9 
 

c) 1 - 1 3  =  2 
3 - 6 - 1 25
>> A=[1 2 5;1 -1 3;3 -6 -1];
>> B=[-9;2;25];
>> r_A=rank(A)
r_A =
3
>> r_AB=rank([A B])
r_AB =
3
⇒ r_A = r_AB = n =3 nên hệ có nghiệm duy nhất.

25
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

2.4.2. Lệnh null


null (A): trả về ma trận rỗng R (n x 0) nếu ma trận A không suy biến
Ví dụ: Xét hai ma trận magic 3 x 3 và 4 x 4
>> magic(3)
ans =
8 1 6
3 5 7
4 9 2
>> null(magic(3))
ans =
Empty matrix: 3-by-0
>> magic(4)
ans =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
>> null(magic(4))
ans =
0.2236
0.6708
-0.6708
-0.2236
Ta có thể dùng lệnh det để kiểm tra lại.

2.4.3. Lệnh clospace


colspace (A): nếu A là ma trận symbolic kích thước n x n, không suy biến. Kết
quả trả về là một ma trận mà các cột là vectơ cơ sở của không gian Rn.
Ví dụ:
>> colspace(sym(magic(3)))
ans =
[ 1, 0, 0]
[ 0, 1, 0]
[ 0, 0, 1]
>> colspace(sym(magic(4)))
ans =
[ 1, 0, 0]
[ 0, 1, 0]
[ 0, 0, 1]
[ 1, 3, -3]

26
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

2.5. Ðộ chính xác của lời giải


Xác định sai số của hệ phương trình tuyến tính A*X = B:
Gọi x và x e là nghiệm gần đúng và nghiệm chính xác của hệ phương trình tuyến
tính A*X = B. Ta có:
A x − b = δb
x − x e = δx
Gọi:
δb là chuẩn của vectơ cột δb.
b là chuẩn của vectơ cột b.
δx là chuẩn của vectơ cột δx.
x là chuẩn của vectơ cột x.
K là điều kiện (condition) của ma trận A, kí hiệu là cond (A). Giữa K và ma trận
A có mối quan hệ:
K = A −1 A

Trong đó: A−1 và A là chuẩn của ma trận A và ma trận nghịch đảo của ma
trận A
δx
Sai số của hệ phương trình A*X = B, có thể được đánh giá như sau:
x

1 δb δx δb
≤ ≤K
K b x b
Sai số xấp xỉ = K*ε
Với ε là độ chính xác của máy tính. Trong MATLAB có một biến đặc biệt dùng
để định nghĩa dộ chính xác này là eps.
Ðộ chính xác này dùng để phân biệt hai giá trị rất gần nhau. Ví dụ b và b’ khác
nhau khi và chỉ khi | |b| - |b’| | ≥ ε
MATLAB cung cấp cho chúng ta hai hàm để tính điều kiện và chuẩn của ma
trận.
cond (A): trả về một giá trị là điều kiện của ma trận A.
norm (X): trả về chuẩn của X. Nếu X là vectơ sẽ trả về chiều dài của nó. Nếu X
là ma trận trả về giá trị căn bậc hai của tổng bình phương các số hạng của ma
trận. Hàm norm không làm việc với các biến symbolic.

Ví dụ: xét sự ảnh hưởng của sai số trong hệ phương trình tuyến tính H*X = B. H
là ma trận hilbert n x n, với n = 6:13 và B là ma trận cột với tất cả các phần tử
đều bằng 1.
Lệnh của MATLAB:
for n=3:13
27
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

H=hilb(n); % tao ma tran hilbert


HI=invhilb(n); % ma tran nghich dao cua hilbert
B=ones(n,1); % tao ma tran B
x=H\B; % tinh nghiem cua he
nx=norm(x); % tinh chuan cua vecto x
dx=norm(x-HI*B); % tinh chuan cua vecto dx
db=norm(H*x-B); % tinh chuan cua vecto db
nb=norm(B); % tinh chuan cua vecto B
K=cond(H); % tinh dieu kien cua ma tran hilbert
err=dx/nx; % sai so that cua he phuong trinh
format short g
err1=K*eps; % sai so xap xi
format short g
err2=K*db/nb; % sai so lon nhat
format short g
disp([n err err1 err2])
end
Kết quả:

n Sai số thật Sai số xấp xỉ Sai số lớn nhất


3 9.9722e-016 1.1636e-013 2.6873e-013
4 1.0284e-013 3.4447e-012 4.7732e-011
5 2.6061e-012 1.0583e-010 5.2463e-009
6 1.541e-010 3.3198e-009 7.9498e-007
7 4.784e-009 1.0555e-007 0.00017924
8 1.731e-007 3.3879e-006 0.038709
9 6.8192e-006 0.0001095 8.7484
10 0.00019489 0.0035583 1270.3
11 0.0055945 0.11599 1.8473e+005
12 0.091251 3.9846 4.7791e+007
13 1.8316 833.64 1.4563e+010

2.6. Giá trị riêng và vectơ riêng của ma trận


Ðịnh nghĩa:
Cho ma trận vuông A cấp n. Số λ được gọi là một giá trị riêng của ma trận A nếu
tồn tại vectơ cột x ≠ 0, x ∈ Rn, sao cho Ax = λx. Khi đó vectơ x được gọi là
vectơ riêng của ma trận A ứng với giá trị riêng λ.
Cách tìm:
Với A là ma trận vuông cấp n đã cho thì vectơ cột x ≠ 0 là vectơ riêng của ma
trận A khi và chỉ khi Ax = λx hay:

28
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

Ax - λx = 0
x = Ix (I là ma trận đơn vị có kích thước n x n)
⇒ Ax - λIx = 0
⇔ (A - λI)x = 0
Giá trị riêng λ là nghiệm của định thức: |A - λI| = 0
Nếu khai triển định thức ta sẽ được một đa thức với biến λ. Ða thức này được gọi
là đa thức đặc trưng. Nếu A là ma trận n x n thì đa thức này có dạng sau:
P(λ) = an λn + an-1λn-1 + …+ a2x2 + a1x + a0

2.6.1. Lệnh eig


Tính giá trị riêng và vectơ riêng của ma trận vuông, sử dụng được cho cả hai
phương pháp số và symbolic.
Cú pháp:
d = eig(A): trả về ma trận d mà các giá trị riêng là các phần tử nằm trên đường
chéo chính.
[V,D] = eig(A): trả về vectơ riêng chứa trong ma trận V và giá trị riêng chứa
trong ma trận D.
Ví dụ:
>> A=[3 2/3;2/3 2];
>> A=sym([3 2/3;2/3 2]);
>> d=eig(A)
d=
[ 5/3]
[ 10/3]
>> [V,D]=eig(A)
V=
[ 2, 1]
[ 1, -2]
D=
[ 10/3, 0]
[ 0, 5/3]

2.6.2. Lệnh poly


Trả về đa thức của ma trận A.
Cú pháp:
poly(A): nếu A là một ma trận symbolic, thì kết quả trả về là một đa thức đặc
trưng. Nếu A là một hàm ma trận số thì kết quả trả về là một mảng chứa các hệ
số của đa thức này.
Ví dụ:
>> A=sym([3 2/3;2/3 2]);
>> P=poly(A)
29
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

P=
x^2-5*x+50/9
>> d=solve(P)
d=
[ 5/3]
[ 10/3]

2.6.3. Tính định thức, nghịch đảo và lũy thừa của ma trận thông qua ma trận
giá trị riêng và vectơ riêng
MATLAB cung cấp một số hàm để tính định thức, nghịch đảo và lũy thừa của
ma trận như det, inv, expm.
Ngoài ra, căn cứ vào các tính chất của ma trận, ta có thể tính toán thông qua các
biểu thức:
|A| = |D|
A-1 = VD-1VT
eA = VeDVT
An = VDnVT
Với D và V là ma trận các giá trị riêng và các vectơ riêng đã được chuẩn hóa của
ma trận A. Vì ma trận các giá trị riêng là ma trận đường chéo, có nghĩa là các
phần tử khác không chỉ nằm trên đường chéo chính. Do đó, việc thực hiện nghịch
đảo ma trận, tính định thức ma trận và lấy lũy thừa ma trận được đơn giản đi rất
nhiều nếu chúng ta thực hiện trên ma trận đường chéo (chỉ thực hiện trên các
phần tử đường chéo)
λ1 0 L 0
0 λ2 L 0 
V =
M M O M
 
0 0 L λn 
Nên:
V = λ1λ2 λ3 L λn
λ1−1 0 L 0
 
0 λ-21 L 0
V −1 =
 M M O M
 
0 0 L λ-n1 
e λ 1
0 L 0
 
0 eλ 2
L 0
e =
V

M M O M 
 
0 0 L eλ 
n

30
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

λ1n 0 L 0
 
0 λ n
L 0
V =
n 2

M M O M
 
0 0 L λnn 
→ →
Khái niệm về chuẩn hóa các vectơ riêng: vectơ chuẩn hóa xc của x bất kỳ bằng:


x
xc = →
x

→ → →
Trong đó: x = x . x là chiều dài của vectơ x.

Hàm eig của MATLAB không cung cấp cho chúng ta ma trận vectơ riêng được chuẩn
hóa. Do đó, để sử dụng các tính chất của ma trận ở trên chúng ta cần chuẩn hóa chúng
trước.

Ví dụ:
A=[3 2/3;2/3 2];
[v,d]=eig(A)
vc=v/norm(v)
det_A=det(d)
ham_det=det(A)
d1=d;
d1(1,1)=1/d(1,1);
d1(2,2)=1/d(2,2);
inv_A=vc*d1*vc'
ham_inv=inv(A)
d1(1,1)=exp(d(1,1));
d1(2,2)=exp(d(2,2));
exp_A=vc*d1*vc'
ham_exp=expm(A)
v=
0.4472 -0.8944
-0.8944 -0.4472
d=
1.6667 0
0 3.3333
vc =
0.4472 -0.8944
-0.8944 -0.4472
det_A =
31
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy

5.5556
ham_det =
5.5556
inv_A =
0.3600 -0.1200
-0.1200 0.5400
ham_inv =
0.3600 -0.1200
-0.1200 0.5400
exp_A =
23.4842 9.0949
9.0949 9.8419
ham_exp =
23.4842 9.0949
9.0949 9.8419
Ví dụ:
Tính tần số riêng và vectơ riêng của hệ dao động đều hòa:

Biết: k1=10 N/m


k2=40 N/m
m1 = m2 = 1 kg
Tại vị trí ban đầu: x1(0) = 0.1, x2 = 0.2
Phương trình dao động của hai khối lượng:
.. ..
m1 x1 = − k1 x1 − k 2 ( x1 − x2 ) m x1 = −( k1 + k 2 ) x1 + k 2 x 2
..
⇔ ..

m2 x 2 = k 2 x1 − (k 2 + k1 ) x2 m x 2 = k 2 x1 − (k 2 + k1 ) x2
.. − (k1 + k 2 ) k
x1 = x1 + 2 x 2
m m
.. k2 ( k 2 + k1 )
m x 2 = x1 − x2
m m
Dưới dạng ma trận các phương trình này được viết lại như sau:
 − (k1 + k 2 ) k2 
 x..     x1 
 .. 1  =  m m
x2   k2 − ( k1 + k 2 )   x2 
  
 m m 
32
Chương 2 :Ma trận và Mảng trong Matlab Biên soạn: Nguyễn Thị Hồng Thúy


K →
Hay: &x& = − x
M
Vì hệ dao động điều hòa nên:
→ → →
K → →
K →
&x& = −ω 2 x ⇒ −ω2 x = − x⇒ ω2 x = x ⇒
M M
K → →
x=λx
M
(Ðặt λ = ω2, với ω là tần số dao động riêng của hệ).
K − 50 40 
=
M  40 − 50
Dùng MATLAB ta giải hệ trên như sau:
>> K_M=[-50 40;40 -50];
>> [V,D]=eig(K_M)
V=
0.7071 0.7071
-0.7071 0.7071
D=
-90 0
0 -10

33

You might also like