You are on page 1of 11

Chương 1

Mô phỏng và lập trình mô phỏng trên


MATLAB

Mô phỏng (simulation) là một kỹ thuật dựa trên máy tính để nghiên cứu xây dựng một hệ thống
(hay quá trình) thực mới hoặc cải tiến một hệ thống thực đã có để đạt được chất lượng tốt hơn,
trước khi thiết kế chế tạo hệ thống được cải tiến này, nhằm giảm thiểu thời gian thiết kế hệ
thống trong khi đồng thời hiểu rõ được hoạt động của hệ thống này. Với khả năng xử lý của
máy tính ngày càng mạnh và với tốc độ cao, đồng thời với việc các hệ thống thực ngày nay ngày
càng phức tạp, mô phỏng đã và đang là một công cụ thiết thực trong nhiều lĩnh vực khác nhau,
đặc biệt là trong kỹ thuật.
Đối với ngành Điện tử–Viễn thông nói chung và lĩnh vực xử lý tín hiệu nói riêng, mô phỏng
được thực hiện phần lớn trên phần mềm lập trình MATLAB (Matrix Laboratory). Với nhiều
công cụ tính toán kết quả hiệu quả và các chức năng hiển thị kết quả mạnh và nhanh hiệu quả,
MATLAB cho phép chúng ta nhanh chóng xây dựng mô hình mô phỏng của một hệ thống để
từ đó nghiên cứu tìm hiểu và cải tiến nó.
Chương học này nhằm cung cấp khái niệm cơ bản về mô phỏng và giới thiệu đôi nét về phần
mềm MATLAB. Trong các chương học tiếp theo, sinh viên sẽ có cơ hội thực hành mô phỏng
một số vấn đề đơn giản liên quan đến kỹ thuật xử lý tín hiệu.

I.1. Vai trò và phương pháp luận của mô phỏng

I.1.1. Mô phỏng là gì?

Mô phỏng là một quá trình thiết lập và thí nghiệm trên máy tính mô hình toán học của một hệ
thống vật lý. Trước hết, chúng ta mô hình hóa một hệ thống thực bằng một mô hình giải tích.
Mô hình này được biểu diễn bởi các phương trình toán học. Từ mô hình giải tích này, chúng
ta xây dựng một mô hình mô phỏng trên máy tính. Mô hình mô phỏng bao gồm các lệnh máy
tính. Từ đó, chúng ta phân tích hệ thống vật lý dựa trên mô hình mô phỏng để đưa ra những
giải pháp thiết kế hiệu quả, trước khi chế tạo hệ thống vật lý này. Như vậy, hệ thống vật lý đã

1
2 Chương 1: Mô phỏng và lập trình mô phỏng trên MATLAB

được trừu tượng hóa hai lần thông qua mô hình giải tích và mô hình mô phỏng. Qua các quá
trình trừu tượng hóa, chúng ta đã phải đặt thêm những giả thiết, làm xấp xỉ, và có thể cả làm
giản lược hệ thống nữa.

I.1.2. Mục đích của mô phỏng

Trước hết, mô phỏng giúp chúng ta hiểu rõ hơn các hoạt động bên trong của một hệ thống. Một
số hệ thống có độ phức tạp cao gây khó khăn trong việc hiểu một cách thấu đáo các hoạt động
bên trongcủa chúng, đặc biệt là khi sự tương tác bên trong giữa các hệ thống con là động. Có
nghĩa là chúng ta không thể đơn thuần tắt hệ thống và xem xét các hệ thống con một cách riêng
lẻ. Trong trường hợp này, mô phỏng giúp chúng ta xây dựng mô hình động của hệ thống và tìm
hiểu xem các hoạt động của hệ thống chung cũng như các hệ thống con trong sự tương tác qua
lại giữa các hệ thống con này.
Mô phỏng nhằm hỗ trợ đưa ra những giải pháp cải tiến để hệ thống hoạt động với chất lượng
tốt hơn. Trong trường hợp chúng ta muốn cải tiến một hệ thống đã có sẵn, việc sửa đổi cải tiến
nó đòi hỏi chúng ta cần có nhiều thử nghiệm khác nhau trên hệ thống để đánh giá chất lượng.
Sử dụng mô phỏng không những tiết kiệm được thời gian và tiền bạc mà còn có thể giúp chúng
ta thử nghiệm với nhiều số liệu khác nhau, đặc biệt là trong trường hợp số liệu là ngẫu nhiên.
Trước khi xây dựng một hệ thống vật lý mới, mô phỏng cho phép chúng ta thử nghiệm hệ
thống mới này. Nếu chúng ta muốn thiết kế một hệ thống mới, chúng ta có thể mô phỏng hệ
thống này trên máy tính để tìm hiểu xem hệ thống như vậy có hoạt động tốt như ý muốn hay
không trước khi chúng ta chế tạo nó.
Mô phỏng giúp chúng ta lấy được thông tin mà không phải động đến hệ thống vật lý. Có
những hệ thống rất quan trọng hoặc rất nhạy cảm mà chúng ta không thể đơn thuần dừng sự
hoạt động của nó để kiểm tra sửa đổi, chẳng hạn như hệ thống điều khiển không lưu hay hệ
thống chuyển tiền qua máy tính của ngân hàng. Trong trường hợp này, mô phỏng giúp chúng ta
xem xét một hệ thống kỹ lưỡng mà không phải động đến hệ thống vật lý, cho đến khi hệ thống
mô phỏng được kiểm nghiệm kỹ lưỡng.

I.1.3. Lợi ích của mô phỏng

Bên cạnh các mục đích đã nêu trên đây, mô phỏng còn có những lợi ích khác. Thông qua mô
phỏng, chúng ta làm thí nghiệm trong “thời gian nén”. Có những quá trình xảy ra trong thực tế
hàng tháng, hàng năm. Việc nghiên cứu nó gặp khó khăn về mặt thời gian. Trong khi đó, mô
phỏng chỉ mất vài giây hay vài tiếng đồng hồ để kiểm nghiệm.
Mô phỏng làm giảm các yêu cầu phân tích. Việc xây dựng mô hình giải tích của một hệ
thống thông thường là phức tạp và đòi hỏi người nghiên cứu phải có năng lực toán học cao.
Đồng thời các hệ thống này chỉ được phân tích trong trạng thái tĩnh. Các công cụ mô phỏng
ngày nay cho phép chúng ta có thể nghiên cứu thí nghiệm một hệ thống nào đó mà không cần
biết thông suốt đến một lĩnh vực nào đó liên quan đến một phần của hệ thống, đồng thời cho
phép chúng ta xem xét hệ thống trong trạng thái động.
I.1. Vai trò và phương pháp luận của mô phỏng 3

I.1.4. Hạn chế của mô phỏng

Mặc dù mục đích của mô phỏng giúp chúng ta giải quyết được những vấn đề quan trọng, và các
lợi ích của nó giúp ta giải quyết nhanh chóng hơn, mô phỏng có những hạn chế của nó.
Như chúng ta đã thấy, mô phỏng dựa trên mô hình mô phỏng, và mô hình này lại dựa trên
mô hình giải tích. Trong quá trình chuyển từ hệ thống vật lý đến mô hình mô phỏng, chúng ta
có thể phải đặt các giả thuyết, làm xấp xỉ, hoặc làm giản lược. Như vậy, nếu việc mô hình hóa
có sai sót thì việc đưa ra kết quả không chính xác với hệ thống thực là có thể xảy ra. Việc cần
thiết là làm thế nào để làm giảm thiểu độ sai số đó.
Cho dù việc mô hình hóa là chính xác, thì nếu số liệu đầu vào bị sai thì mô phỏng sẽ cho
chúng ta kết quả sai. Vì vậy, công việc thu thập số liệu rất quan trọngvà cần được chú trọng
nhiều. Tuy nhiên, bước thử nghiệm ban đầu có thể là mô phỏngchính số liệu đầu vào và sử dụng
nó để thí nghiệm hệ thống cần thiết kế. Sau đó, chúng ta cần thay số liệu mô phỏng bằng số
liệu thực thông qua đo đạc.

I.1.5. Phương pháp luận của mô phỏng

Mô phỏng bao gồm các bước cơ bản sau đây:

• Chuyển tải một bài toán quan tâm thành một mô hình mô phỏng;

• Chia bài toántổng thể thành nhiều bài toán nhỏ;

• Lựa chọn loại mô hình thích hợp, phương pháp mô phỏng thích hợp, các công cụ tính toán
phù hợp để giải quyết những bài toán nhỏ;

• Tổng hợp các kết quả giải quyết được đối với những bài toán nhỏ để đưa đến giải pháp
chung cho bài toán tổng thể.

Thông thường, việc mô phỏng để giải quyết những bài toán nhỏ trên đây là những thuật
toán đã được định nghĩa rõ và đã được giải quyết chặt chẽ, và có bản chất định lượng. Trong
khi đó, phương pháp luận tổng thể sử dụng cho việc chuyển tải từ bài toán ban đầu thành mô
hình mô phỏng thích hợp, cũng như việc chọn lựa các kỹ thuật để giải áp dụng vào mô hình mô
phỏng thường mang tính khám phá tìm tòi.
Trên đây, chúng ta sử dụng từ hệ thống rất nhiều. Trong các bài học sau, chúng ta sẽ tìm
hiểu chính xác thế nào là hệ thống. Tương tự, thế nào là tín hiệu. Tạm thời, chúng ta xem một
hệ thống là một khối (block), được kích thích bởi một hay nhiều tín hiệu đầu vào. Qua đó, hệ
thống chuyển đổi tín hiệu đầu vào và cho ta một hay nhiều tín hiệu đầu ra. Theo các bước cơ
bản trên đây, chúng ta có xem bài toán tổng thể của chúng ta là một hệ thống cần thiết kế, và
các bài toán được chia nhỏ là các hệ thống con hay các khối nhỏ.
4 Chương 1: Mô phỏng và lập trình mô phỏng trên MATLAB

I.2. Lập trình mô phỏng trên MATLAB


MATLAB, viết tắt của Matrix Laboratory, có nghĩa là Phòng Thí nghiệm (tính toán) Ma-trận.
MATLAB là một phần mềm giúp chúng ta làm tính toán, phân tích số liệu, phát triển các thuật
toán, làm mô phỏng và xây dựng mô hình, tạo ra các hiển thị đồ họa và cung cấp các công cụ
giao diện đồ họa. Các thông tin về MATLAB cũng như nhiều tài liệu học và các trợ giúp khác
có thể tìm thấy tại: http://www.mathworks.com.

I.2.1. Khởi động MATLAB

Khi khởi động MATLAB, chúng ta sẽ thấy một cửa sổ lệnh (Command Window) như trong hình
vẽ sau. Các lệnh của MATLAB được đánh vào sau dấu >>.

Chẳng hạn, chúng ta muốn tính tổng của 3 và 5. Đánh lệnh

>> 3+5

và bấm phím Enter, kết quả được hiển thị như sau:

ans =
8
I.2. Lập trình mô phỏng trên MATLAB 5

ans là biến kết quả do MATLAB tự đặt, chứa kết quả của dòng lệnh được thực hiện cuối cùng.
Nếu chúng ta đặt biến kết quả cho lệnh, thì kết quả sẽ hiển thị như sau:

>> a=3+5
a =
8

I.2.2. Các phép toán trong MATLAB

Các phép toán cộng trừ nhân chia thông thường được thực hiện như sau:

>> a=3;b=5;x=a+b;y=a-b;z=a*b;w=a/b;

Trên đây là một dòng lệnh chứa nhiều lệnh: khởi tạo giá trị của a, khởi tạo giá trị của b, cộng
a với b, lấy a trừ b, nhân a với b và lấy a chia cho b. Chú ý nếu sau lệnh có dấu ; thì kết quả
của lệnh đó không được hiển thị (mặc dù MATLAB đã tính toán xong). Chúng ta có thể hiển
thị cùng một lúc các kết quả đã thực hiện trên đây như sau:

>> x,y,z,w
x =
8
y =
-2
z =
15
w =
0.6000
>>

Lưu ý là chúng ta không cần khai báo dạng biến (interger, double, ...) như trong một số ngôn
ngữ lập trình khác.
Một véc-tơ được khởi tạo như sau:

>> a=[1 2 3]
a =
1 2 3

Để khởi tạo nhanh một véc-tơ có giá trị tăng dần từ 0 đến 6 và cách nhau 1, thì sử dụng dấu
“:” như sau:

>> a=[0:6]
a =
0 1 2 3 4 5 6
6 Chương 1: Mô phỏng và lập trình mô phỏng trên MATLAB

Nếu chúng ta muốn các giá trị cách nhau khác 1, chẳng hạn 1.5, thì sử dụng hai dấu “:” như
sau:

>> a=[0:1.5:6]
a =
0 1.5000 3.0000 4.5000 6.0000

Khi sử dụng các phép toán trên véc-tơ, các véc-tơ cần có độ dài như nhau. Đối với phép cộng
ta làm như sau:

>> a=[1 2 3];b=[2 2 2];x=a+b


x =
3 4 5

Biến x được tính theo công thức: x = [a(1) + b(1) a(2) + b(2) a(3) + b(3)].
Tương tự, ta có các phép toán trừ (-), nhân (.*) và chia (./).

>> y=a-b,z=a.*b,w=a./b
y =
-1 0 1
z =
2 4 6
w =
0.5000 1.0000 1.5000

Chú ý trong phép nhân và phép chia có dấu “.”. Nếu không có dấu chấm, chẳng hạn a ∗ b, thì
chúng ta muốn thực hiện phép nhân ma trận. Trong trường hợp này, vì hai ma trận a và b đều
có kích thước giống nhau là 1 × 3, phép nhân ma trận sẽ không thực hiện được, và MATLAB sẽ
báo lỗi như sau:

>> a=[1 2 3];b=[2 2 2];z=a*b


??? Error using ==> mtimes
Inner matrix dimensions must agree.

Một ma trận được khởi tạo như sau:

>> a=[1 2 3;1 1 1]


a =
1 2 3
1 1 1

Như vậy, ma trận a có 2 hàng và 3 cột. Kích thước của ma trận có thể được tìm thấy bởi
I.2. Lập trình mô phỏng trên MATLAB 7

>> size(a)
ans =
2 3

Để lấy giá trị của phần tử ở hàng 1 cột 3 của ma trận a ta làm

>>a(1,3)

Khi điều kiện kích thước được tuân thủ, phép nhân ma trận có thể được thực hiện như sau:

>> a=[1 2 3;1 1 1];b=[1 2; 1 3; 2 2],x=a*b


b =
1 2
1 3
2 2
x =
9 14
4 7

I.2.3. Các hàm toán học cơ sở

MATLAB cung cấp một số các hàm toán học cơ sở: sin, cos, ... để hổ trợ tính toán toán học.
Chẳng hạn, để tính giá trị của sin(x) ta làm như sau:

>> y=sin(2),z=sin(pi)
y =
0.9093
z =
1.2246e-016

Để biết có những hàm toán học nào MATLAB đã cung cấp, ta đánh

>> help matlab\elfun


Elementary math functions.

Trigonometric.
sin - Sine.
sind - Sine of argument in degrees.
sinh - Hyperbolic sine.
asin - Inverse sine.
...

Lệnh help có thể được thực hiện để tìm hiểu cách sử dụng một lệnh nào đó. Hãy thử
8 Chương 1: Mô phỏng và lập trình mô phỏng trên MATLAB

>> help sin

Ở mức tổng quát nhất, chúng ta chỉ đánh

>> help

để hiển thị toàn bộ cấu trúc mà phiên bản MATLAB của chúng ta có. Sau đó, tìm đến một cấu
trúc nhất định, chẳng hạn như cấu trúc các hàm toán học cơ sở matlab\elfun mà chúng ta đã
làm trên đây, để xem thông tin về những lệnh MATLAB đã cung cấp cho cấu trúc đó. Quay
trở lại với những phép toán chúng ta sử dụng trong phần I.2.2. , để hiểu rõ thêm về chúng hoặc
biết thêm các phép toán khác trong MATLAB, dùng lệnh:

>> help matlab\ops

Hãy dùng lệnh help để tìm hiểu về lệnh more và lệnh lookfor.

I.2.4. Hiển thị đồ thị

MATLAB cung cấp công cụ hiển thị đồ họa một cách nhanh chóng. Chẳng hạn, muốn vẽ đồ thị
của hàm sin(x) trong đó x chạy từ 0 đến 4π, ta làm như sau

>> x=0:0.01:4*pi;y=sin(x);plot(x,y)

0.8

0.6

0.4

0.2

−0.2

−0.4

−0.6

−0.8

−1
0 2 4 6 8 10 12 14

Nếu chúng ta muốn vẽ hàm sin(x) và x sin(x) trong cùng một đồ thị thì làm như sau

>> z=x.*y;plot(x,y,’b:’,x,z,’r-.’)
>> legend(’sin(x)’,’xsin(x)’)
I.2. Lập trình mô phỏng trên MATLAB 9

8
sin(x)
6 xsin(x)

−2

−4

−6

−8

−10

−12
0 2 4 6 8 10 12 14

Hãy sử dụng lệnh help để tìm hiểu cách sử dụng lệnh plot và lệnh legend được sử dụng
trên đây.

I.2.5. Điều khiển luồng lệnh

Như nhiều ngôn ngữ lập trình khác, MATLAB cũng có các dạng điều khiển các luồng lệnh trong
như:
if ... else ... elseif ... end
switch ... case ... otherwise ... end
while ... end
for ... end

I.2.6. Xây dựng một lệnh mới (function)

Để viết một lệnh (chương trình), chúng ta dùng chương trình soạn thảo (Editor) của MATLAB.
Chương trình soạn thảo thảo được kích hoạt bằng lệnh:

>>edit

Sau đó, ta có thể viết các dòng lệnh cần thiết vào trong chương trình soạn thảo như sau để tính
giá trị hàm số x sin(x) và vẽ đồ thị của nó nếu cần.
10 Chương 1: Mô phỏng và lập trình mô phỏng trên MATLAB

Bây giờ, ghi lại file đã soạn thảo (sẽ có tên là xsinx.m) rồi chuyển sang Cửa sổ Lệnh và thực
hiện các lệnh sau:

>>x=10;y=xsinx(x)
>>x=0:0.01:10*pi;y=xsinx(x,1);
>>help xsinx

Hãy lập một lệnh nhanmatran.m dùng điều khiển luồng lệnh for để thực hiện phép nhân hai
ma trận A và B để được ma trận C theo công thức
X
Cij = Aik Bkj

thay vì sử dụng phép nhân ma trận trực tiếp (*).

I.2.7. Hộp công cụ (Toolboxes)

Một trong những nét mạnh của MATLAB là có rất nhiều các hộp công cụ (thư viện) hổ trợ cho
các ứng dụng khác nhau. Trong mỗi hộp công cụ, nhiều thuật toán thông dụng cho mỗi ứng
dụng đã được cài đặt và tối ưu hóa để người sử dụng có thể nhanh chóng xây dựng mô hình mô
phỏng.
Đối với Xử Lý Tín Hiệu Số, chúng ta sẽ tập trung vào hộp công cụ “Signal Processing
Toolbox”. Trong các môn học khác, anh chị sẽ có dịp làm quen với các hộp công cụ khác về
viễn thông như “Communications Toolbox”, “SIMULINK”, hoặc về điều khiển học như “Control
Toolbox”, hoặc về xử lý tín hiệu ngẫu nhiên như “Statistical Signal Processing Toolbox”.
Để biết được trong MATLAB đã cài có các hộp công cụ nào, chúng ta dùng lệnh
I.2. Lập trình mô phỏng trên MATLAB 11

>>ver

Cuối cùng, để tìm hiểu về các lệnh trong một hộp công cụ, chẳng hạn về xử lý tín hiệu,
chúng ta dùng lệnh

>>help signal\signal

You might also like