You are on page 1of 99

Giáo trình MATLAB - SIMULINK

CHƯƠNG 0. MỞ ĐẦU

1
Giáo trình MATLAB - SIMULINK

CHƯƠNG 1. TỔNG QUAN VỀ MATLAB


1.1 Cấu trúc chung và các lĩnh vực ứng dụng của MATLAB:
MATLAB (viết tắt từ matrix laboratory) được phát triển từ dự án LINPACK &
EISPACK nhằm tạo ra thư viện ma trận phục vụ cho tính toán. Qua quá trình phát triển
lâu dài, MATLAB được phát triển thành một công cụ rất mạnh, được ứng dụng khá
phổ biến trong các trường đại học ở khắp thế giới, đặc biệt là các nước như Mỹ, Bỉ,
Canada, ... như là công cụ không thể thiếu trong các giáo trình từ cơ bản đến nâng cao
trong các lĩnh vực: toán học cao cấp, khoa học và kỹ thuật. Trong công nghiệp,
MATLAB công cụ lựa chọn cho nghiên cứu nâng cao hiệu quả sản xuất, phân tích đánh
giá và ứng dụng.
Với MATLAB, bài toán tính toán, phân tích, thiết kế và mô phỏng trở nên dễ dàng
hơn trong nhiều lĩnh vực chuyên ngành như: Điện, Điện tử, Cơ khí, Cơ điện tử, Vật
lý, ...

 MATLAB là công cụ tính toán rất mạnh dễ dùng, trực quan dễ mở rộng và phát
triển.
 MATLAB có khả năng liên kết đa môi trường, liên kết dễ dàng với ngôn ngữ lập
trình C++, Visual C, FORTRAN, JAVA, ...
 MATLAB có khả năng xử lý đồ hoạ mạnh trong không gian hai chiều và ba chiều.
 Các TOOLBOX trong MATLAB rất phong phú, đa năng là công cụ nghiên cứu, thiết
kế cực kỳ hiệu quả trong các lĩnh vực chuyên ngành.
 Công cụ mô phỏng trực quan SIMULINK chạy trong môi trường MATLAB giúp cho
bài toán phân tích thiết kế dễ dàng, sinh động hơn.
 MATLAB có kiến trúc mở, dễ dàng trong việc xây dựng thêm các module tính toán
kỹ thuật theo tiêu chuẩn công nghiệp và truyền thông.

MATLAB xây dựng sẵn các phép tính xử lý ma trận, các hàm toán học, các phép xử
lý đồ hoạ với thư viện phong phú. Từ đó cho phép người dùng viết các chương trình
(m-files), xây dựng các hàm chuyên tính toán cho mỗi lĩnh vực (gọi là các TOOLBOXS)
như: Điều khiển tự động, Kỹ thuật điện, Điện tử, truyền thông, xử lý ảnh, xử lý tín
hiệu số, tối ưu hoá, mô phỏng các quá trình thực tế ...
Trên cơ sở các thư viện có sẵn, người dùng lập nên các chương trình ứng dụng
riêng theo nhu cầu riêng với cấu trúc chương trình dễ hiểu, rõ ràng và tận dụng sức

2
Giáo trình MATLAB - SIMULINK
mạnh các công cụ có sẵn, đặc biệt công cụ xử lý ma trận để viết nên các ứng dụng mà
thời gian lập trình tiết kiệm rất nhiều. Ngoài ra MATLAB cho phép viết ngôn ngữ
C/C++, FORTRAN trong cửa sổ MATLAB và biên dịch chương trình viết bằng
MATLAB sang C/C++, FORTRAN. Từ đó ta có thể biên dịch sang chương trình ứng
dụng (*.exe) chạy độc lập (stand-alone application).
Đặc biệt, ta có thể viết chương trình C/C++, Fortran, LabView, ... gọi MATLAB
chạy ngầm để tính toán sau đó trả kết quả về chương trình.
Ngoài ra MATLAB có thể chạy trên các máy tính khác nhau, với các hệ điều hành
khác nhau như: MS Windows, X Windows (Unix/Linux) và Macintosh mà vẫn giữ
nguyên các chương trình và dữ liệu, không cần một sự biến đổi nào.
1.2 Giới thiệu SIMULINK và TOOLBOXS trong MATLAB
SIMULINK là công cụ mô phỏng trực quan trong môi trường MATLAB, kết hợp với
thư viện TOOLBOXS rất phong phú cho các ngành, các lĩnh vực kỹ thuật, giúp cho bài
toán phân tích thiết kế dễ dàng, sinh động hơn. Do đó rất thích hợp cho sinh viên nghiên
cứu khoa học, làm báo cáo đồ án môn học, đặc biệt đồ án tốt nghiệp, Các kỹ sư làm
việc trong các lĩnh vực nghiên cứu, điều khiển các hệ thống kỹ thuật, phân tích hệ
thống, ...
Các Toolboxs:
- Control System Toolbox cho lĩnh vực điều khiển - Tự động hoá, Điện tử, Cơ
khí.
- Power System Toolbox cho chuyên ngành Hệ thống điện, Thiết bị điện, Tự
động hoá, Cơ khí.
- Nonlinear control Design blocksets để mô phỏng, phân tích, thiết kế tối ưu hệ
thống điều khiển phi tuyến.
- Signal Processing Toolbox và Image procesing Toolbox dành cho ngành ngành
Điện tử viễn thông, Công nghệ thông tin và Cơ điện tử.
- Communication Toolbox dành cho ngành điện tử viễn thông- TĐH Đo lường
- Data acquisition Toolbox thu thập dữ liệu, xây dựng hệ thu thập dữ liệu vào/ra
với thiết bị bên ngoài.
- Fuzzy logic và Neural Network Toolbox phân tích thiết kế hệ thống trên cơ sở
logic mờ và mạng nơ ron nhân tạo.
- Aerospace Toolbox và Math Toolbox cho ngành Cơ khí - Cơ điện tử.

3
Giáo trình MATLAB - SIMULINK

4
Giáo trình MATLAB - SIMULINK

CHƯƠNG 2. CÁC THAO TÁC LẬP TRÌNH TRÊN MATLAB


2.1 Các lệnh cơ bản quản lý MATLAB
2.1.1 Quản lý lệnh và các hàm
- Cửa sổ MATLAB: bao gồm các phần sau:

Simulink (mở cửa sổ soạn thảo


chương trình mô phỏng simulink)

path browser (mở cửa sổ quan sát các


đường dẫn tìm kiến của MATLAB
và có thể xoá hoặc bổ sung đường
dẫn tìm kiếm)

workspace browser (mở cửa sổ quan


sát và sửa chữa các biến trong không
gian workspace)

open(mở cửa sổ soạn thảo với


chương trình cũ)

New (mở cửa sổ soạn thảo mới


chương trình)
Hình 2.1 Cửa sổ dòng lệnh MATLAB
dòng lệnh(commandline)
Từ cửa sổ dòng lệnh, ta có thể gọi lệnh thi hành:
»path cho đường dẫn các thư mục trong danh mục tìm kiếm (search path)
»addpath <path> Bổ sung các thư mục <path> vào search path của MATLAB
»rmpath <path> xoá thư mục <path> khỏi search path của MATLAB
»pathtool mở cửa sổ giao diện cho phép xem và sửa đổi đường dẫn tìm kiếm search
path giống như editpath (hình 1.2)

Hình 2.2 Cửa sổ path Browser soạn đường dẫn tìm kiếm tệp M-file.

5
Giáo trình MATLAB - SIMULINK
»ver hiển thị version của MATLAB, Simulink và Toolboxes
»help <tênlệnh> hướng dẫn sử dụng <tênlệnh> sau help
»helpwin danh sách các lệnh và hướng dẫn sử dụng
»helpdesk cửa sổ trợ giúp trong môi trường Internet Explorer
»demo chạy các chương trình demo cho nhiều lĩnh vực

Hình 2.3 Cửa sổ HelpDesk Hình 2.4 Cửa sổ Helpwin


2.1.2 Quản lý biến, không gian workspace trên cửa sổ lệnh (Command window)
1. who hiển thị danh sách các biến
2. whos hiển thị danh sách các biến và kích thước của nó
3. workspace hiển thị cửa sổ workspace cho phép xem và chỉnh sửa các giá trị biến
4. clc xoá các dòng text trên màn hình
5. clear xoá tất cả các biến trong workspace
2.1.3 Làm việc với Files môi trường làm việc
1. dir thumuc liệt kê các file trong thumuc chỉ ra
2. edit tenfile soạn thảo mới một M-file
3. open tenfile mở file tenfile để sửa chữa
4. save lưu các biến trong workspace lên đĩa
Các cú pháp:
save fname lưu các biến vào tệp nhị phân "MAT-file" fname.mat. Nếu không có
fname thì mặc nhiên là file matlab.mat.
save fname X Chỉ lưu biến X.
save fname X Y Z chỉ lưu các biến X, Y, Z. (có thể sử dụng ký tự đại diện '*').
save fname X Y Z -ASCII lưu các biến ASCII 8 bit nhị phân.

6
Giáo trình MATLAB - SIMULINK
save fname X Y Z -ASCII -DOUBLE lưu dạng ASCII 16 bit nhị phân.
save fname X Y Z -APPEND bổ sung các biến vào tệp MAT-file đã có.
Hàm save('fname','var1','var2') khi 'fname','var1','var2' là xâu ký tự.
5. load tải giá trị các biến được lưu ở Files trên đĩa vào workspace.
Các cú pháp:
load FNAME tải các biến từ MAT-file 'fname.mat' đã có. Nếu không có fname thì
mặc nhiên là file matlab.mat.
load FNAME X Y Z ... chỉ tải các biến đá chỉ ra (có thể sử dụng ký tự đại diện '*').
load FNAME.EXT tải file ASCII, trong file có thể có chú thích (bắt đầu bởi %).
Kết quả gán cho biến có tên FNAME (không có phần mở rộng)
load FNAME -ASCII hoặc load FNAME -MAT.
Hàm load('fname') sử dụng khi fname được gán dạng xâu ký tự.
6. pwd hiển thị thư mục hiện hành
7. quit hoặc exit thoát khỏi MATLAB
2.1.4 Các phím thao tác trên cửa số dòng lệnh
Home đưa con trỏ về đầu dòng
End đưa con trỏ về cuối dòng
↑ hiển thị lại các lệnh đã xoá trước đó
↓ hiển thị lại các lệnh đã nhập trước đó
←, → di chuyển con trỏ
Ctrl+k xoá từ vị trí con trỏ đến cuối dòng
2.2 Dữ liệu, hàm và cấu trúc lệnh trong MATLAB
2.2.1 Khái niệm dữ liệu và biến
Trong Matlab có các kiểu dữ liệu: (kiểu số, kiểu xâu, kiểu cấu trúc và kiểu files)
 Dữ liệu kiểu số: dưới dạng mảng hoặc vectơ các số phức (dạng đại số: a +
jb)
 Dữ liệu kiểu xâu: dưới dạng các xâu (char) và mảng các xâu ký tự
 Dữ liệu kiểu đối tượng: dạng đối tượng hình ảnh, đồ hoạ, ...
 Dữ liệu kiểu cấu trúc: dạng các thành phần (bản ghi và mảng cấu trúc)
 Dữ liệu kiểu tệp (files): là các tệp lưu thông tin trên đĩa
Với mỗi kiễu dữ liệu, cần chú ý khi làm việc:

7
Giáo trình MATLAB - SIMULINK

 Khái niệm kiểu dữ liệu


 Làm việc trực tiếp với dữ liệu
• Các phép toán khi làm việc (đại số, quan hệ, logic)
• Các hàm, lệnh có sẵn trong thư viện
• Chuyển đổi kiễu dữ liệu
• Vào, ra với dữ liệu
Tên (biến, hằng, hàm, ...) nói chung theo quy ước giống ngôn ngữ C++ Cụ thể:
 Bao gồm:
• Các chữ cái hoa ‘A’ ‘B’ ... ‘Z’, chữ cái thường ‘a’ ‘b’ ... ‘z’
• Các chữ số ‘0’ ‘1’ ... ‘9’
• Dấu gạch dưới ‘_’
 Ký tự đầu của tên phải bằng chữ cái
 Có sự phân biệt chữ cái thường và chữ cái HOA
 Độ dài tối đa của tên 31 ký tự (19 ký tự đối với ver. 5.3)
Tên các hàm (kể cả m-files) đã được đặt cũng có thể được sử dụng làm tên của
biến, như vậy hàm này sẽ không được sử dụng trong quá trình tồn tại của biến, cho
đến khi có lệnh xoá các biến đó trong bộ nhớ: lệnh clear hoặc clear <tên biến>.
 Các hàm, lệnh trong Matlab sử dụng chữ cái thường.
2.2.2 Các ký hiệu và các toán tử
2.2.2.1 Các ký hiệu
, phân cách giữa các tham số của hàm, cột của ma trận hoặc ngăn cách các chỉ số
hàng, cột khi truy cập phần tử của ma trận
; đặt sau câu lệnh không cho hiển thị kết quả của lệnh lên cửa sổ hay khai báo
thêm 1 hàng mới của ma trận
[ ] Dùng để tạo véc tơ, ma trận hoặc khai báo tham số ra của hàm.
Cú pháp: Tên ma trận = [a11 a12…a1n ; a21 a22… a2n ;…;…]
Trong đó:
a11, a12, ..., a1n, ... là các giá trị tại hàng 1 cột 1 đến các giá trị tại hàng 1 cột n, ...,
có m-1 dấu chấm phẩy ‘;’ sẽ có m hàng.
Ví dụ: Tạo ma trận gồm 3 hàng và 3 cột với giá trị là
1 2 3

8
Giáo trình MATLAB - SIMULINK
4 5 6
7 8 9
»a = [1 2 3; 4 5 6; 7 8 9]
a=
1 2 3
4 5 6
7 8 9

( ) khai báo tham số vào của hàm hoặc truy cập phần tử ma trận.
Ví dụ: A(1,2) truy cập phần tử a12

Tạo vector đơn gồm có n phần tử.


Cú pháp 1:
Tênvector = [pt1 pt2 pt3 … ptn]
Tênvector = [pt1, pt2, pt3, …, ptn]
Trong đó:
pt1 pt2 …ptn: là các phần tử của véc tơ.
Ví dụ: Tạo vector a gồm có 4 phần tử, với các giá trị là:1, 2, 3, 4
»a = [1 2 3 4]
a=
1 2 3 4
Cú pháp 2:
Tênvector = gtđầu:gia:gtcuối
Trong đó:
gtđầu: là giá trị đầu của vector.
gia: số gia (có thể âm nếu gtđầu > gtcuối).
gtcuối: giá trị cuối.
Ví dụ: Tạo vector a có giá trị đầu 0.5, giá trị cuối 1.5, số gia 0.2
»a = 0.5:0.2:1.5
a=
0.50000.70000.90001.10001.30001.5000

... dùng để tiếp tục dòng lệnh dài khi xuống hàng.

9
Giáo trình MATLAB - SIMULINK
Ví dụ: »set(h,’facecolor’,[0 1], ...
‘EdgeColor’,’k’,’Linewidth’,2)

: Tạo vector hoặc ma trận phụ và lặp đi lặp lại các giá trị.
Trong đó:
Khai báo Công dụng
j:k Tạo ra chuỗi j, j+1, j+2,…., k-1, k
j:i:k Tạo ra chuỗi j, j+i, j+2i,….,k-i, k
A(: , j) Chỉ cột thứ j của ma trận A
A(i , :) Chỉ hàng thứ i của ma trận
A(: , :) Chỉ toàn bộ ma trận A
A(j : k) Chỉ phần tử A(j), A(j+1)…A(k) (ưu tiên theo
cột)
A(: , j , k) Chỉ các phần tử A(:, j), A(:, j+1)…A(:, k)
A(:) Chỉ tất cả các thành phần của ma trận A

% đứng trước các lời chú giải trong các câu lệnh.
' đặt sau trên biến ma trận để chuyển vị phức ma trận.
.’ đặt sau trên biến ma trận để chuyển vị ma trận.
Ví dụ: nếu A= [ 4.0000 + 2.0000i 3.0000
5.0000 - 7.0000i 3.0000 + 4.0000i]
thì A’=
4.0000 - 2.0000i 5.0000 + 7.0000i
3.0000 3.0000 - 4.0000i
và A.’=
4.0000 + 2.0000i 5.0000 - 7.0000i
3.0000 3.0000 + 4.0000i

‘ ‘ mở đầu và kết thúc cho các xâu văn bản (string)


{ } được dùng trong các câu lệnh gán phần tử mảng, mảng cấu trúc.
2.2.2.2 Các phép toán đại số
+ cộng 2 ma trận/vectơ hoặc 2 số vô hướng với nhau
- trừ 2 ma trận/vectơ hoặc 2 số vô hướng với nhau
\ toán tử chia trái ma trận/véc tơ. Ví dụ: A\B tương đương A-1*B
/ toán tử chia phải ma trận/véc tơ. Ví dụ: A/B tương đương A*B-1

10
Giáo trình MATLAB - SIMULINK
./ hoặc .\ chia phải hay chia trái từng phần tử của ma trận
* nhân hai ma trận với nhau
.* nhân các phần tử tương ứng. Ví dụ: C=A.*B tức là cij =aij*bij
^ luỹ thừa ma trận hay số vô hướng. Ví dụ: a^2 tức là a2
.^ luỹ thừa từng phần tử của ma trận

Ví dụ: Đầu tiên, sử dụng lệnh: format rat


Phép toán với véc tơ, ma trận Phép toán với các phần tử
1 4
x 2 y 5
3 6
x’ 123 y’ 4 5 6
5 -3
x+y 7 x–y -3
9 -3
3 -1
x+2 4 x–2 -0
5 1
4
x*y không thực hiện được x.* y 10
18
x’* y 32 x’.* y không thực hiện được
4 5 6
x * y’ 8 10 12 x.* y’ không thực hiện được
12 15 18
2 2
x*2 4 x.* 2 4
6 6
4.0000
x\y 2.2857 x.\ y 2.5000
2.0000
0.5000 2.0000
2\x 1.0000 2./ x 1.0000
1.5000 0.6667
0 0 0.1667 0.2500
x/y 0 0 0.3333 x./ y 0.4000

11
Giáo trình MATLAB - SIMULINK
0 0 0.5000 0.5000
0.5000 0.5000
x/2 1.0000 x./ 2 1.0000
1.5000 1.5000
1
x^y không thực hiện được x.^ y 32
729
1
x^2 không thực hiện được x.^ 2 4
9
2
2^x không thực hiện được 2.^ x 4
8
2.2.2.3 Các phép toán quan hệ và logic

• Các phép toán quan hệ:


== So sánh bằng
< ; > ; >= ; <= các toán tử so sánh
~= so sánh không bằng

Trong đó: Các toán tử quan hệ thực hiện so sánh từng thành phần của 2 ma trận. Chúng
tạo ra một ma trận có cùng kích thước với 2 ma trận, so sánh với các phần tử là 1 nếu
phép so sánh là đúng và là 0 nếu phép so sánh là sai.
Phép quan hệ ưu tiên thấp hơn phép toán đại số, cao hơn phép toán logic.

Ví dụ: thực hiện phép so sánh sau:


»x=6
x=
6
»x>=[1 2 3;4 5 6;7 8 9]
ans =
1 1 1
1 1 1
0 0 0
»x=6
x=

12
Giáo trình MATLAB - SIMULINK
6
»A=[1 2 3;4 5 6;7 8 9]
A=
1 2 3
4 5 6
7 8 9
»x>=A

ans =
1 1 1
1 1 1
0 0 0
»x=A
x=
1 2 3
4 5 6
7 8 9
»x==A
ans =
1 1 1
1 1 1
1 1 1
»x=2
x=
2
»x==A
ans =
0 1 0
0 0 0
0 0 0
»x<A
ans =

13
Giáo trình MATLAB - SIMULINK
0 0 1
1 1 1
1 1 1

• Các phép toán logic

& phép và (nhân) logic AND


| phép hoặc (cộng) logic OR
~ phép phủ định logic NOT
xor phép logic EXCLUSIVE OR
Trong đó: Kết quả phép toán là 1(khác 0) nếu phép logic là đúng và là 0 nếu phép logic là sai.

Phép toán logic có độ ưu tiên thấp nhất so với phép toán đại số và quan hệ.

Ví dụ: Cho phép toán 1>2 & 3+4 thì máy tính sẽ thực hiện 3+4 được 7, sau đó tới
1>2 được 0 rồi thực hiện 0 & 7 và cuối cùng ta được kết quả là 0. (thay 1<2 & 3-4 kết
quả vẫn là 0)
2.2.2.4 Các hàm logic (Logical function)
1. Hàm all Kiểm tra vector/cột ma trận có giá trị nào bằng 0 hay không.
Cú pháp:
y = all(x)
y = all(x,DIM)
Trong đó:
y biến chứa kết quả
y = 1 khi tất cả các phần tử khác 0
y = 0 khi có 1 phần tử bằng 0
x tên vector hay ma trận
DIM hướng kiểm tra ma trận,
DIM = 1 (mặc nhiên) kiểm tra theo cột,
DIM = 2 kiểm tra theo hàng,
DIM = 3 kiểm tra từng phần tử

Ví dụ: » a=[1 2 3]
a=
1 2 3

14
Giáo trình MATLAB - SIMULINK
» y=all(a)
y=
1
» a=[1 2 0]
a=
1 2 0
» y=all(a)
y=
0
» a=[1 2 3;4 5 6;7 -8 9]
a=
1 2 3
4 5 6
0 -8 9
» y=all(a)
y=
0 1 1
» a=[1 2 3; 4 5 0;7 0 9]
a=
1 2 3
4 5 0
7 0 9
» y=all(a)
y=
1 0 0

2. Hàm any Kiểm tra vector/cột ma trận có giá trị nào khác 0 hay không.
Cú pháp:
y = any(x)
y = any(x,DIM)
Trong đó:
y biến chứa kết quả.
y = 1 khi có 1 phần tử khác 0.

15
Giáo trình MATLAB - SIMULINK
y = 0 khi tất cả các phần tử bằng 0.
x tên vector, hay ma trận.
DIM hướng kiểm tra ma trận,

Ví dụ:
» a=[1 2 3];
» y=any(a)
y=
1
» b=[1 0 3 0];
» y=any(b)
y=
1
» c=[1 2 0 4;0 2 0 4;1 2 3 4;3 4 5 6]
c=
1 2 0 4
0 6 7 8
1 2 3 0
5 0 7 8
» y=any(c)
y=
1 1 1 1
» d=[0 0 0 0;0 1 3 0]
d=
0 0 0 0
0 1 3 0
» y=any(d)
y=
0 1 1 0

3. Hàm exist Kiểm tra biến hay file có tồn tại hay không.
Cú pháp:
e = exist(‘name’)

16
Giáo trình MATLAB - SIMULINK
Trong đó:
name: là tên file hay tên biến.
e: biến chứa giá trị trả về.
e Ý nghĩa
0 name không tồn tại trong vùng làm việc
1 name là biến đang tồn tại trong vùng làm việc
2 name đang tồn tại trên đĩa (m-file hoặc file không xác định kiểu)
3 name là MEX-file
4 name là file dịch từ phần mềm Simulink (.mdl)
5 name là hàm của Matlab
6 name là p-file
7 name là thư mục

Ví dụ: »e = exist(‘dir’)
e=
5

4. Hàm find Tìm phần tử trong vector/cột ma trận theo yêu cầu.
Cú pháp:
i = find(x)
[i,j] = find(x)
[i,j,V] = find(x)
Trong đó:
i: chỉ vị trí của phần tử cần tìm trong vector.
i,j: chỉ số hàng và số cột tương ứng của phần tử cần tìm.
V: chứa giá trị của phần tử cần tìm.
x: tên vector, ma trận hay yêu cầu đề ra.
Nếu không nêu ra yêu cầu thì mặc nhiên là tìm các phần tử khác 0.
Yêu cầu thường có mặt các phép toán so sánh và logic.

Ví dụ: » x=[1 8 0 2 3 0]
x=
1 8 0 2 3 0
» k=find(x)

k=
1 2 4 5

17
Giáo trình MATLAB - SIMULINK
» a=[5 0 0;8 0 3]
a=
5 0 0
8 0 3
» [i,j,k]=find(a)
i=
1
2
2
j=
1
1
3
k=
5
8
3
2.2.2.5 Các giá trị đặc biệt MATLAB tự định nghĩa:

pi : hằng số π
i, j : ký hiệu đơn vị ảo.
Nếu biến đặt trùng tên i hoặc j thì nó đè lên ký hiệu i, j (sau đó không sử dụng
được)
inf : đại diện cho giá trị vô cực ∝ (infinite)
NaN: giá trị vô định 0 chia 0 (Not a Number)
eps : độ chính các tương đối
(khi sử dụng định dạng format long, eps = 2.220446049250313e-016)
2.2.3 Các lệnh tương tác vào/ra (Interactive Input/Output)
= lệnh gán (tương tự lệnh gán trong các ngôn ngữ khác)
input nhập dữ liệu từ bàn phím.
Cú pháp: Có 2 dạng:
R = input('How many apples:')
R = input('What is your name:','s') % nhập dữ liệu vào dạng string

18
Giáo trình MATLAB - SIMULINK
R giá trị nhập từ bàn phím
fprintf cho phép in thông số ra theo định dạng.
Cú pháp:
fprintf(định dạng, tham số cần in)
Giải thích: (xem thêm lệch sprintf)
Định dạng bao gồm cả text và các ký tự định dạng đặc biệt (%e, %f, %g, \n,
...,các số và dấu chấm) được ghi trong dấu nháy đơn để điều khiển in các giá trị.
%e : in ra dưới dạng số phảy động
%f : in ra dưới dạng số phảy tĩnh
%g : in ra dưới dạng số phảy tĩnh/động tuỳ thuộc bản thân giá trị
%s : in ra dạng xâu ký tự
\n, \r : xuống dòng (xuống dòng và lùi về đầu dòng)
\t : thêm khoảng tab trống
\\ : đưa ra \
%% : đưa ra %
%o, %x, %u in ra dạng cơ số 8 (o), 16 (x), 10 không dấu

Ví dụ: fprintf(‘ket qua la: %4.1f radian\n’, a);


%Kết quả trên màn hình (với a=35)
ket qua la: 35.0 radian
format điều khiển định dạng đầu ra
Các định dạng kiểu hiển thị như sau: (mặc nhiên MATLAB hiển thị format short)
Cú pháp Giải thích Ví dụ
format short Hiển thị 4 số sau dấu chấm 3.1416
format long Hiển thị 15 số sau dấu chấm 3.141592653589792
format rat Hiển thị dạng phân số tối giản 355/133
format + Hiển thị số dương hay âm +
format short e Hiển thị 4 số sau dấu chấm, ký pháp kỹ thuật 0.3142e+01
format long e Hiển thị 15 số sau dấu chấm với ký pháp kỹ 0.314159265358979e+01
thuật
format short g Hiển thị 4 số sau dấu chấm chính xác hơn short 3.1416
và short e
format long g Hiển thị 15 số sau dấu chấm chính xác hơn long 3.141592653589792
và long e
format hex Hiển thị cơ số 16 4a02dbc
format bank Hiển thị 2 số sau dấu chấm 3.14

19
Giáo trình MATLAB - SIMULINK
2.2.4 Các lệnh, cấu trúc điều khiển chương trình (Control Flow)
Cấu trúc if, else, elseif: Lệnh điều kiện. Cho phép if lồng nhau
Cú pháp:
if <biểu thức điều kiện>
lệnh; lệnh;
elseif <biểu thức điều kiện>
lệnh; lệnh;
else
lệnh; lệnh;
end;

Ví dụ:
if I = = J
A(I,J) = 2;
elseif abs(I-J) = = 1
A(I,J) = -1;
else
A(I,J) = 0;
end;

Lệnh end kết thúc câu lệnh for, while, switch, try, và if
Cấu trúc switch Dùng trong câu lệnh lựa chọn nhiều trường hợp. Giống như câu
lệnh CASE.. OF trong Pascal
Cú pháp:
switch <biểu thức>
case <giá trị>,
lệnh; ..., lệnh;
case <giá trị1, giá trị2, giá trị3,...>
lệnh; ..., lệnh;
otherwise,
lệnh; ..., lệnh;
end;
Cấu trúc for vòng lặp xác định. Cho phép nhiều vòng for lồng nhau

20
Giáo trình MATLAB - SIMULINK
Cú pháp:
for <biến = biểu thức>,
lệnh; ..., lệnh;
end;
Ví dụ:
for i = 1:n,
for j = 1:n,
a(i,j) = 1/(i+j-1);
end
end
for s = 1.0: -0.1: 0.0; end % steps s with increments of -0.1

Cấu trúc while vòng lặp không xác định. Cho phép lồng nhau.
Cú pháp:
while <biểu thức điều kiện> ,
lệnh; ..., lệnh; end
Lệnh continue quay lại đầu vòng lặp WHILE hoặc FOR
Lệnh break nhảy vô điều kiện ra khỏi lặp WHILE hoặc FOR
Ví dụ:

while 1,
input(‘nhap so duong, thoat khi n<0:’);
if n<=0,
break;
end;
end;

Lệnh global khai báo các biến toàn cục trong chương trình và hàm (dạng .m
files)
Lệnh local khai báo các biến cục bộ trong chương trình và hàm (dạng .m files)
Lệnh echo on/off có/không hiển thị các lệnh M-files trong khi thi hành lệnh.
Lệnh try dùng để bẫy lỗi. Nếu xảy ra lỗi khi thực hiện các lệnh trong TRY thì
chương trình nhảy sang thực hiện các lệnh sau CATCH

21
Giáo trình MATLAB - SIMULINK
Cú pháp: try statement; ...; statement; catch statement; ...; statement; end
2.3 Cách viết chương trình và hàm dạng m-files trong MATLAB
Files chứa mã chương trình MATLAB gọi là m-files. M-files có thể là functions
(hàm) yêu cầu phải trả về các tham số đầu ra, hoặc dạng scripts (chương trình) thi
hành chuỗi các lệnh của MATLAB.
MATLAB nhận biết file là M-file qua tên tập tin mở rộng *.m
 Cách tạo function M-files
Định nghĩa hàm: function y = average(x)
tham số hàm (arguments)
tên hàm (function name)
đầu ra (output argument)
từ khoá (keyword)
 Cấu trúc hàm m-file

Function definition line


(dòng định nghĩa hàm) function f = fact(n)
H1 (help 1) line
(dùng cho tìm kiếm) % FACT Factorial.
% FACT(N) returns the factorial of N, usually denoted by N!.
Help text (dùng cho
lời giải thích sử dụng) % Put simply, FACT(N) is PROD(1:N).

Function body f = prod(1:n);

Chú ý: - Nếu có nhiều tham số đầu ra thì viết dưới dạng:


[thamso1, thamso2,...]=<tênhàm>(arg1,arg2,...)
- Trong thân hàm có lệnh gán tham số đầu ra bởi một giá trị.
 Gọi hàm thực hiện từ chương trình theo cú pháp:
tênhàm(arg1,arg2,...);
Ví dụ: Tạo hàm m-file trong cửa sổ soạn thảo có tên myfile và gọi hàm thực hiện.
- Lưu hàm m-files với tên myfile.m (tên tập tin bắt buộc trùng với tên hàm) vào
một đường dẫn thuộc các đường dẫn tìm kiếm của MATLAB
- Gọi hàm vừa tạo để chạy dưới cửa sổ MATLAB như sau:
myfile.m »a = 7.5;b = 3.342;
function c = myfile(a,b) »c = myfile(a,b) % goi ham, truyen tham so

22
Giáo trình MATLAB - SIMULINK
c = sqrt((a.^2)+(b.^2)); c=
8.2109
 So sánh chương trình viết bằng script M-Files và function M-Files
script M-Files function M-Files
• Không có tham số đầu vào và đầu ra • Có thể có tham số đầu vào và đầu ra
• Làm việc với dữ liệu trong workspace • Làm việc với dữ liệu, các biến (local/
global) bên trong function và các tham
số vào, ra
• Thuận lợi cho việc thực hiện trình tự
• Thuận lợi cho việc mở rộng ngôn ngữ
các dãy lệnh cần thiết một cách tự động
MATLAB cho ứng dụng của bạn
tại nhiều thời điểm khác nhau
Ví dụ: tính trung bình

function y = average(x)
% AVERAGE Mean of vector elements (tinh gia tri trung binh cua cac phan
tu)
% AVERAGE(X), where X is a vector, is the mean of vector elements.
% Non-vector input results in an error.
[m,n] = size(x);
if (~((m == 1) | (n == 1)) | (m == 1 & n == 1))
error(’Input must be a vector’)
end
y = sum(x)/length(x); % Actual computation

- Cách làm việc khi gọi m-files trong MATLAB theo trình tự sau:
+ Tìm xem đó có phải là biến không
+ Kiểm tra có phải là dạng chương trình đã biên dịch sẵn hay không (*.mex file)
+ Tìm trong thư mục hiện hành
+ Tìm trong các thư mục trong search path
Chú ý: có thể chuyển script file sang function file bằng cách thêm vào:
function <tenham> mà không cần có tham số đầu vào và tham số đầu ra
2.4 Các bài tập ứng dụng **

23
Giáo trình MATLAB - SIMULINK

24
Giáo trình MATLAB - SIMULINK

CHƯƠNG 3. CÁC HÀM TOÁN HỌC THÔNG DỤNG


3.1 Các hàm toán học cơ bản
3.1.1 Các hàm xử lý số phức:
Cho số phức dạng đại số: Z = a + jb (dạng số mũ C.ej.phi)
1. abs(Z)cho giá trị tuyệt đối của số/biên độ C của số phức
2. angle(Z) cho góc pha phi của một số phức
3. complex(a,b) tạo số phức Z từ các số thực a, b.
Ví dụ: complex(3,4) cho kết quả là số phức 3+4i
4. conj(Z) cho số phức liên hợp Z* = a - jb
5. imag(Z) lấy phần ảo của số phức
6. real(Z) lấy phần thực của số phức
3.1.2 Các hàm lượng giác và hữu tỷ (thực hiện từng phần tử)
7. acos, acosh cho arccos và arccos hyperbolic
8. acot, acoth cho arccotang và arccotang hyperbolic
9. asin, asinh cho arcsin và arcsin hyperbolic
10. atan, atanh cho arctang và arctang hyperbolic
11. atan2(x,y) cho arctang của y/x trong khoảng -π -> +π
12. cos, cosh cho cosin và cosin hyperbolic
13. cot, coth cho Cotang và cotang hyperbolic
14. sin, sinh cho sin và sin hyperbolic
15. tan, tanh tang và tang hyperbolic
16. exp cho ex với x là một số
17. log logarithm tự nhiên ln(x) với x là một số
18. log2 logarithm cơ số 2 log2(x) với x là một số
19. log10 logarithm cơ số 10
20. sqrt căn bậc hai
3.1.3 Các hàm làm tròn số, ...
21. round làm tròn với số nguyên gần nhất
22. fix làm tròn bằng cách cắt bỏ phần thập phân
23. ceil làm tròn số về phía số nguyên lớn hơn.
Cú pháp:
y = ceil(x)

25
Giáo trình MATLAB - SIMULINK
Ví dụ: »x = [-1.9000 -0.2000 3.4000 5.6000 7.0000];
»y = ceil(x)
y=
-1 0 4 6 7
24. floor làm tròn số về phía số nguyên nhỏ hơn.
Ví dụ: »x = [-1.9000 -0.2000 3.4000 5.6000 7.0000];
»y = floor(x)
y= -2 -1 3 5 7
25. mod mod(x,y): phần dư phép chia x/y có dấu trùng dấu của y
26. rem rem(x,y): phần dư phép chia x/y có dấu trùng dấu của x
27. sign xác định dấu của một biến hoặc phần tử của véc tơ/ma trận.
sign(x) có kết quả bằng 1 nếu x>0, bằng 0 nếu x=0 và bằng –1 nếu x<0
28. gcd ước số chung lớn nhất của các phần tử (Greatest common divisor).
29. lcm bội số chung nhỏ nhất (Least common multiple).
Ví dụ: lcm(A,B) cho bội số chung nhỏ nhất của từng phần tử tương ứng hai ma trận A,
B.
3.2 Các hàm xử lý ma trận và vector
Ký hiệu A là ma trận, X là vectơ, MATLAB cung cấp các hàm sau:
1. length(X) cho ta kích thước vectơ X
2. linspace tạo vector tuyến tính giới hạn trong một khoảng.
Cú pháp:
y = linspace(x1, x2)
y = linspace(x1, x2, n)
Trong đó:
y: tên của vector.
x1, x2: giá trị lớn nhất và nhỏ nhất của vector y.
n: số phần tử của vector y, nếu không có thì mặc định n = 100.
Ví dụ: »y = linspace(1, 10, 7)
y=
1.0000 2.5000 4.0000 5.5000 7.0000 8.5000 10.0000
3. logspace tạo vector có giá trị tỷ lệ logarithm trong một khoảng.
Cú pháp:

26
Giáo trình MATLAB - SIMULINK
y = logspace(x1, x2)
y = logspace(x1, x2, n)
Trong đó:
y: tên của vector.
x1, x2: giới hạn giá trị lớn nhất 10^x2 và nhỏ nhất 10^x1 của vector y.
n: số phần tử của vector y. Nếu không có n thì mặc định n = 50.
Ví dụ: »y = logspace(1, 2, 7)
y=
10.0000 14.6780 21.5443 31.6228 46.4159 68.1292 100.0000
4. A=diag(X) nếu X là vectơ thì A là ma trận vuông với đường chéo chính là X
5. X=diag(A,k) lấy các phần tử trên đường chéo (chính khi k=0) lưu vào vec tơ cột
6. det(A) tính định thức ma trận vuông
7. inv(A) tìm ma trận nghịch đảo
8. [m,n] = size(A) : cho kích thước mxn của ma trận A
9. rank(A) hạng ma trận
10. expm(A) hàm eA với A là ma trận
Ví dụ: »kq = expm(3)
kq = 20.0855
11. logm(A) ln(A) với A là ma trận
12. sqrtm(A) A với A là ma trận
13. eye(m,n) tạo ma trận đơn vị mở rộng mxn, eye(n) tạo ra ma trận vuông nxn
14. zeros(m,n) tạo ma trận mxn có các phần tử bằng 0
15. ones((m,n) tạo ma trận mxn có các phần tử bằng 1
16. rand tạo ma trận các phần tử ngẫu nhiên chuẩn ([0 1]).
Cú pháp:
y = rand(n)
y = rand(m,n)
Trong đó:
y: tên ma trận.
n: ma trận có n hàng, n cột.
m, n: ma trận có m hàng, n cột.
Ví dụ: »y = rand(3)

27
Giáo trình MATLAB - SIMULINK
y=
0.9340 0.0920 0.7012
0.8462 0.6539 0.7622
0.5269 0.4160 0.7622
»y = rand(3,5)
y=
0.2625 0.3282 0.9910 0.9826 0.6515
0.0475 0.6326 0.3653 0.7227 0.0727
0.7361 0.7564 0.2470 0.7534 0.6316
17. Xem thêm các hàm randn, sprand, sprandn, ...
18. magic tạo ma trận vuông có tổng của các phần tử trên hàng, cột, đường chéo
bằng nhau (ma phương). Giá trị của mỗi phần tử là dãy số nguyên từ 1 đến n2.
Cú pháp:
A = magic(n)
Trong đó:
n: kích thước ma trận.
Ví dụ: »A = magic(3)
A=
8 1 6
3 5 7
4 9 2
30. max cho giá trị lớn nhất của véc tơ/ma trận.
Cú pháp:
m = max(x)
[m,i] = max(x)
v = max(x,y)
v = max(x,[],DIM)
Trong đó:
x,y: tên vector/ma trận.
v : tên véc tơ.
m: giá trị lớn nhất.
i: vị trí của m. DIM: hướng thực hiện phép toán

28
Giáo trình MATLAB - SIMULINK
Ví dụ: x = [3 5 2 1 4]
»m= max(x)
m=
5
»[m,i] = max(x)
m=
5
i =
2
Cho y = [1 6 8 -5 3]
»v =max(x,y)
v= 3 6 8 1 4
Cho b =[3 6 2
1 7 9
2 8 1]
»m = max(b)
m=
3 8 9
»[m,i] = max(b)
m=
3 8 9
i =
1 3 2
a=
0 3 6
7 1 1
4 6 8
»v = max(a,b)

v=
3 6 6

29
Giáo trình MATLAB - SIMULINK
7 7 9
4 8 8
31. min cho giá trị nhỏ nhất của véc tơ/ma trận.
Cú pháp:
m = min(x)
[m,i] = min(x)
v = min(x,y)
Trong đó:
x,y: Tên ma trận/véc tơ.
v: tên vector.
m: là giá trị nhỏ nhất.
i: là vị trí của m.
DIM: hướng thực hiện phép toán (x là ma trận) DIM=1(mặc nhiên) theo cột, 2: hàng
Ví dụ: x =[ 3 5 2 1 4]
»m = min(x)
m=
1
Cho y =[1 6 8 -5 3]
»v = min(x,y)
v=
1 5 2 -5 3
b= [3 6 2
1 7 9
2 8 1]
»[m,i] = min(b)
m=
1 6 1
i =
2 1 3

a= [0 3 6
7 1 1

30
Giáo trình MATLAB - SIMULINK
4 6 8]
»v = min(a,b)
v=
0 3 2
1 1 1
2 6 1
32. minmax cho giá trị nhỏ nhất và lớn nhất của véc tơ/hàng ma trận.
Cú pháp:
V = minmax(A)
Trong đó:
A: véc tơ/ma trận cần tìm giá trị nhỏ nhất và lớn nhất.
V: véc tơ/ma trận có hai cột chứa giá trị nhỏ nhất và lớn nhất của các hàng.
33. fmin tìm điểm có giá trị nhỏ nhất của hàm số.
Cú pháp:
x = fmin(‘function’,x1,x2)
Trong đó:
x: biến chứa kết quả.
function: tên hàm số.
x1, x2: khoảng khảo sát.
Ví dụ: Tìm giá trị nhỏ nhất của hàm số: x3-2x-5 trong khoảng [0 2]
»x =fmin(‘x.^3-2*x-5’,0,2);
x=
0.8165
»y = x.^3-2*x-5
y=
-6.0887
34. fzero tìm điểm 0 của hàm số.
Cú pháp:
fzero(‘fun’,x0)
Trong đó:
Điểm 0 của hàm số là điểm (0,x), đây cũng chính là nghiệm của hàm số. Nếu hàm
có nhiều nghiệm thì sẽ tìm nghiệm gần giá trị x0.

31
Giáo trình MATLAB - SIMULINK
fun: tên hàm số dạng .m file. Nếu hàm toán học thì thêm @ trước tên hàm.
Ví dụ: Tìm giá trị 0 của hàm số: x2-5x+3.
Trước tiên ta khai báo hàm số f trong tập tin f.m
function y = f(x);
y = x.^2-5*x+3;
Sau đó, tạo tập tin gt0.m:
x = 0:10;
% Giá trị x0 = 0
z = fzero(‘f’,0);
sprinf(‘z = %3f’,z) %z = 0.382
% Giá trị x0 = 2
z = fzero(‘f’,2);
sprintf(‘z = %.3f’,z)
%z = 2.618
z = fzero(‘f’,0); % Vẽ đồ thị hàm số minh họa:
fplot(‘f’,[0,5];
grid;
hold on;
plot(z,0,‘o’);
hold off
3.3 Các thao tác trên dữ liệu chuỗi (STRING)
3.3.1 Khái niệm
Biến chứa dữ liệu string trong MATLAB giống như các biến số thông thường, tức là
biến được nhập, thao tác và lưu trong các vectơ với mỗi phần tử của vectơ là một ký
tự. Việc xác định vị trí của mỗi phần tử biến string thông qua chỉ số của nó. Ma trận
string cũng được sử dụng nhưng các string phải có kích thước bằng nhau.
Ví dụ: nếu a=’toi’ thì a(1)=t và a(1:3)=toi
»b=[‘toi’ ; ‘ten’] thì b(1,1)=t ; b(2,2)=e ; b(1,:)=toi
Kết hợp các chuỗi tạo ra string mới bằng cách:
newst =[str1,str2,str3]
3.3.2 Các hàm xử lý chuỗi
1. isstr/ischar kiểm tra nội dung biến là chuỗi ký tự không.

32
Giáo trình MATLAB - SIMULINK
Cú pháp:
kq = ischar(n)
kq = isstr(n) % chỉ có đến phiên bản MATLAB 5.3
Trong đó:
kq: biến chứa kết quả.
n: tên biến cần kiểm tra.
kq = 1 nếu n là chuỗi ký tự, 0 nếu n không là chuỗi ký tự.
Ví dụ: » n='MATLAB';
» kq=isstr(n)
kq =
1
» m=[1 2 3 4];
» kq=isstr(m)
kq = 0
2. isspace(st) trả lại véc tơ giá trị 0 tại các ký tự trống (1 tại ký tự khác)
3. strcat(st1,st2,...) nối các xâu st1 st2 ... thành dòng
4. strvcat(st1,st2,...) nối các xâu st1 st2 ... thành cột
5. strrep(st1,st2,st3) thay thế xâu st2 trong st1 thành st3
6. findstr(st1,st2) trả về véc tơ vị trí bắt đầu của xâu st2 trong st1
7. strcmp so sánh 2 chuỗi ký tự.
Cú pháp: l = strcmp(s1, s2)
Trong đó:
l: biến chứa kết quả.
s1, s2: chuỗi cần so sánh.
Ví dụ: »a = ‘MatLab WoRkS’
»b = ‘MatLab WoRkS’
»strcmp(a,b)
ans =
1
8. upper cho ra chuỗi ký tự viết hoa.
Cú pháp:
b = upper(s)

33
Giáo trình MATLAB - SIMULINK
Trong đó:
b: biến chứa kết quả.
s: tên biến chứa chuỗi ký tự.
Ví dụ: »a = ‘MaTlab WORks’
»b = upper(a)
b=
MATLAB WORKS
»b = upper(‘MaTlab WORks’)
b=
MATLAB WORKS
9. lower cho ra chuỗi ký tự viết thường.
Cú pháp:
b = lower(s)
Trong đó:
b: biến chứa kết quả.
s: tên biến chứa chuỗi ký tự hay chuỗi ký tự.
10. str2mat tạo ma trận có các phần tử dạng chuỗi.
Cú pháp:
s = str2mat(‘s1’, ‘s2’, …)
Trong đó:
s: tên ma trận kết quả.
s1, s2: chuỗi ký tự.
Ví dụ: »s = str2mat(‘mat’, ‘lab’)
s=
mat
lab
11. blanks tạo khoảng trắng giữa hai hay nhiều chuỗi ký tự theo mong muốn.
Cú pháp:
[S1 blanks(b1) S2 blanks(b2) …blanks(bn) Sn]
Trong đó:
S1, S2, …, Sn: các chuỗi ký tự.
b1, b2: số khoảng trắng.

34
Giáo trình MATLAB - SIMULINK
3.4 Các hàm chuyển đổi dữ liệu
1. abs(str) trả lại giá trị là vectơ với các phần tử là mã ASCII của các ký tự.
Ví dụ: a='abc' thì X=abs(a)= [97 98 99]
2. double(str) chuyển str sang dạng số ( ASCII t.tự hàm abs)
3. char(x) chuyển véc tơ/các dòng ma trận x dạng mã ASCII thành xâu
4. eval chuyển đổi chuỗi ký tự thành biểu thức.
Cú pháp:
kq = eval(‘string’)
Trong đó:
kq: biến chứa kết quả.
‘string’ là các ký số: chuyển thành những con số, là câu lệnh thi hành được.
Ví dụ: » a='199999999';
» eval(a)+1
ans =
200000000
5. setstr(X) chuyển vectơ X với các phần tử là các số nguyên trong khoảng 0
đến 255 thành chuỗi string tương ứng.
Ví dụ: với X = [97 98 99] thì setstr(X)=’abc’
6. num2str(f) chuyển đổi đại lượng vô hướng f thành chuỗi string (dùng hiển thị
ra màn hình các dữ liệu số như lệnh disp)
7. num2str(f,k) chuyển đổi đại lượng vô hướng f thành chuỗi string với k chữ số
8. str2num chuyển chuỗi (dạng số) sang số thực.
Cú pháp:
n = str2num(s)
Trong đó:
s: chuỗi dạng số.
n: số thực.
Ví dụ: »n = str2num(‘456456’)
n= 456456
9. int2str(n) chuyển đổi số nguyên n thành chuỗi string
10. rats(x,strlen) chuyển số thực thành chuỗi string với strlen chiều dài của chuỗi
11. hex2num(hstr) chuyển đổi số theo hệ hexa thành chuỗi string

35
Giáo trình MATLAB - SIMULINK
12. hex2dec(str) chuyển đổi hệ hexa dưới dạng string str thành sô nguyên.
Ví dụ: hex2dec('0f')=15
13. dec2hex(num) chuyển đổi số nguyên sang hexa.
Ví dụ: dec2hex(2748) = 'ABC'.
14. dec2bin(num) chuyển số thập phân num thành số nhị phân.
Ví dụ: dec2bin(23) = '10111'
15. bin2dec(num) chuyển số nhị phân num thành số nguyên.
Ví dụ: bin2dec('010111') returns 23
3.5 Các thao tác trên dữ liệu cấu trúc
3.5.1 Dữ liệu kiểu cấu trúc (Struct)
Mỗi dữ liệu cấu trúc (bản ghi: record) bao gồm nhiều thành phần dữ liệu (các
trường: fields) có kiểu khác nhau, ví dụ thông tin về quản lý con người:
Họ tên tuổi giới tính bậc lương số con bảng chấm công ...
xâu số nguyên logic số thực số nguyên mảng số ...
3.5.1.1 Tạo cấu trúc (Có 2 cách):

• Sử dụng lệnh STRUCT để tạo cấu trúc.


Cú pháp:
S = struct('field1',VALUES1,'field2',VALUES2,...)
S = struct(OBJ) chuyển dữ liệu đối tượng OBJ thành cấu trúc tương đương.
Trong đó:
S: biến chứa dữ liệu cấu trúc.
field1, field2,...: các biến trường của cấu trúc.
VALUES1, VALUES2,...: các giá trị của các biến trường.
OBJ: đối tượng cần chuyển đổi kiểu.
Ví dụ1: »s = struct('strings',{{'hello','yes'}},'lengths',[5 3])
s=
strings: {'hello' 'yes'}
lengths: [5 3]
Ví dụ 2:
»s = struct('type',{'big','little'},'color','red','x',{3 4})
s=
1x2 struct array with fields:

36
Giáo trình MATLAB - SIMULINK
type
color
x
• Tạo cấu trúc trực tiếp: Sử dụng dấu chấm ’.’ truy cập các trường của cấu
trúc
Cú pháp:
recname.fielname = value
Trong đó:
recname: tên biến cấu trúc.
fielname: tên biến trường cần tạo.
value : giá trị của fielname.
Ví dụ: »nguoi.hoten = ’Nguyen Van A’;
»nguoi.tuoi = 20;
»nguoi.gtinh = 0;
»nguoi.bluong = 1.52;
»nguoi.ngaycong = [1 1 1 0 1 0 0;1 0 1 0 1 0 0;1 0 0 1 1 0 0;0 1 1 1 0 0 0];
» nguoi
nguoi =
hoten: 'Nguyen Van A'
tuoi: 20
gtinh: 0
bluong: 1.5200
ngaycong: [4x7 double]
3.5.1.2 Các hàm làm việc với cấu trúc
1. fieldnames trả về biến mảng cấu trúc chứa tên các trường.
Cú pháp:
NAMES = fieldnames(S)
Trong đó:
S: biến cấu trúc đã tạo.
NAMES: biến mảng cấu trúc chứa tên các trường của S.
2. rmfield loại bỏ một trường ra khỏi cấu trúc.
Cú pháp:

37
Giáo trình MATLAB - SIMULINK
S = rmfield(S,'field') loại bỏ trường field khỏi cấu trúc S.
S = rmfield(S,FIELDS) loại bỏ một số trường, với FIELDS là mảng các ký tự.
3. isfield kiểm tra biến là một trường của cấu trúc hay không.
Cú pháp:
F = isfield(S,'field') trả về giá trị đúng (1) nếu 'field' là tên một trường của S.
4. getfield lấy nội dung một trường của cấu trúc.
Cú pháp:
F = getfield(S,'field') trả về nội dung của field trong cấu trúc S. tương tự
F=S.field.
Ví dụ: F = getfield(S,{i,j},'field',{k}) %tương tự với lệnh F = S(i,j).field(k).
5. setfield thiết lập nội dung cho các trường.
Cú pháp:
S = setfield(S,'field',V) đặt giá trị V cho trường field của S, tương tự S.field=V.
Ví dụ: S = setfield(S,{i,j},'field',{k},V) %tương tự S(i,j).field(k) = V;
3.5.2 Dữ liệu kiểu mảng cấu trúc (Cell Array)
Có thể tổ chức các cấu trúc thành mảng với mỗi cấu trúc là một phần tử mảng
3.5.2.1 Tạo mảng cấu trúc (Có 2 cách):

• Cách 1: Sử dụng lệnh CELL để tạo mảng cấu trúc.


Các cú pháp:
cell(n) tạo mảng cấu trúc rỗng kích thước NxN.
cell(M,N)/cell([M,N]) tạo mảng cấu trúc rỗng kích thước MxN.
cell(M,N,P,...)/cell([M N P ...]) tạo mảng cấu trúc rỗng MxNxP.
cell(SIZE(A)) tạo mảng cấu trúc rỗng kích thước giống kích thước của A.
• Cách 2: Tạo mảng cấu trúc trực tiếp: Sử dụng dấu ngoặc nhọn {} và dấu
() để truy cập đến các phần tử mảng cấu trúc.
Cú pháp: có 2 cách tạo và sử dụng khác nhau
arrname{i,j}=value
arrname(i,j)={value}
Trong đó:
arrname : tên biến mảng cấu trúc.
i, j : chỉ số của phần tử mảng cấu trúc.
value : giá trị cần gán cho phần tử mảng thứ i, j (fielname).

38
Giáo trình MATLAB - SIMULINK
Ví dụ1: »lop{1,1}=‘00D’;
»lop{1,2}=55;
»lop{1,3})=[0 1 2;3 4 5];
Ví dụ2: »clear
»lop{1,1}.hoten=‘Nguyen Van A’;
»lop{1,1}.tuoi=20;
»lop{1,2}.hoten=‘Tran B’;
3.5.2.2 Làm việc với mảng cấu trúc
1. sử dụng { } để truy cập đến từng phần tử mảng cấu trúc (cách 1)
và ( ) để truy cập đến từng phần tử mảng cấu trúc (cách 2)
2. celldisp hiển thị nội dung của mảng cấu trúc.
Cú pháp:
celldisp(C) hiển thị nội dung của mảng cấu trúc C
celldisp(C,NAME) hiển thị nội dung cấu trúc C và thay thế tên xâu NAME cho C
Ví dụ: »celldisp(lop)
lop{1} =hoten: 'Nguyen Van A'
tuoi: 20
lop{2} =
hoten: 'Tran B'
» celldisp(lop,'ten')
ten{1} =
hoten: 'Nguyen Van A'
tuoi: 20
ten{2} =
hoten: 'Tran B'
3. cellplot(C) hiển thị bằng đồ hoạ cấu trúc của mảng cấu trúc C
4. cellstr(S) chuyển xâu S sang dạng mảng cấu trúc
5. char(B) chuyển mảng cấu trúc B sang dạng xâu
3.6 Các hàm giao tiếp với tệp dữ liệu (FILES)
Ngoài tệp mat-file đã biết, để tương thích với ngôn ngữ C, MATLAB còn định nghĩa
hai loại tệp dạng văn bản (text) và nhị phân (ASCII) với các cách làm việc khác nhau.
1. fopen mở file hoặc truy xuất dữ liệu của file đang mở.

39
Giáo trình MATLAB - SIMULINK
Cú pháp:
fid = fopen(‘fn’, ‘p’)
Trong đó:
fid: tên biến kiểu số nguyên (0, 1, 2, ...) trỏ đến file đang mở.
fn: tên file (có thể đặt đường dẫn).
Tham số p có các định dạng sau (mặc nhiên là dạng nhị phân):
‘r’: chỉ đọc.
‘r+’: đọc và ghi.
‘w’: xóa tất cả nội dung của file, tạo file mới và mở để ghi.
‘w+’: xóa tất cả nội dung của file, tạo file mới để ghi và đọc.
‘a’ : mở file để bổ sung thông tin (khởi tạo nếu file chưa có)
‘a+’ : mở file để đọc và bổ sung thông tin (tạo nếu chưa có)
'W' : mở file để ghi mà không tự động làm tươi
'A' : mở file để bổ sung mà không tự động làm tươi
‘t’ : mở file dạng văn bản (text). Ví dụ: ‘rt’, ‘wt+’, ...
2. fread đọc dữ liệu dạng nhị phân từ file.
Cú pháp:
[A, COUNT] = fread(FID)
[A, COUNT] = fread(FID,SIZE,PRECISION)
Trong đó:
A: tên biến chứa dữ liệu được đọc vào.
COUNT: số phần tử được đọc vào.
FID: tên biến trỏ đến file cần đọc.
SIZE: kích thước dữ liệu đọc vào, được định dạng bởi:
n: chỉ đọc n phần tử vào cột vector a.
inf: đọc đến hết file.
[m,n]: chỉ đọc vào m cột và n hàng, n có thể bằng inf còn m thì không.
PRECISION: là xâu ký tự (thường ít sử dụng thông số này).
Ví dụ 1: fid = fopen('fread.m','r');
F = fread(fid);
s = setstr(F')
Ví dụ 2: file vd.txt có nội dung:

40
Giáo trình MATLAB - SIMULINK

ABC
1 2 3

fid = fopen(‘vd.txt’,’r’);
[a,c] = fread(fid);
disp(a);
disp(c);
a= 65
32
66
32
67
13
10
49
32
50
32
51
c= 12
Ví dụ 3:
fid = fopen(‘vd1.txt’,’r’);
[a,c] = fread(fid, 4);
disp(a);
disp(c);
a= 65
32
66
32
c= 4

Ví dụ 4: file vd3.txt có nội dung

41
Giáo trình MATLAB - SIMULINK

ABCDE
FGHIJ
KLMNO

fid = fopen(‘vd3.txt’,’r’);
[a,c] = fread(fid, [7, inf]);
disp(a);
disp(c);
a= 65 70 75
66 71 76
67 72 77
68 73 78
69 74 79
13 13 13
10 10 10
c=
21
»a’= 65 66 67 68 69 13 10
70 71 72 73 74 13 10
75 76 77 78 79 13 10
3. fwrite ghi đoạn dữ liệu dạng nhị phân thành file.
Cú pháp:
COUNT = FWRITE(FID,A,PRECISION)
Trong đó:
FID: tên biến trỏ đến file cần ghi.
A: tên biến ma trận chứa dữ liệu cần ghi.
COUNT: nhận số phần tử ghi được.
PRECISION: tương tự lệnh FREAD.
Ví dụ 1: fid = fopen('magic5.bin','wb')
fwrite(fid,magic(5),'integer*4')%file nhị phân có 25 phần tử magic 5x5 số nguyên.

Ví dụ 2: Ghi đoạn dữ liệu của biến a thành file a.txt: a = [65 66 67]

42
Giáo trình MATLAB - SIMULINK

fid = fopen(‘a.txt’, ‘w’);


fwrite(fid, ‘%’);
fwite(fid,a);
%Gán file a.txt vào biến b để xem nội dung
fid = fopen(‘a.txt’);
b = fscanf(fid, ‘%’);
disp(b);
fclose(fid);%Kết quả
b= ABC
4. fscanf đọc dữ liệu đã định dạng từ file.
Cú pháp:
[a,count] = fscanf(fid, ‘format’, size)
Trong đó:
a: tên biến chứa chuỗi ký tự sau khi được định dạng.
count: đếm số phần tử được đọc vào.
size: kích thước sẽ được đọc vào.
format: phần định dạng giống như lệnh sprintf.
fid: biến định vị tên file từ lệnh FOPEN.
Ví dụ: S = fscanf(fid,'%s') đọc và trả về xâu ký tự.
A = fscanf(fid,'%5d') đọc 5 số nguyên.
5. fprintf ghi đoạn dữ liệu thành file.
Cú pháp:
COUNT = fprintf(FID,FORMAT,A,...)
Trong đó:
COUNT : số các byte được ghi
FID : tên biến trỏ đến file cần ghi.
FORMAT : phần định dạng phần thực của ma trận dữ liệu A.
Ví dụ 1: x = 0:.1:1; y = [x; exp(x)];
fid = fopen('exp.txt','w');
fprintf(fid,'%6.2f %12.8f\n',y);
fclose(fid); % tạo file text chứa bảng các giá trị hàm mũ

43
Giáo trình MATLAB - SIMULINK
0.00 1.00000000
0.10 1.10517092
...
1.00 2.71828183
Ví dụ 2: Tạo file exp.txt có nội dung:
x = 0:2:10;
y = [x, x/2];
fid = fopen(‘exp.txt’, ‘w’);
fprintf(fid, ‘%d’, [2, inf]);
Gán file exp.txt và biến a để xem nội dung:
fid = fopen(‘exp.txt’)
a = fscanf(fid, ‘%d’, [2,inf]);
disp(a);
fclose(fid);
Kết quả 0 2 4 6 8 10
0 1 2 3 4 5
6. sscanf đọc chuỗi ký tự và định dạng lại chuỗi ký tự đó.
Cú pháp:
[a,count] = sscanf(s, ‘format’, size)
Trong đó:
a: tên biến chứa chuỗi ký tự sau khi được định dạng.
count: đếm số phần tử được đọc vào.
size: kích thước sẽ được đọc vào.
format: phần định dạng giống như lệnh sprintf.
Ví dụ: s = ‘3.12 1.2 0.23 2.56’;
»[a, count] = sscanf(s, ‘%f’,3)
a= 3.1200
1.2000
0.2300
count = 3
7. sprintf hiển thị thông tin lên màn hình.
Cú pháp:

44
Giáo trình MATLAB - SIMULINK
s = sprintf(‘ts’,ds)
Trong đó:
s: biến chứa chuỗi số hiển thị trên màn hình.
ts: các tham số định dạng.
ds: danh sách các đối số.
Tham số định dạng thuộc 1 trong 2 kiểu sau:
(1) Chuỗi ký tự: chuỗi sẽ được hiển thị lên màn hình giống như trong câu lệnh.
(2) Chuỗi các tham số định dạng: chuỗi này sẽ không được hiển thị lên màn
hình, nhưng tác dụng điều khiển việc chuyển đổi và cách hiển thị các đối số
được đưa ra trong danh sách các đối số.
Ví dụ các tham số định dạng:
1) %d: đối số là số nguyên được viết dưới dạng thập phân.
s = sprintf(‘Đây là số: %d’,-24)
s = Đây là số: -2
2) %u: đối số là số nguyên viết dưới dạng thập phân không dấu.
s = sprintf(‘Đây là số: %u’,24)
s = Đây là số: 24
3) %o: đối số là số nguyên viết dưới dạng cơ số 8 không dấu.
s = sprintf(‘Đây là số: %o’,9)
s = Đây là số: 11
4) %x: đối số là số nguyên được viết dưới dạng cơ số 16.
s = sprintf(‘Đây là số: %x’,255)
s = Đây là số:ff
5) %f: đối số là số nguyên được viết dưới dạng cơ số 10.
s = sprintf(‘Đây là số: %f’,255)
s = Đây là số: 255.000000
Để định dạng phần thập phân thì thêm vào con số chứa số thập phân cần lấy.
s = sprintf(‘Đây là số: %.3f’, 2.5568)
s = Đây là số: 2.557
6) %c: đối số là 1 ký tự riêng đặc biệt.
s = sprintf(‘Đây là chữ: %c’,’M’)
s = Đây là chữ: M

45
Giáo trình MATLAB - SIMULINK
7)%s: đối số là chuỗi ký tự.
s = sprintf(‘Đây là chuỗi: %s’, ‘Matlab’)
s = Đây là chuỗi: Matlab
8. fclose đóng file đang mở sau khi truy xuất xong.
Cú pháp:
st = fclose(fid)
st = fclose('all') đóng tất cả các file, ngoại trừ fid = 0, 1 và 2.
Trong đó:
fid: tên biến trỏ đến file đang mở. Nếu đóng thành công st=0, nếu không st = -1.
3.7 Các thao tác vẽ và xử lý đồ thị
3.7.1 Các lệnh xử lý trên cửa sổ đồ thị
MATLAB cung cấp thư viện hàm xử lý đồ hoạ rất mạnh và phong phú trong không
gian 2-D và 3-D. Cùng lúc trên 1 trục toạ độ có thể vẽ nhiều đồ thị hoặc phân chia
thành các đồ thị con. Sau đây ta nghiên cứu một số lệnh cơ bản nhất
1. figure(n) tạo ra cửa sổ đồ thị mới với số thứ tự là n. Nếu cửa sổ đã tồn tại thì
chọn đến đồ thị hiện hành để cho các lệnh khác tác dụng lên cửa sổ được chọn.
2. sublot(m,n,p) chia một trang đồ hoạ làm nhiều ô nhỏ để vẽ các đồ thị lên mỗi ô.
Với mxn là số ô sẽ vẽ, p là số thứ tự của ô hiện hành. Lệnh subplot luôn đi trước
lệnh plot để chỉ cho lệnh plot biết sẽ vẽ lên ô nào. Khi cần trở về màn hình đồ
hoạ bình thường (màn hình đơn có một đồ thị) ta gọi lệnh: subplot không có
tham số. Trường hợp có nhiều cửa sổ đồ thị, nên dùng biến để nhận kết quả từ
lệnh plot.
3. hold on/off giữ lại đồ thị hiện hành trong khung màn hình đồ thị để gán thêm
thuộc tính đồ thị hoặc vẽ thêm đồ thị khác mà không xoá đồ thị cũ/có xoá đồ thị

4. axis([xmin xmax ymin ymax]) xác định khoản giới hạn vẽ cho trục x và y
5. axis([xmin xmax ymin ymax zmin zmax]) xác định khoản giới hạn vẽ cho trục x ,
y và z trong đồ thị 3D
6. axis(‘ij’) quay trục y với hướng dưới theo chiều dương, trên theo chiều âm
7. axis(‘xy’) xét lại trục y với hướng ban đầu
8. axis('square') thay đổi toạ độ trục x,y để có cửa sổ vuông
9. axis('auto') tự động thay đổi kích thước

46
Giáo trình MATLAB - SIMULINK
10. title(‘string’) in tiêu đề chương trình
11. xlabel(‘string’) gán nhãn cho trục x
12. ylabel(‘string’) gán nhãn cho trục y
13. zlabel(‘string’) gán nhãn cho trục z (đối với đồ thị 3-D)
14. legend(‘string1’,’ string2’,...) ghi chú cho đồ thị
15. legend(‘off’) loại bỏ chú thích
16. text(x1,y1, ‘string’) vẽ dòng string lên màn hình đồ hoạ tại toạ độ (x1,y1)
17. gtext(‘string’) vẽ dòng string lên màn hình đồ hoạ tại vị trí bấm chuột
18. zoom on/off cho phép sử dụng nút trái chuột để phóng to đồ thị, nút phải chuột
để thu nhỏ/loại bỏ lệnh zoom
19. [x,y]= ginput(n) đọc n điểm dữ liệu trên màn hình đồ hoạ. Toạ độ [x,y] nhận
được từ vị trí con chuột đang trỏ trên màn hình đồ hoạ.
20. box on/off hiển thị/không hiển thị đường viền hộp đồ thị
21. grid on/off vẽ lên các ô lưới trên mặt phẳng toạ độ/bỏ chức năng vẽ lưới
1. clf : xoá các đối tượng trong cửa sổ figure
2. cla : xoá đồ thị trong ô
22. close, close all xoá màn hình đồ hoạ (xem thêm hướng dẫn trên help)
23. Các thao tác trực tiếp thuộc tính trên màn hình đồ hoạ
Các thao tác này giúp người sử dụng chỉnh sửa lại đồ thị trực tiếp trên màn hình đồ
hoạ. Có 3 thuộc tính với nội dung như sau:

- Thuộc tính Line Properties:


Chỉnh sửa các tham số Linewidth,
LineStyle, Color, MarkerSize, MarkerStyle
Cách chọn theo các bước sau:
+ Chọn chế độ Enable Plot Editing
+ Chọn đồ thị cần thay đổi:
Từ menu Tool -> Line Properties...
- Thuộc tính Axes Properties:
Chỉnh sửa các thông số Title, Label,
Scale, Grid...
Cách chọn theo các bước sau:
+ Chọn chế độ Enable Plot Editing
+ Chọn trục toạ độ cần thay đổi: Từ
menu Tool -> Axes Properties...
47
Giáo trình MATLAB - SIMULINK

- Thuộc tính Text Properties:


Chỉnh sửa lại các thông số Font chữ.
Cách chọn theo các bước sau:
+ Chọn chế độ Enable Plot Editing
+ Từ menu
Tool -> Edit font properties...

3.7.2 Lệnh vẽ trong không gian 2-D


3.7.2.1 Đồ thị dạng đường, điểm (PLOT)
Gồm các kiểu lệnh sau:
1. plot(x,y) : vẽ đồ thị gồm tập hợp các điểm là các phần tử của véc tơ x (trục
hoành) và y (trục tung).
2. plot(y) : vẽ đồ thị gồm tập hợp các điểm là các phần tử của véc tơ y (trục tung)
và các giá trị thứ tự các phần tử véc tơ y (trục hoành). Nếu y véc tơ gồm các số
phức thì đồ thị là tập hợp các điểm với hoành độ là phần thực và tung độ là phần
ảo. Tương đương với lệnh: plot(real(y), image(y))
3. plot(x,y,’str’) : vẽ đồ thị với định dạng cho màu sắc và kiểu đường vẽ nhờ khai
báo qua str là tham số tối đa gồm 3 ký tự chứa các thông tin sau:
+ màu sắc theo quy định:
y yellow m magenta
c cyan r red
g green b blue
w white k black
+ quy định kiểu đánh dấu (markerStyle):
. point o circle x x-mark
+ plus * star s square
d diamond v triangle ^ triangle
< triangle > triangle p pentagram
h hexagram
+ Kiểu đồ thị (lineStyle)
- solid -. dashdot -- dashed : dotted
Ví dụ: plot(X,Y,'c+:') sẽ vẽ đồ thị với định dạng màu xanh cyan, kiểu đánh dấu + và
kiểu đồ thị : (dotted).
Khi vẽ nhiều đồ thị cùng lúc trên một ô, dùng lệnh plot sau:

48
Giáo trình MATLAB - SIMULINK
4. plot(x1,y1,’str1’,x2,y2,’str2’,...)
với str1, str2,... là các định dạng theo quy định trên.
Ví dụ: plot(x1,y1,’y-‘,x2,y2,’g--‘)
Có thể cho phép gán thuộc tính đồ thị trong câu lệnh plot
Ví dụ: plot(x1,y1,’y-‘,’LineWidth’,2,’MarkerSize’,10,x2,y2,’g--‘,...
’LineWidth’,1,’MarkerSize’,5)
Trong đó: LineWidth là thuộc tính chiều dày nét vẽ và MarkerSize là chiều cao ký tự
đánh dấu. (Chú ý các ký tự in HOA và in thường).
5. fplot vẽ đồ thị của hàm số dạng function.
Cú pháp:
fplot(‘fun’,[xmin,xmax]
Trong đó:
fun: tên hàm số.
xmin, xmax: xác định khoảng cần vẽ.
Ví dụ:
»fplot(‘x.^3-2*x-5’,[0,2]);
»grid;
Các ví dụ tổng hợp:
Ví dụ1: vẽ đồ thị áp 3 pha hình sin trên cùng một hệ toạ độ
x = linspace(0,4*pi,500); % cho x chay tu o den 4pi voi 500 mau
y1 = 5*sin(x);
y2 = 5*sin(x+2*pi/3);
y3 = 5*sin(x-2*pi/3);
plot(x,y1,x,y2,x,y3);
% Set axis limits and grid lines
grid on
xlabel('Time')
ylabel('Amplitude')
legend('First','Second','Third')
title('3 phase_sin plot')

Ví dụ2: vẽ đồ thị áp 3 pha hình sin trên cùng một cửa sổ với 3 ô đồ thị nhỏ

49
Giáo trình MATLAB - SIMULINK

x = linspace(0,4*pi,500); % cho x chay tu o den 4pi voi 500 mau


y1 = 5*sin(x);
y2 = 5*sin(x+2*pi/3);
y3 = 5*sin(x-2*pi/3);
%Select window and position plot region within window
subplot(2,2,1)
h1 = plot(x,y1,’y-o’,'LineWidth',2,’MarkerSize’,5);
grid on
xlabel('Time')
ylabel('Amplitude')
legend(h1,'First')
title('First phase')
subplot(2,2,2)
h2 = plot(x,y2,’g-+’,'LineWidth',2,’MarkerSize’,5);
xlabel('Time')
ylabel('Amplitude')
legend(h2,'Second')
title('Second phase')
subplot(2,2,3)
h3 = plot(x,y3,’r-*’,'LineWidth',2,’MarkerSize’,5);
xlabel('Time')
ylabel('Amplitude')
legend(h3,'third')
title('third phase')
subplot % dua cua so do thi tro lai binh thuong
Ví dụ 3: vẽ đồ thị áp 3 pha hình sin trên 3 cửa sổ khác nhau
x = linspace(0,4*pi,500); % cho x chay tu o den 4pi voi 500 mau
y1 = 5*sin(x);
y2 = 5*sin(x+2*pi/3);
y3 = 5*sin(x-2*pi/3);
figure(1)
plot(x,y1,’r-‘);

50
Giáo trình MATLAB - SIMULINK

% Set axis limits and grid lines


grid on
xlabel('Time')
ylabel('Amplitude')
legend('First')
title('3 phase_sin plot')
% ve do thi thu 2
figure(2)
plot(x,y2,’g-.‘);
% Set axis limits and grid lines
xlabel('Time')
ylabel('Amplitude')
legend('Second')
title('3 phase_sin plot')
% ve do thi thu 3
figure(3)
plot(x,y3,’g-.‘);
xlabel('Time')
ylabel('Amplitude')
legend('Third')
title('3 phase_sin plot')
3.7.2.2 Đồ thị dạng hoạt cảnh (COMET)
Cho phép vẽ đồ thị giống như plot với cách vẽ chậm trên màn hình gây ra hiệu ứng
hoạt hình. Có 2 cú pháp:
1. comet(y) : vẽ đồ thị hệ toạ độ xy với thời gian kéo dài 0.1 (giây)
2. comet(x,y) : vẽ đồ thị hệ toạ độ xy với thời gian kéo dài 0.1
3. comet(x,y,t) : vẽ đồ thị hệ toạ độ xy với thời gian kéo dài t
Ví dụ: thay các lệnh vẽ plot ở các ví dụ trên thành lệnh comet.
3.7.2.3 Đồ thị dạng thanh (BAR)
1. bar(y): vẽ đồ thị thanh theo giá trị nằm trong trục y tăng dần theo x.
2. bar(x,y) vẽ đồ thị thanh, mỗi thanh theo giá trị nằm trên trục y tại vị trí chỉ định
theo x

51
Giáo trình MATLAB - SIMULINK
3. bar(x,y,’width’,0.5) vẽ đồ thị có đặt thuộc tính chiều rộng thanh
Ví dụ:
% Bar plot of a bell shaped curve
x = -2.9:0.2:2.9;
bar(x,exp(-x.*x));
3.7.2.4 Đồ thị dạng hình tròn theo kiểu phần trăm (PIE).
1. pie(x) cho đồ thị hình pie dưới dạng tỉ lệ phần trăm theo các giá trị của
véc tơ thành phần của x.
2. pie(x,tach) tach là véc tơ có giá trị 1/0 để tách/không tách giá trị đồ thị ra khỏi
pie (có cùng kích thước với x).
3. pie(x,nhan) nhan là véc tơ kiểu mảng xâu cấu trúc biểu thị nhãn của các giá trị.
4. pie(x,tach,nhan)
Ví dụ:
x= [1 4 6 7 9]
pie(x)
3.7.2.5 Đồ thị trong toạ đồ cực (POLAR):
1. polar(theta,r) vẽ đồ thị quan hệ bán kính r theo góc theta
Ví dụ:
% Polar plot
t=0:0.01:2*pi;
polar(t,abs(sin(2*t).*cos(2*t)));
3.7.2.6 Đồ thị theo trục toạ độ logarithm (LOG)
1. semilogx(x,y) vẽ đồ thị với thang đo theo trục x là log10 của x, tương đương
plot(log10(x),y)
2. semilogy(x,y) vẽ đồ thị với thang đo theo trục y là log10 của y, tương đương
plot(x,log10(y))
3. loglog(x,y) vẽ đồ thị với thang đo theo trục x và y đều là log10, tương đương
plot(log10(x),log10(y))
Ví dụ:
x=linspace(0,7,100)
y=exp(x)

52
Giáo trình MATLAB - SIMULINK
subplot(2,1,1) ; plot(x,y)
subplot(2,1,2) ; semilogy(x,y)
Ví dụ: tìm nghiệm của phương trình bậc 3 bằng đồ thị
x=linspace(-100,100,1000);
y=x.^3+2*x.^2+3*x-6;
plot(x,y)
[r1,r2]=ginput
% nghiem phuong trinh trong doan [-100 100] la
r1
% kiem ta lai bang lenh roots
r=roots([1 2 3 –6])
3.7.3 Lệnh vẽ trong không gian 3-D **
Bao gồm nhiều lệnh phong phú, xin nêu ra một số lệnh tiêu biểu. Chi tiết hãy nghiên
cứu phần DEMO/visualization và graphic.
3.7.3.1 Đồ thị dạng đường, điểm
1. plot3 (x,y,z) vẽ đồ thị trong toạ độ xyz theo các giá trị các phần tử các véc tơ
2. plot3 (x,y,z, ‘str’) vẽ đồ thị trong toạ độ xyz theo giá trị các phần tử các véc tơ
với định dạng quy định như lệnh plot
3.7.3.2 Đồ thị dạng hoạt cảnh
1. comet3(z) : vẽ đồ thị hệ toạ độ xyz với thời gian kéo dài 0.1
2. comet3(x,y,z) : vẽ đồ thị hệ toạ độ xyz với thời gian kéo dài 0.1
3. comet3(x,y,z,t) : vẽ đồ thị hệ toạ độ xyz với thời gian kéo dài t
3.7.3.3 Đồ thị dạng thanh
1. bar3(x,y,z): vẽ đồ thị thanh với mỗi thanh theo giá trị nằm trong trục z tăng dần.
Ví dụ:
% Bar plot of a bell shaped curve
x = -2.9:0.2:2.9;
bar3(x,exp(-x.*x),sin(x));
3.7.3.4 Đồ thị dạng hình tròn theo kiểu phần trăm
1. pie3(x,y,z) cho đồ thị hình pie dưới dạng tỉ lệ phần trăm theo các giá trị của véc
tơ. Xem thêm cú pháp ở phần 2D.

53
Giáo trình MATLAB - SIMULINK
3.7.3.5 Đồ thị dạng lưới
1. meshgrid(x,y) tạo mảng xấp xỉ hoá hai chiều trong miền khảo sát
2. mesh(z) vẽ mặt lưới trong không gian 3D
Ví dụ: »[X,Y] = meshgrid(-2:.1:2, -2:.1:2);
»Z = X .* exp(-X.^2 - Y.^2);
»mesh(Z)
3. waterfall(z) tương tự mesh nhưng chỉ vẽ theo một hướng.
3.7.3.6 Đồ thị dạng mặt
1. surf(X,Y,Z,C) tạo bề mặt 3 chiều
2. Xem thêm surfl và surfc.
Ví dụ: Vẽ đồ thị lưới của hàm sin(x)/x:
» x=linspace(-10,10);
» y=x;
» [p,q]=meshgrid(x,y);
» R=sqrt(p.^2+q.^2)+eps;
» z=sin(R)./R;
» figure(1);
» mesh(z);
» figure(2);
» waterfall(z);
» figure(3);
» surf(z);
3.8 Các thủ tục in ấn và lưu trữ kết quả
+ Lưu mã nguồn chương trình (dạng m-file, mdl-file của Simulink)
1. Mở và chọn phần chương trình cần copy
2. Copy vào vùng nhớ đệm: Từ menu Edit -> Copy (Ctrl+C)
3. Dán vào báo cáo: Mở báo cáo và chọn Edit -> Paste (Ctrl+V)
+ Lưu đồ thị kết quả:
Chú ý: Đặt tình trạng kết quả đồ thị về dạng wmf-file bằng cách:
Từ đồ thị chọn menu:Edit->Copy Options -> Windows Metafile.
1. Copy đồ thị vào bộ nhớ đệm: Menu Edit -> Copy Figure
2. Dán nội dung bộ nhớ đệm vào báo cáo (xem tương tự trên)

54
Giáo trình MATLAB - SIMULINK
hoặc
2. Copy đồ thị vào file: (Lưu đồ thị dưới dạng tập tin định kiểu)
Menu File-> Export...
Sử dụng các nút thanh công cụ để vẽ, ghi chú trên đồ thị sau đó chèn vào báo cáo
3.9 Các ví dụ và bài tập **

55
Giáo trình MATLAB - SIMULINK

CHƯƠNG 4. CÁC PHƯƠNG PHÁP TÍNH VÀ ỨNG DỤNG


4.1 Khái niệm Symbolic và giới thiệu về Toolbox Symbolic
4.1.1 Khái niệm Symbolic
Trong MATLAB cho phép dùng các ký hiệu đại diện (symbolic) cho các biến, tham
số hay hàm trong các biểu thức và trong các hàm. Do đó, kết quả sau khi tính toán là một
biểu thức theo tham số. Toolbox Symbolic của MATLAB cung cấp các hàm thực hiện
các phép tính dưới dạng symbolic. Đây là thư viện của hãng phần mềm Maple (Mỹ).
4.1.2 Cách khai báo biến symbolic
Để thực hiện tính toán dưới dạng symbolic, cần phải định nghĩa trước các biến, hay
tham số bằng một trong 2 cách sau:
Cách 1: Dùng khai báo sym.
Các ví dụ sau cho thấy các hình thức khai báo:
»x = sym('x'); % tạo ra biến x với tên x (khi đó x là biến có thể có giá trị bất kì)
»x = sym('x','real'); % tạo ra biến thực x với tên x
»k = sym('k','positive'); % tạo ra biến k dương với tên k
Cách 2: Khai báo syms: khi cần khai báo các biến có cùng kiểu (mặc nhiên: real).
Các ví dụ: »syms x1 x2 x3; % tương đương với 3 lần khai báo
»x1 = sym('x1');
»x2 = sym('x2');
»x3 = sym('x3');
»syms x beta real; % tương đương với 2 khai báo
»x = sym('x','real');
»beta = sym('beta','real');
Các biến sau khi đã khai báo được phép có mặt trong các biểu thức hay làm tham
số cho các hàm. Do đó, các hàm đã dùng trước đây với các biến có giá trị cho trước đều
áp dụng được dưới dạng symbolic.
Ta xét các ví dụ sau.
Ví dụ 1: chương trình một m-file dưới dạng script
syms x y real
z = x + i*y; % tạo số phức
k=x^2;

56
Giáo trình MATLAB - SIMULINK

f = x^2 + y^2; % khai báo hàm f(x,y)


Ví dụ trên tạo ra: biến z kiểu số phức,
biến (hay hàm) k và
hàm f có hai biến (thông số) là x và y: f(x,y).
Ví dụ 2: Các thao tác với ma trận giải hệ phương trình tuyến tính dạng tham số
syms a b c d b1 b2
A = [a b; c d]
B=[b1; b2 ]
X=inv(A)*B % hoặc X=A\B % kết quả
A=
[ a, b]
[ c, d]
B=
[ b1]
[ b2]
X= % nghiem phuong trinh A*X=B
[ d/(a*d-c*b)*b1-b/(a*d-c*b)*b2]
[ -c/(a*d-c*b)*b1+a/(a*d-c*b)*b2]
4.1.3 Các hàm trong Toolbox Symbolic **
1. findsym Tìm biến đặc trưng gần x nhất trong biểu thức đặc trưng khi không có x
2. subs thay thế biến trong biểu thức đặc trưng
3. double chuyển giá trị của biểu thức đặc trưng thành số
4. class trả về kiểu dữ liểu của biến
5. numden tách tử số và mẫu số của phân thức (đa thức hữu tỉ)
6. Các phép toán đại số + - * / ^
7. compose kết hợp hai hàm f(y) và g(x) thành hàm hợp f(g(x))
Ví dụ: syms x y z t u;
f = 1/(1 + x^2); g = sin(y); h = x^t; p = exp(-y/u);
compose(f,g) trả về 1/(1+sin(y)^2)
compose(f,g,t) trả về 1/(1+sin(t)^2)
compose(h,g,x,z) trả về sin(z)^t
compose(h,g,t,z) trả về x^sin(z)

57
Giáo trình MATLAB - SIMULINK
compose(h,p,x,y,z) trả về exp(-z/u)^t
compose(h,p,t,u,z) trả về x^exp(-y/z)
8. finverse tìm nghịch đảo của một biểu thức
Ví dụ: finverse(1/tan(x)) trả về atan(1/x).
f = x^2+y;
finverse(f,y) trả về -x^2+y.
finverse(f) trả về (-y+x)^(1/2) và chú ý phép nghịch đảo không
duy nhất
9. symsum tìm tổng đặc trưng của một biểu thức
10. sym2poly chuyển đa thức đặc trưng thành véc tơ hệ số của nó
Ví dụ: sym2poly(x^3 - 2*x - 5) trả về [1 0 -2 -5]
11. poly2sym chuyển véc tơ hệ số thành đa thức đặc trưng
Ví dụ: poly2sym([1 0 -2 -5]) trả về x^3-2*x-5
poly2sym([1 0 -2 -5],'t') và
t = sym('t')
poly2sym([1 0 -2 -5],t) % cả hai đều trả về
t^3-2*t-5
12. horner đưa đa thức về dạng horner
13. taylor mở rộng chuỗi taylor
14. pretty hiển thị biểu thức đặc trưng tương tự kiểu toán học
15. collect gom tất cả các mục giống nhau
16. factor biểu diễn dưới dạng một đa thức
17. expand mở rộng tất cá các mục
18. simplify đơn giản hoá các biểu thức
Ví dụ: »x = sym(‘x’);
»f = (x^2-1)*(x-2)*(x-3);
»collect(f)
ans =
x^4 - 5*x^3 + 5*x^2 + 5*x - 6
»horner(ans)
ans =
-6 + (5 + (5 + (-5 + x)*x)*x)*x

58
Giáo trình MATLAB - SIMULINK
»factor(ans)
ans =
(x-1)*(x-2)*(x-3)*(x+1)
»expand(f)
ans =
x^4 - 5*x^3 + 5*x^2 + 5*x - 6
»syms x y a
»simplify(sin(x)^2 + 3*x + cos(x)^2 - 5)
ans =
-4+3*x
»simplify(log(2*x/y))
ans =
log(2)+log(x/y)
»simplify((-a^2 + 1)/(1 - a))
ans =
a+1
19. simple tìm biểu thức tương đương có chuỗi ký tự ngắn nhất
Cú pháp: simple(S)
[R,H] = simple(S)
Ví dụ: Nếu sử dụng [R,H] = simple(S) sẽ có tương ứng như sau:
S R H
cos(x)^2+sin(x)^2 1 combine(trig)
2*cos(x)^2-sin(x)^2 3*cos(x)^2-1 simplify
cos(x)^2-sin(x)^2 cos(2*x) combine(trig)
cos(x)+(-sin(x)^2)^(1/2) cos(x)+i*sin(x) radsimp
cos(x)+i*sin(x) exp(i*x) convert(exp)
(x+1)*x*(x-1) x^3-x collect(x)
x^3+3*x^2+3*x+1 (x+1)^3 factor
cos(3*acos(x)) 4*x^3-3*x expand
syms x y positive
log(x) + log(y) log(x*y) combine
20. ezplot vẽ đồ thị hàm đặc trưng

59
Giáo trình MATLAB - SIMULINK
21. Các hàm biến đổi Z, Laplace, Fourier.
4.2 Đa thức và nội suy
4.2.1 Đa thức
1. roots tìm nghiệm của đa thức.
Cú pháp:
r = roots(p)
Trong đó:
r: biến chứa kết quả. p: tên biểu thức.
Ví dụ: Tìm nghiệm của phương trình: x2-1 =0
»p = [1 0 -1];
»r = roots(p)
r=
-1.0000
1.0000
2. poly tạo ra đa thức từ các nghiệm được chỉ định.
Cú pháp:
p = poly(A)
p = poly(r)
Trong đó:
p = poly(A), A là ma trận nxn với các phần tử là các hệ số của đa thức đặc trưng det
(sI-A) (đa thức vế trái phương trình |λI-A|=0), tạo ra vector hàng có n+1 phần tử xếp
theo thứ tự giảm dần số mũ của s. Vậy nếu X = roots(P) thì P = poly(X) với P là vectơ.
p = poly(r), tạo ra vector hàng với các phần tử là các hệ số của đa thức có nghiệm là
các phần tử của vector ngõ ra.
Ví dụ 1: Cho ma trận
A=
1 2 3
4 5 6
7 8 0
»p = poly (A)
p= 1 -6 -72 -27
3. polyval tính giá trị đa thức

60
Giáo trình MATLAB - SIMULINK
Cú pháp:
Y = polyval(P,X),
Trong đó:
P là véc tơ chứa các hệ số của đa thức,
X là giá trị của biến. Nếu x là ma trận/véc tơ, sẽ tính cho toàn bộ giá trị trong X.
4. polyvalm tính giá trị đa thức với tham số là ma trận
Cú pháp:
polyvalm(V,X)
Trong đó:
V là véc tơ chứa các hệ số của đa thức cần tìm,
X là ma trận vuông.
5. residue chuyển đổi giữa dạng khai triển phân số từng phần và dạng đa
thức.
Cú pháp:
[r,p,k]= residue(b,a)
[b,a]= residue(r,p,k)
Trong đó:
[r,p,k]= residue(b,a) tìm giá trị thặng dư, các cực, và các số hạng khai triển phân
số từng phần của 2 đa thức b(s) và a(s) dạng:
−1 −2 −m
b( s ) b1 + b2 s + b 3 s + ..... + b m +1 s
=
a( s ) a1 + a 2 s −1 + a 3 s − 2 + ..... + a n +1 s − n

[b,a]= residue(r,p,k) chuyển dạng khai triển phân số từng phần về dạng đa thức
với các hệ số trong vector a và b.
b( s ) r1 r r
= + 2 + ...... + n + k ( s )
a( s ) s − p1 s − p1 s − pn

Ví dụ: Xác định thành phần tối giản của hàm truyền: F(s)= (2s3+9s+1)/(s3+s2+4s+4)

a=[1 1 4 4]
b=[2 0 9 1]
[r,p,k]=residue(b,a) %Kết quả:

b=
2 0 9 1

61
Giáo trình MATLAB - SIMULINK
a=
1 1 4 4
r=
0.0000 - 0.2500i
0.0000 + 0.2500i
-2.0000
p=
-0.0000 + 2.0000i
-0.0000 - 2.0000i
-1.0000
k=
2
Từ đó hàm truyền tối giản là:
2 + (-2/(s+1)) + (0,25i/(s -j2)) + (-0,25i/(s -j2)) = 2 + (-2/(s+1))+ 1/(s2+4)
6. conv(p1,p2) nhân 2 đa thức p1, p2 thành đa thức tích p1*p2 (rút gọn đa thức)
7. deconv chia hai đa thức.
Cú pháp:
[q,r] =deconv(a,b)
Trong đó:
a,b: véc tơ chứa đa thức.
q: thương số của a, b.
r: số dư (véc tơ có cùng kích thước với a).
Cách khai báo: sắp xếp các hệ số theo thứ tự bậc luỹ thừagiảm dần.
Ví dụ:
Chia 2 đa thức (2x2+3x+6)/(2x+3)
»a = [2 3 6];
»b = [2 3];
»[q,r] = deconv (a,b)
q=
1 0
r=
0 0 6

62
Giáo trình MATLAB - SIMULINK
8. polyder tính đạo hàm đa thức
Cú pháp:
polyder(P)
polyder(A,B)
Trong đó:
P là véc tơ chứa đa thức.
A,B véc tơ chứa tích các đa thức A*B
4.2.2 Nội suy và xấp xỉ
1. polyfit xấp xỉ bảng số liệu bằng đa thức theo phương pháp bình phương bé
nhất
Cú pháp:
P = polyfit(X,Y,N)
Trong đó:
X, Y véc tơ chứa dãy số liệu cần xấp xỉ
N bậc đa thức cần xấp xỉ
P Véc tơ chứa kết quả xấp xỉ đa thức (bậc N)
Ví dụ: »x=[1:.1:3];
»y=rand(1,21);
»p=polyfit(x,y,3) % bậc N=3
p=
-0.3374 2.3974 -5.2936 4.1091
2. interp1,interp2,interp3,interpn nối điểm theo các phương pháp
4.3 Tính vi phân (Differentiation)
4.3.1 Vi phân số
Sử dụng hàm diff để tính vi phân (sai phân) các bậc khác nhau của hàm số bất kỳ.
Các cú pháp:
diff(X) X: véc tơ, kết quả [X(2)-X(1) X(3)-X(2)...X(n)-X(n-1)].
diff(X) X: ma trận, kết quả ma trận hàng [X(2:n,:) - X(1:n-1,:)].
diff(X,N) vi phân bậc N theo t
diff(X,N,DIM) vi phân bậc N theo hướng DIM. 1: cột, 2: hàng.
(Nếu N >= size(X,DIM), DIFF trả về ma trận rỗng).
Ví dụ:

63
Giáo trình MATLAB - SIMULINK
»h = .001; x = 0:h:pi;
»diff(sin(x.^2))/h xấp xỉ đến 2*cos(x.^2).*x
»diff((1:10).^2) có kết quả là 3:2:19
Nếu X = [3 7 5 4 8
0 9 2 6 3
1 6 2 8 7
4 2 8 6 9
3 4 0 8 6]
»diff(X,1,1)
ans =
-3 2 -3 2 -5
1 -3 0 2 4
3 -4 6 -2 2
-1 2 -8 2 -3
»diff(X,1,2)
ans =
4 -2 -1 4
9 -7 4 -3
5 -4 6 -1
-2 6 -2 3
1 -4 8 -2
»diff(X,2,1)
ans =
4 -5 3 0 9
2 -1 6 -4 -2
-4 6 -14 4 -5
»diff(X,2,2)
ans =
-6 1 5
-16 11 -7
-9 10 -7
8 -8 5

64
Giáo trình MATLAB - SIMULINK
-5 12 -10
»diff(X,3,1)
ans =
-2 4 3 -4 -11
-6 7 -20 8 -3
»diff(X,3,2)
ans =
7 4
27 -18
19 -17
-16 13
17 -22
»diff(X,3,3) trả về ma trận rỗng do mảng chỉ có 2 chiều
4.3.2 Sử dụng symbolic
Trong symbolic, cũng dùng hàm diff tính vi phân hàm số bất kỳ.
Cú pháp:
diff(s) vi phân hàm s đối với một biến độc lập được xác định bởi hàm findsym
diff(s,’v’) hoặc diff(s,sym(‘v’)) vi phân hàm s đối với biến v
diff(s,n) vi phân bậc n theo thời gian , với n là số nguyên
diff(s,’v’,n) hoặc diff(s,n,’v’) vi phân bậc n của s theo biến v
Xét các ví dụ sau:
Ví dụ 1: »x = sym(‘x’);
»t = sym(‘t’);
»syms a b
»df=diff(sin(x^2))
df=
2*cos(x^2)*x
»d6f=diff(t^6,6) % đạo hàm bậc 6
d6f =
720
»f= exp(a*x + b)
»diff(f,x); % đạo hàm f theo x

65
Giáo trình MATLAB - SIMULINK
»diff(f,a); đạo hàm f theo a
»diff(f,b,2) % đạo hàm bậc 2 f theo b
Đối với một hàm, A là một vec tơ/ma trận thì diff(A) sẽ vi phân cho từng phần
tử.
Ví dụ 2: »syms a x
»A = [cos(a*x) sin(a*x) ; –sin(a*x) cos(a*x)]
A= [ cos(a*x) sin(a*x)]
[ –sin(a*x) cos(a*x)]
»dy = diff(A)
dy = [ –sin(a*x)*a cos(a*x)*a]
[ –cos(a*x)*a –sin(a*x)*a]
4.4 Tính tích phân (Integration)
4.4.1 Tích phân số
1. trap tính tích phân số theo phương pháp hình thang
Cú pháp:
Z = trapz(Y)
Z = trapz(X,Y)
Z = trapz(X,Y,DIM) hoặc trapz(Y,DIM)
Trong đó:
Y là véc tơ/ma trận hoặc hàm cần tính tích phân. Nếu Y là ma trận thì tính
cho cột.
X véc tơ chỉ vùng cận lấy tích phân (có cùng kích thước với Y)
DIM hướng lấy tích phân (DIM = 1 hoặc 2)
Ví dụ: Nếu Y = [0 1 2
3 4 5]
thì trapz(Y,1) là [1.5 2.5 3.5] và
trapz(Y,2) là [ 2
8 ];
2. quad tính tích phân số theo phương pháp thích nghi cầu phương của
Simpson sử dụng đệ quy.
Cú pháp:
Q = quad(FUN,A,B)

66
Giáo trình MATLAB - SIMULINK
Q = quad(FUN,A,B,TOL)
[Q,FCNT] = quad(...)
quad(FUN,A,B,TOL,TRACE)
quad(FUN,A,B,TOL,TRACE,P1,P2,...)
Trong đó:
FUN hàm cần tính tích phân dạng Y = FUN(X), nếu X là véc tơ thì Y cũng véc tơ.
Nếu hàm .m file thì thêm @ trước tên hàm.
A, B cận lấy tích phân (lớn hơn 1.e-6)
TOL Bước tăng của cận (mặc nhiên là 1.e-3 hoặc 1.e-6 với MATLAB 6.0).
TRACE khác 0 hiển thị giá trị [fcnt a b-a Q].
P1,P2,... các tham số của hàm (nếu có)
Ví dụ: Q = quad('1./(x.^3-2*x-5)',0,2);
F = inline('1./(x.^3-2*x-5)');
Q = quad(F,0,2);
Q = quad(@myfun,0,2);
với myfun.m là M-file:
function y = myfun(x)
y = 1./(x.^3-2*x-5);
3. quad8 tích phân số có kết quả chính xác hơn quad và thực hiện nhanh hơn
4. quadl tích phân số theo phương pháp thích nghi cầu phương của Lobatto
4.4.2 Sử dụng Symbolic
Gọi f là một hàm trong symbolic thì :
int(f) tích phân bất định của hàm f theo một biến độc lập ngầm định
int(f,x) tích phân bất định của hàm f theo biến độc lập x
int(f,a,b) tích phân xác định của hàm f theo biến độc lập trong khoảng [a b]
int(f,x,a,b) tích phân xác định của hàm f theo biến độc lập x trong khoảng [a b]

67
Giáo trình MATLAB - SIMULINK

Ví dụ: syms x x1 alpha u t;


A = [cos(x*t),sin(x*t);-sin(x*t),cos(x*t)];
int(1/(1+x^2)) trả về atan(x)
int(sin(alpha*u),alpha) trả về -cos(alpha*u)/u
int(besselj(1,x),x) trả về -besselj(0,x)
int(x1*log(1+x1),0,1) trả về 1/4
int(4*x*t,x,2,sin(t)) trả về 2*sin(t)^2*t-8*t
int([exp(t),exp(alpha*t)]) trả về [exp(t), 1/alpha*exp(alpha*t)]
int(A,t) trả về [sin(x*t)/x, -cos(x*t)/x]
[cos(x*t)/x, sin(x*t)/x]
4.5 Giải các phương trình và hệ phương trình
4.5.1 Phương pháp số

• Phương trình dạng đa thức: Xem phần đa thức (hàm ROOTS).


• Phương trình dạng hàm toán học: Sử dụng hàm FZERO
• Hệ phương trình: Xem các phép toán đa thức, ma trận, hàm INV.
4.5.2 Sử dụng Symbolic **
Dùng hàm solve trong toolbox symbolic
Cú pháp: (có 3 dạng)
solve(‘eqn1’,’eqn2’,...,’eqnN’)
solve(‘eqn1’,’eqn2’,...,’eqnN’,’var1,var2,...,varN’)
solve(‘eqn1’,’eqn2’,...,’eqnN’,’var1’,’var2’,...’varN’)
Trong đó:
eqns là các xâu phương trình.

68
Giáo trình MATLAB - SIMULINK
vars là các biến symbolic.
Ví dụ: »solve(‘p*sin(x) = r’); % sẽ tự chọn biến là ‘x’ và kết quả
ans =
asin(r/p)
»[x,y] = solve(‘x^2 + x*y + y = 3’,’x^2 - 4*x + 3 = 0’) % kết quả là
x=
[ 1]
[ 3]
y=
[ 1]
[ -3/2]
»S = solve(‘x^2*y^2 -2*x- 1=0’,’x^2 - y^2 - 1=0’) % sẽ trả về cấu trúc
S=
x: [8x1 sym]
y: [8x1 sym]
»[u,v] = solve(‘a*u^2 + v^2 = 0’,’u - v = 1’) % sẽ xem ‘a’ là tham số và hai biến u và v.
»S = solve(‘a*u^2 + v^2’,’u - v = 1’,’a,u’) % sẽ xem ‘v’ là tham số, kết quả là S.a và S.u.
»[a,u,v] = solve(‘a*u^2 + v^2’,’u - v = 1’,’a^2 - 5*a + 6’)
% có ba phương trình cho ba biến a, u và v.
»syms a b c x
»S = a*x^2 + b*x + c;
»solve(S)
ans =
[1/2/a*(–b+(b^2–4*a*c)^(1/2))]
[1/2/a*(–b–(b^2–4*a*c)^(1/2))]
»b = solve(S,b)
b=
–(a*x^2+c)/x
Xác định nghiệm và vẽ
»syms x
»s = solve(tan(x)+sin(x)–2);

69
Giáo trình MATLAB - SIMULINK
»X = double(s)
X=
0.8863
–1.8979
2.0766– 1.5151i
2.0766+ 1.5151i
»ezplot(tan(x)+sin(x)–2)
»hold on
»w = –2*pi:pi/2:2*pi;
»plot(w,0*w,’r-.’);
% vẽ điểm trên màn hình
»RX = [X(1), X(2)]
»plot(RX, 0*RX,’gO’)
»text(–1.8,–0.4,’X(2)’)
»text(1.0,–0.4,’X(1)’)
Ví dụ: Tiếp ví dụ trên
»f = cos(2*x) + sin(x) – 1;
»s = solve(f);
% plotting s and f, using
»ezplot(f)
»hold on;
»plot(w,0*w,’r-.’)
»plot(double(s),0*double(s),’gO’)
4.6 Giải phương trình vi phân và hệ phương trình vi phân
4.6.1 Phương pháp số:
Dùng các hàm ODE45, ODE23, ODE113
1. ode45 giải phương trình và hệ phương trình vi phân bậc cao.
Cú pháp:
[T,Y] = ode45(ODEFUN,TSPAN,Y0)
[T,Y] = ode45(ODEFUN,TSPAN,Y0,OPTIONS)
[T,Y] = ode45(ODEFUN,TSPAN,Y0,OPTIONS,P1,P2...)

70
Giáo trình MATLAB - SIMULINK
Trong đó:
TSPAN = [T0 TFINAL] khoảng lấy tích phân của phương trình vi phân y' = f(t,y)
hoặc hệ phương trình vi phân M(t,y)*y' = f(t,y) với M là ma trận. TSPAN = [T0 T1 ...
TFINAL] có thể là véc tơ (luôn tăng hoặc luôn giảm).
Y0 giá trị khởi đầu (tại t = T0)
ODEFUN(T,Y) xâu tên hàm trả về véc tơ cột f(t,y0). Nếu hàm .m file thì thêm @.
Y mảng lưu kết quả (theo hàng)
T véc tơ cột chỉ các thời điểm t.
OPTIONS các giá trị tình trạng (xem thêm hàm ODESET). Giá trị mặc định gồm
sai lệch liên kết 'RelTol' = 1e-3 và véc tơ sai lệch tuyệt đối 'AbsTol' = 1e-6 (tất cả các
thành phần). Nếu không thì OPTIONS=[].
P1, P2, ... các tham số của hàm ODEFUN(T,Y,P1,P2,...) nếu có.
Ví dụ: »[t,y]=ode45(@vdp1,[0 20],[2 0]);
»plot(t,y(:,1));
2. ode23 giải các phương trình và hệ phương trình vi phân.
3. ode113 giải các phương trình và hệ phương trình vi phân.
4.6.2 Sử dụng symbolic **
Dùng hàm dsolve trong toolbox symbolic
Cú pháp:
dsolve('eqn1','eqn2', ...)
Trong đó:
‘eqn1’,’eqn2’,... các phương trình vi phân.
Cách biểu diễn hàm dựa trên cú pháp D:
Dy biểu diễn đạo hàm bậc 1 của hàm y (mặc nhiên)
D2y, D3y, ..., DNy đạo hàm bậc 2,3, ..., N của hàm y (không được dùng t)
Vậy ký hiệu: D2y biểu diễn của d 2 y//dt 2; Dy là biểu diễn của dy/dt
Biến độc lập mặc nhiên là 't'. Nếu muốn thay đổi biến độc lập phải thêm tên
biến đó vào cuối cùng của biểu diễn hàm (không được dùng tên D).
Các điều kiện đầu cũng ở dạng phương trình như là 'y(a)=b' hoặc 'Dy(a) = b' với
y là biến độc lập và a, b là các hằng số.
Nếu thiếu điều kiện đầu thì các hằng số tích phân mặc nhiên thêm vào C1, C2, ...
Với hệ phương trình vi phân, kết quả (nghiệm) là một cấu trúc.

71
Giáo trình MATLAB - SIMULINK
Ví dụ 1: »dsolve('Dx = -a*x')
ans =
exp(-a*t)*C1
»x = dsolve('Dx = -a*x','x(0) = 1','s')
x=
exp(-a*s)
»y = dsolve('(Dy)^2 + y^2 = 1','y(0) = 0')
y=
[ sin(t)]
[ -sin(t)]
»S=dsolve('Df=f+g','Dg=-f+g','f(0)=1','g(0)=2') % trả về cấu trúc S
S.f =
exp(t)*cos(t)+2*exp(t)*sin(t)
S.g =
-exp(t)*sin(t)+2*exp(t)*cos(t)
»Y = dsolve('Dy = y^2*(1-y)') % Kết quả
Y=
t+1/y-log(y)+log(-1+y)+C1=0
Ví dụ 2: phương trình vi phân bậc 1:
»y = dsolve('Dy= y0*y') % giai phuong trinh dy/dt=y0*y %ket qua
y=
C1*exp(y0*t)
Chú ý: phương trình sau cho kết quả khác
»y = dsolve(‘Dyt= y0*y’) % giai phuong trinh dy/dt=y0*y % ket qua
y=
y0*y*t+C1
Ví dụ 3: giải hệ phương trình vi phân đơn giản
»[u,v] = dsolve('Du = v', 'Dv = u')
u=
1/2*C1*exp(t)-1/2*C1*exp(-t)+1/2*C2*exp(-t)+1/2*C2*exp(t)
v=
1/2*C1*exp(-t)+1/2*C1*exp(t)+1/2*C2*exp(t)-1/2*C2*exp(-t)

72
Giáo trình MATLAB - SIMULINK
Ví dụ 4: hệ pt vi phân 3 ẩn với kết quả dạng cấu trúc với 3 ẩn f, g, h
»S = dsolve('Df=g','Dg=h','Dh=-f')
S=
f: [1x1 sym]
g: [1x1 sym]
h: [1x1 sym]
Để hiển thị giá trị lệnh dạng cấu trúc, ta dùng cách gọi S.f để biểu diễn nghiệm
f, tương tự với các nghiệm S.g, S.h.
»S.h
ans =
-1/3*C1*3^(1/2)*exp(1/2*t)*sin(1/2*t*3^(1/2))-
1/3*C1*exp(1/2*t)*cos(1/2*t*3^(1/2))+1/3*C1*exp(-t)-
1/3*C2*3^(1/2)*exp(1/2*t)*sin(1/2*t*3^(1/2))+1/3*C2*exp(1/2*t)*cos(1/2*t*3^(1/2))-
1/3*C2*exp(-t)+1/3*C3*exp(-t)+2/3*C3*exp(1/2*t)*cos(1/2*t*3^(1/2))
4.7 Các ví dụ ứng dụng **
Giải phương trình vi phân với điều kiện đầu
d3u/dx3 =u
u(0) = 1, u'(0) = –1, u''(0) = pi
Ta có câu lệnh:
»u = dsolve('D3u=u','u(0)=1','Du(0)=–1','D2u(0) = pi','x')
Giải hệ phương trình vi phân có điều kiện đầu
[f,g] = dsolve('Df=3*f+4*g, Dg =–4*f+3*g', 'f(0) = 0, g(0) = 1')
dsolve('Df = f + sin(t)', 'f(pi/2) = 0')
dsolve('D2y = -a^2*y', 'y(0) = 1, Dy(pi/a) = 0')
S = dsolve('Dx = y', 'Dy = -x', 'x(0)=0', 'y(0)=1')
S = dsolve('Du=v, Dv=w, Dw=-u','u(0)=0, v(0)=0, w(0)=1')
w = dsolve('D3w = -w','w(0)=1, Dw(0)=0, D2w(0)=0')
y = dsolve('D2y = sin(y)'); pretty(y)

73
Giáo trình MATLAB - SIMULINK

CHƯƠNG 5. LẬP TRÌNH TRỰC QUAN GIAO DIỆN NGƯỜI DÙNG


(GUI: GRAPHIC USER INTERFACE)
GUI là công cụ để lập các giao diện đồ hoạ người dùng trực quan “VISUAL”,
giúp lập trình viên tạo các nút bấm, Menu điều khiển chương trình theo hướng sự kiện.
5.1 Cách xây dựng các nút ấn và menu
5.1.1 Phương pháp sử dụng UIMENU và UICONTROL
Viết một m-file trong đó sử dụng các lệnh uimenu để tạo ra menu và lệnh
uicontrol để tạo ra các nút ấn cũng như các đối tượng giao diện khác. Cách này có
nhược điểm là người sử dụng phải tốn nhiều công sức để truyền các thuộc tính đối
tượng bằng dòng lệnh nên yêu cầu lập trình viên phải thành thạo.
Ví dụ: Muốn tạo ra nút bấm có tên plot với lệnh Callback là plot(x,y)
uicontrol('Style','pushbutton', ...
'String','Plot', ...
'Callback','plot(x,y)', ...
'Units','point', ...
'Position',[50 65 75 35])
1. Lệnh uicontrol tạo giao diện điều khiển người dùng.
Cú pháp:
uicontrol('PropertyName1',value1,'PropertyName2,'value2,...) tạo giao diện điều
khiển người dùng trong cửa sổ hình vẽ hiện tại và trả về một handle.
uicontrol(FIG,...) tạo giao diện điều khiển người dùng trong cửa sổ hình vẽ
(FIG).
Các properties có thể thiết lập cặp tham số PropertyName/PropertyValue cho đối
tượng hoặc được thay đổi sau đó bằng lệnh SET.
Lệnh get(H) lấy danh sách và giá trị các thuộc tính của đối tượng (H) trong
UICONTROL.
Lệnh set(H) đặt danh sách và giá trị các thuộc tính của đối tượng (H) trong
UICONTROL.
2. Lệnh uimenu tạo giao diện menu người dùng.
Cú pháp:
uimenu('PropertyName1',value1,'PropertyName2',value2,...) tạo một menu trên
thanh menu bar tại đỉnh trên của cửa sổ hiện tại, và trả về handle.

74
Giáo trình MATLAB - SIMULINK
uimenu(H,...) tạo một đối tượng menu mới với H là đối tượng cha ‘Parent’. H có
thể là figure handle, menu handle, hoặc context menu handle. Nếu H là figure handle,
UIMENU tạo menu trên menu bar tại đỉnh của cửa sổ. Nếu H là handle menu trên menu
bar, một menu item mới đổ xuống trên menu bar. Nếu H là context menu, sẽ tạo ra menu
item trên context menu.
Các properties có thể thiết lập cặp tham số PropertyName/PropertyValue cho đối
tượng hoặc được thay đổi sau đó bằng lệnh SET.
Lệnh get(H) lấy danh sách và giá trị các thuộc tính của đối tượng (H) trong
UIMENU.
Lệnh set(H) đặt danh sách và giá trị các thuộc tính của đối tượng (H) trong
UIMENU.
5.1.2 Phương pháp sử dụng GUIDE (GUI design)
Sử dụng tiện ích có sẵn mà MATLAB cung cấp. Đó là chương trình GUIDE
(GUI design). GUIDE cung cấp cho lập trình viên một giao diện trực quan gồm các nút
chức năng (ví dụ: nút bấm Push, văn bản tĩnh text, dữ liệu nhập edit, nút chọn radio,
nút kiểm check, ... như hình 5.1) và giao diện Menu Editor trên cửa sổ figure để thiết
kế giao diện vào ra như hình 5.4 và từ đó tạo các cấu trúc chương trình, gọi các lệnh,
hàm (chương trình con) giải quyết các bài toán đặt ra theo yêu cầu. Sau khi tạo xong,
ngôn ngữ sẽ tự động sinh ra mã nguồn (m-file) tương ứng với từng thao tác (như ta viết
lệnh theo cách 1). Ngoài ra, phương pháp còn tạo ra một file *.mat để lưu cấu hình giao
diện.
Để thực hiện, tại dấu nhắc lệnh MATLAB gõ lệnh:
»guide % ta có các cửa sổ giao diện như sau:

nút công cụ
soạn và đặt
thuộc tính

Danh sách các


figure và tình trạng
activated,controlled

Các đối tượng tạo


giao diện vào - ra
trong cửa số figure

75
Giáo trình MATLAB - SIMULINK
Hình 5.1 Cửa sổ giao diện người dùng trực quan
Trong cửa sổ này có các công cụ để thiết kế menu, các nút bấm, soạn và đặt
thuộc tính, canh lề các nút bấm, đặt chế độ kiểm tra trực tiếp công việc thiết kế, bổ
sung thêm các figure vào thiết kế, ...
- Cửa sổ Graphics Property Editor soạn thảo các thuộc tính các đối tượng như hình
5.2.

Danh sách
đối tượng

kiểu các giá


thuộc tính trị

Các thuộc
tính

Hình 5.2 Cửa sổ soạn thảo thuộc tính

Cửa sổ Guide Callback Editor soạn thảo các hàm/ thực hiện các lệnh như hình 5.3.

Kiểu đối
tượng

Vùng soạn,
sửa Callback

Hiển thị các


kiểu đối
tượng

Hình 5.3 Cửa sổ soạn thảo Callback

76
Giáo trình MATLAB - SIMULINK

- Cửa sổ Guide Menu Editor soạn thảo các hàm hoặc thực hiện các lệnh như hình 5.3.

Liệt kê các đối


tượng (Object)

Hình 5.4 Cửa sổ soạn thảo Menu


5.2 Cách lập trình trên giao diện GUI
Giả sử ta cần lập trình giao diện như hình 5.5 với nút PLOT1 vẽ đặc tính đồ thị áp
sin tuỳ thuộc vào tuỳ chọn trong poupmeu là 1 pha, 2 pha hay 3 pha. Các bước như sau:
Bước1: Trên cửa sổ figure mới, tạo các đối tượng bằng phương pháp kéo và thả.
Gán các thuộc tính như sau:
• PLOT1: có thuộc tính String: ‘PLOT1’ , Tag : ‘plot1’
Callback: (Đoạn chương trình sau)
x=linspace(0,3*pi,1000);
y1=sin(x);
y2=sin(x-2*pi/3);
y3=sin(x+2*pi/3);
% Lay thuoc tinh chon trong popupmenu
handle_chon=findobj(gcbf,'Tag','chon');
% lay thuoc tinh Value cua chon
hang=get(handle_chon,'Value')
% ve do thi theo tinh huong
grid on
if hang==1
plot(x,y1,'b-')

77
Giáo trình MATLAB - SIMULINK

elseif hang==2
plot(x,y1,'b-',x,y2,'r-.')
elseif hang==3
plot(x,y1,'b-',x,y2,'r-.',x,y3,'k:')
end
• khối ‘xoa do thi’ có:
‘Tag’ : ‘xoá’
‘String’ : ‘xoa do thi’
‘Callback’ : ‘cla’

• khối ‘close’ có:


‘String’: ‘close’
‘Callback’ : ‘close’
• Khối poupmenu có: Hình 5.5 giao diện lập trình vẽ đồ thị.
‘Tag’ : ‘chon’
‘String’ : ‘1 pha|2 pha|3 pha’
Bước 2: Lưu chương trình (Save figure), đặt chương trình ở chế độ Active để chạy
kiểm tra kết quả. Nếu bị lỗi thì đặt lại ở chế độ Controlled để chỉnh sửa.
Nếu muồn sửa đổi chương trình có sẵn, thì gọi tên chương trình để chạy, sau đó đặt
nó ở chế độ Controlled trong cửa sổ GUIDE để chỉnh sửa.
Chú ý: Để đảm bảo xem được mã Callback, nên đặt mỗi Callback là một hàm hay
script dưới dạng *.m file. Ngoài ra, người ta hay dùng phương thức lập trình sự kiện để
truyền tham số cho chương trình thông qua lời gọi hàm Callback ứng với mỗi sự kiện.
5.3 Phương thức lập trình sự kiện thông qua truyền tham số “Action”
5.3.1 Khái niệm
VD: ta cần lập chương trình với yêu cầu sau (hình 5.6):
function mygui(action)
switch(action)
case 'load',
......
case 'plot'
.......
case 'close',
close(gcbf)
end

78
Giáo trình MATLAB - SIMULINK

Hình 5.6 mô tả phương pháp lập trình sự kiện.


Với phương thức trên, ta cần mở cửa sổ soạn thảo và sửa lại đầu chương trình
đoạn mã trên. Với các lệnh cho mỗi Callback được đặt vào giữa các lệnh CASE ... (nên
dùng hàm hay script cho mỗi đoạn chương trình nếu chương trình dài). Đây là phương
thức lập trình sáng sủa nhất và tiện lợi nhất.
• Ghi chú quan trọng
Để tương tác giữa các đối tượng, ta cần đặt và lấy thuộc tính các đối tượng. Để
thực hiện ta dùng các hàm sau:
1. Lấy thuộc tính đối tượng dùng hàm get theo cú pháp
y = get(<biến handle>,’Tên thuộc tính’): Trả về giá trị thuộc tính cho biến y.
Để lấy biến handle, ta dung hàm findobj có cấu trúc sau:
Handle_bien = findobj(gcbf,’ten thuoc tinh’,’gia tri thuoc tinh’) : hàm này tìm một
đối tượng có ‘ten thuoc tinh’ ứng với ‘gia tri thuoc tính’ chỉ ra và kết quả trả về biến
Handle quản lý đối tượng
Ví dụ 1: »handle_chon = findobj(gcbf,'Tag','chon');
»hang = get(handle_chon,'Value')
Ví dụ trên tìm đối tượng có thuộc tính ’Tag’=’chon’, nhờ đó ta mới lấy được
thuộc tính ‘Value’ của nó.
Ví dụ 2: lấy thuộc tính string của đối tượng EditText1
»EditHandle = findobj(gcbf,'Tag','EditText1');
»ZString = get(EditHandle,'String');
2. Đặt thuộc tính cho các đối tượng: dùng hàm SET
Cú pháp:
set(<biến handle>,’tên thuộc tính’,’giá trị thuộc tính’) : gán thuộc tính đổi tượng
được quản lý bởi biến Handle cho một giá trị.
Ví dụ: »EditHandle = findobj(gcbf,'Tag','EditText1');
»str = ’1 pha|2 pha|3 pha’;
»set(EditHandle,'String',str);
5.3.2 Một số hàm thường dùng quản lý đối tượng
1. gcf lấy giá trị handle của figure hiện hành
2. gcbo lấy giá trị handle của object Callback hiện hành

79
Giáo trình MATLAB - SIMULINK
3. gcbf lấy giá trị handle callback của figure hiện hành
4. gca lấy giá trị handle của đồ thị (axes) hiện hành
5. gco lấy giá trị handle của object hiện hành
5.4 Ví dụ ứng dụng
• Mã chương trình *.m file cho chương trình ở ví dụ trên khi viết chương trình theo
kiểu dùng tham số action
function fig = actiongui(action)
% This is the machine-generated representation of a Handle Graphics object
% and its children. Note that handle values may change when these objects
% are re-created. This may cause problems with any callbacks written to
% depend on the value of the handle at the time the object was saved.
% This problem is solved by saving the output as a FIG-file.
%
% To reopen this object, just type the name of the M-file at the MATLAB
% prompt. The M-file and its associated MAT-file must be on your path.
%
% NOTE: certain newer features in MATLAB may not have been saved in this
% M-file due to limitations of this format, which has been superseded by
% FIG-files. Figures which have been annotated using the plot editor tools
% are incompatible with the M-file/MAT-file format, and should be saved as
% FIG-files.

load actiongui

if nargin < 1,
action = 'initialize';
end;
if strcmp(action,'initialize') ;
h0 = figure('Color',[0.8 0.8 0.8], ...
'Colormap',mat0, ...
'FileName','D:\MATLABR11\work\actiongui.m', ...
'PaperPosition',[18 180 576 432], ...
'PaperUnits','points', ...
'Position',[255 39 508 420], ...

80
Giáo trình MATLAB - SIMULINK
'Tag','Fig1', ...
'ToolBar','none');
h1 = uimenu('Parent',h0, ...
'Label','Plot', ...
'Tag','Plot1');
h2 = uimenu('Parent',h1, ...
'Label','plot1', ...
'Tag','Plotplot11');
h2 = uimenu('Parent',h1, ...
'Callback',mat1, ...
'Label','plot2', ...
'Tag','Plotplot21');
h1 = uicontrol('Parent',h0, ...
'Units','points', ...
'BackgroundColor',[1 0.501960784313725 1], ...
'Callback','actiongui plotting', ...
'ListboxTop',0, ...
'Position',[288 246 45 21.75], ...
'String','PLOT1', ...
'Tag','plot1');
h1 = axes('Parent',h0, ...
'Box','on', ...
'CameraUpVector',[0 1 0], ...
'CameraUpVectorMode','manual', ...
'Color',[1 1 1], ...
'ColorOrder',mat2, ...
'NextPlot','add', ...
'Position',mat3, ...
'Tag','Axes1', ...
'XColor',[0 0 0], ...
'XGrid','on', ...
'YColor',[0 0 0], ...
'YGrid','on', ...
'ZColor',[0 0 0], ...
'ZGrid','on');

81
Giáo trình MATLAB - SIMULINK
h2 = text('Parent',h1, ...
'Color',[0 0 0], ...
'HandleVisibility','off', ...
'HorizontalAlignment','center', ...
'Position',[0.4983606557377049 -0.06760563380281681 9.160254037844386], ...
'Tag','Axes1Text4', ...
'VerticalAlignment','cap');
set(get(h2,'Parent'),'XLabel',h2);

h2 = text('Parent',h1, ...
'Color',[0 0 0], ...
'HandleVisibility','off', ...
'HorizontalAlignment','center', ...
'Position',[-0.09508196721311477 0.4957746478873241 9.160254037844386], ...
'Rotation',90, ...
'Tag','Axes1Text3', ...
'VerticalAlignment','baseline');
set(get(h2,'Parent'),'YLabel',h2);

h2 = text('Parent',h1, ...
'Color',[0 0 0], ...
'HandleVisibility','off', ...
'HorizontalAlignment','right', ...
'Position',[-0.1278688524590164 1.047887323943662 9.160254037844386], ...
'Tag','Axes1Text2', ...
'Visible','off');
set(get(h2,'Parent'),'ZLabel',h2);

h2 = text('Parent',h1, ...
'Color',[0 0 0], ...
'HandleVisibility','off', ...
'HorizontalAlignment','center', ...
'Position',[0.4983606557377049 1.019718309859155 9.160254037844386], ...
'Tag','Axes1Text1', ...
'VerticalAlignment','bottom');

82
Giáo trình MATLAB - SIMULINK
set(get(h2,'Parent'),'Title',h2);

h1 = uicontrol('Parent',h0, ...
'Units','points', ...
'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ...
'ListboxTop',0, ...
'Position',[291 183 45 20.25], ...
'String',['1 pha';'2 pha';'3pha ';' '], ...
'Style','popupmenu', ...
'Tag','chon', ...
'Value',3);
h1 = uicontrol('Parent',h0, ...
'Units','points', ...
'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ...
'ListboxTop',0, ...
'Position',[291 206.25 45 15], ...
'String','Popupmenu', ...
'Style','text', ...
'Tag','StaticText1');
h1 = uicontrol('Parent',h0, ...
'Units','points', ...
'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ...
'Callback','actiongui dong', ...
'ListboxTop',0, ...
'Position',[299.25 36.75 45.75 16.5], ...
'String','close', ...
'Tag','Pushbutton3');
h1 = uicontrol('Parent',h0, ...
'Units','points', ...
'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ...
'Callback','actiongui xoa', ...
'ListboxTop',0, ...
'Position',[298.5 76.5 51.75 21.75], ...
'String','xoa do thi', ...
'Tag','xoa');

83
Giáo trình MATLAB - SIMULINK

%set(h0, 'Visible','on');
else
switch action
case 'dong'
close(gcbf)
case 'xoa'
cla
case 'plotting'
x=linspace(0,3*pi,1000);
y1=sin(x);
y2=sin(x-2*pi/3);
y3=sin(x+2*pi/3);
% Lay thuoc tinh chon trong popupmenu
handle_chon=findobj(gcbf,'Tag','chon');
% lay thuoc tinh Value cua chon
hang=get(handle_chon,'Value')
% ve do thi theo tinh huong
grid on
if hang==1 plot(x,y1,'b-')
elseif hang==2 plot(x,y1,'b-',x,y2,'r-.')
elseif hang==3 plot(x,y1,'b-',x,y2,'r-.',x,y3,'k:')
end
end
end

84
Giáo trình MATLAB - SIMULINK

CHƯƠNG 6. MÔ PHỎNG, THIẾT KẾ TRỰC QUAN (SIMULINK)


6.1 Tổng quan về SIMULINK
SIMULINK (Simulation and Link): là một tiện ích quan trọng của MATLAB giúp
cho người sử dụng mô phỏng, phân tích và thiết kế các hệ thống thực tế cho các đối
tượng liên tục, gián đoạn tuyến tính hay phi tuyến và cả các hệ sự kiện logic (ví dụ như
một quá trình sản xuất)...
Nguyên tắc làm việc chung của SIMULINK là xây dựng mô hình sơ đồ khối từ
các khối mô đun chức năng tạo sẵn bằng thao tác “nhấn” và “thả” chuột các khối vào
cửa sổ thiết kế, sau đó kết nối các khối và khai báo tham số cho phù hợp.
Bước tiếp theo là chạy kết quả, phân tích, hiệu chỉnh để có kết quả mong muốn.
SIMULINK cho phép giao diện với MATLAB thông qua một số khối. Các kết quả trả
lại trong không gian Workspace để chương trình MATLAB lấy và xử lý. Trong
SIMULINK còn cho phép đưa các dòng lệnh MATLAB hoặc các biểu thức toán học
vào ngay trong sơ đồ SIMULINK.
Như vậy công cụ SIMULINK giúp cho người lập trình tiết kiệm nhiều thời gian
và công sức vì nó tự động liên kết, biến đổi để chuyển thành các hệ phương trình vi
phân tính toán ngầm trong môi trường MATLAB mà người lập trình không cần quan
tâm. Vì vậy, để mô phỏng một quá trình thực tế có thể tính toán bằng hai cách: hoặc
viết các dãy lệnh MATLAB (*. m file) hay lập mô hình tính toán trong SIMULINK.
Cách đầu có ưu điểm là chạy nhanh nhưng vất vả cho người lập trình nhất là đối với
các hệ phức tạp. Cách sau có ưu điểm là rất trực quan sinh động, dễ tư duy tiện lợi,
nhất là đối với hệ thống lớn. Nhược điểm là chạy chậm. Tuy nhiên, theo quan niệm
lập trình nâng cao, nên kết hợp hai phần trên trong một dự án (project) để thực hiện
nhiều công việc khác nhau.
6.1.1 Khởi động SIMULINK
Khởi động SIMULINK hiển thị thư viện các nhóm chức năng bằng cách gõ lệnh:
»similink3

85
Giáo trình MATLAB - SIMULINK
Hình 1. Thư viện SIMULINK 3
Khởi động SIMULINK hiển thị thư viện chi tiết bằng cách gõ lệnh:
»similink
6.1.2 Giới thiệu thư viện SIMULINK

Cửa sổ tìm kiếm: nhập tên khối


và enter. Chương trình sẽ tìm
khối cần tìm.

Kích chuột vào dấu + mỗi khối


sẽ liệt kê các phần tử cần sử
dụng

Hình 2. Thư viện các thành phần SIMULINK

các khối để mô
phỏng hệ liên
t ục

Khối khuyếch
đại

các khối để mô khối logic AND,


phỏng hệ gián OR, NAND,...
đoạn

Hình 3. Thư viện chi tiết SIMULINK

86
Giáo trình MATLAB - SIMULINK

tạo ra hệ con bao


gồm các khối.
Một hệ thống các khối dành
lớn được xây cho quan sát
dựng bằng nhiều
đặc tính ra
hệ thống con

Thư viện simulink bổ sung

87
Giáo trình MATLAB - SIMULINK

Sources: gồm các khối tạo ra các dạng


nguồn phát khác nhau

tạo ra các giá trị thời gian theo bước lấy mẫu

tạo ra các nguồn xung chuẩn khác nhau

Tạo ra tín hiệu step (hàm 1(t)) dùng làm tín hiệu đặt
trong các hệ điều khiển tự động

Thư viện NCD blocksets : gồm 3 khối phục vụ thiết kế hệ phi tuyến

88
Giáo trình MATLAB - SIMULINK

Thư viện Power system Blockset

*. Giới thiệu chi tiết một số khối thường dùng


- Khối không gian trạng thái

- khối hàm truyền

các khối hệ gián đoạn

- Các khối tạo hàm

89
Giáo trình MATLAB - SIMULINK

- Khối hàm trong MATLAB

- Một số khối trong Power System Blockset

6.2 Cách xây dựng một chương trình SIMULINK


Xét một số ví dụ sau:
Ví dụ 1: xây dựng mô hình hệ điều khiển PID tương tự.

Controller Clock1
1
PID
Step 2 +2s+50

XY Graph
®èi t­ îng
Gain

1
Scope

Mux simout
Clock
To Workspace

90
Giáo trình MATLAB - SIMULINK

Trong ví dụ trên, sử dụng khối PID là khối điều khiển theo luật PID dạng hàm
truyền: WPID(s)= P+I/s+D.s, đó là hàm truyền của đối tượng là khối Transfer Fcn.
Các bước thực hiện như sau:
Bước 1: Rê và thả các khối cần xây dựng mô hình từ các thư viện SIMULINK.
Nếu có các khối giống nhau cần xây dựng trong một mô hình thì dùng lệnh
COPY và PAST (dán) để tạo nhanh các khối, có thể copy từ một mô hình khác.
Có thể sử dụng Menu Format của SIMULINK để định dạng mô hình như: Chọn
lại font, màu sắc, nét vẽ, quay khối (rotate), ...
Bước 2: Nhập thông số hợp lý cho các khối bằng cách kích đúp chuột lên đối tượng
khối sau đó nhập các tham số từ cửa sổ hội thoại.
Bước 3: Chú thích các dòng text lên đối tượng như hình trên.
Bước 4: Khai báo các lựa chọn tham số trong Menu Simulation -> parametter... để
chọn các tham số tính toán mô phỏng. (xem hình trang sau).
Bước 5: Chạy chương trình bằng cách chọn nút Run trên thanh công cụ hoặc chọn
Menu Simulation ->Run
Quan sát kết quả đánh giá và hiệu chỉnh tham số sau mỗi lần chạy.
Các chú ý:
+ Muốn vẽ nhiều đồ thị trên một trục toạ độ, phải sử dụng khối ghép kênh (MUX)
trước khi cho tín hiệu đến bộ quan sát. Nếu dùng khối To Workspace thì sau khi chạy
xong ta nhận được biến out là biến toàn cục trong không gian Workspace của
MATLAB. (biến out sẽ là biến toàn cục trong bộ nhớ). Lúc này để vẽ được nhiều đồ
thị trên một hệ toạ độ, ta dùng hàm plot như sau:
plot(out(:,1), out(:,2),out(:,1), out(:,3)...)
sẽ vẽ nhiều đồ thị biến đổi theo thời gian trên chung 1 trục toạ độ.
+ Chương trình chạy đến hết thời gian (stop time) thì tự động ngừng. Để chương
trình dừng trước khi kết thúc, ấn nút STOP trên thanh công cụ (hoặc Menu Simulation
-> Stop). Có thể ấn nút tạm dừng (PAUSE) để chương trình tạm nghỉ và sau đó chạy
lại tiếp tục từ bước trước khi dừng.
+ Đối với hệ thống lớn, có thể Module hoá chương trình bằng cách sử dụng khối
SUBSYSTEM để chứa nhóm khối chức năng lại với nhau và hệ thống sẽ được xây
dựng từ nhiều hệ thống con hợp thành (xem phần sau).

91
Giáo trình MATLAB - SIMULINK

Cửa sổ Parameter trước khi mô phỏng

Ví dụ: Mô phỏng một hệ thống điều khiển tốc độ động cơ điện một chiều. Với bộ
điều khiển PID theo luật PI được tổng hợp theo phương pháp module tối ưu. Hãy thành
lập mô hình và mô phỏng đánh giá kết quả

Tai Ic
Cu
Ic
E
1
w
0.625 1
1
88000000
PID 0.125s+1 I s
U ®i (s+400)(s+10000) Ud Gain Integrator
R I:PI p­  ®éng c¬
chØnh l­ ­
Ui 0.61
0.002s+1
dßng ®iÖn
ph¶n håi dßng
C lock
M ux out
To W orkspace1

92
Giáo trình MATLAB - SIMULINK

6.3 Cách tạo ra thư viện riêng (một subsystem) từ các khối đã có
Ý nghĩa cách làm này là tạo ra một khối con trên cơ sở các khối đã có để phân hệ
thống lớn thành nhiều hệ thống con (subsystem). Nếu một khối con được sử dụng
nhiều lần trong các chương trình thì ta có thể đóng gói khối con, tức là che mặt nạ cho
nó (mask subsystem) để biến nó thành một khối chức năng như những khối đã được tạo
ra trong SIMULINK. Trong thư viện SIMULINK, có rất nhiều các khối đã tạo từ những
khối cơ bản. Ví dụ: khối PID controller được tạo ra từ các khối: Gian, Derivative,
Integrator, Sum.
P

Proportional

I
1 1
s
e(t) u(t)
Integral Sum

D du/dt

D Derivative

Để xem cấu trúc bên trong của subsystem đã che mặt nạ (masked), ta làm như
sau:
- Chọn khối cần xem cấu trúc bên trong
- Chọn menu Edit ->Look under Mask để mở cửa sổ simulink cho mô hình của
subsystem.
(có thể ấn nút phải chuột trên đối tượng để chọn chế độ trên)
6.4 Ví dụ ứng dụng **
Ta xét ví dụ sau đây, tạo ra một khối có tên là PID controller làm chức năng một
khối tích hợp là bộ điều khiển theo luật PID. Các trình tự tạo ra khối chức năng theo
trình tự sau:
Bước 1: Kéo và thả một khối Subsystem trong cửa số SIMULINK, đặt tên khối
này là PID Controller
Bước 2: Xây dựng mô hình bộ điều khiển PID tổng quát với hàm truyền dạng:
WPID(s)= P+I/s+D.s
Có cấu trúc sơ đồ như hình vẽ. Trong đó 3 thông số P, I, D là 3 tham số cần nhập vào
Bước 3: đóng gói hệ con này thành một khối riêng bằng cách: chọn menu Edit ->
Mask subsystem, xuất hiện một cửa sổ lựa chọn sau gồm 3 trang:
Trang 1: tạo ra biểu tượng (Icon)

93
Giáo trình MATLAB - SIMULINK
cho khối bằng cách dùng các lệnh vẽ trong khung Drawing Commands
Ví dụ: disp(‘PID’) : hiển thị nhãn trên biểu tượng khối.
Trang 2: Nhập và khai báo các biến. (Initialization)
Trang 3: Mô tả chức năng khối (Documetation)
Chức năng khối được mô tả bằng các dòng Text vào Block description.
Block Help: các mô tả khi ấn nút help nhập thông số khối.
Trong ví dụ trên, ta có 3 tham số cấn khai báo (P, I, D). Lần lượt khai báo từng
tham số trong các ô: Prompt và ô Variable. Sau khi khai báo xong một biến, chọn nút
Add để tạo thêm biến mới.
Cuối cùng, chọn OK để kết thúc. Khi đó khối con trở thành một khối thư viện
chức năng với các tham số cần nhập như hình bên phải (khi kích đúp chuột vào khối
này)

Khảo sát các mô hình hệ thống trên cơ sở các hệ thống con thông qua ví dụ sau:
VD: hệ thống điều khiển tốc độ một chiều dùng chỉnh lưu Thyristor.

94
Giáo trình MATLAB - SIMULINK

DC motor equivalent circuit

A
i
K +
-
B
i1
C
A
pulses

synchronization signals 6 - pulse


+
Converter v
-
+
v Va
- Va(V)
AC
vac
+
v BA
-
Pout
vba
CB
+
v
-
vcb CTL

Pulse_generator
Va Vb Vc
PI curent regulator
Mux

.6 Ia(A)
& Reference
1
5
s
Reference
5

Three-phase thyristor converter ?


Double click on the More Info button (?) for details
More Info

Trong đó: khối hệ con là 6-pulse Converter và Pulse_ Generator là hệ con được xây
dựng sẵn trong thư viện Power System Blocksets. Có thể xem cấu trúc bên trong của nó
bằng cách xem chế độ Look under Mask. Khối 6-pulse converter là subsystem có cấu
trúc như sau: 1
K

Hãy thành lập mô hình này và chạy quan sát kết quả?
m
k

m
k

th1
m
k

th3
th5
a

Demux

Demux1
Selector1

1 2 3
4
A B C
pulses
m

m
k

k
m
k

th4 th6 th2


a

g
a

Demux

Demux2
Selector
2
A

95
Giáo trình MATLAB - SIMULINK

Ví dụ: phân tích quá trình quá độ hệ thống điện. Hãy thành lập mô hình và chạy mô
phỏng lấy kết quả. Cách xây dựng một mô hình như sau:

+
v
-
ub2
UB2

7 3 5 kV U_Cs
E q u iv a le n t i2
i I1
+ i 3 1 5 kV
- +
-
L in e 1 L in e 1 E q u iv a le n t
S e rie s i1 i2
1 5 0 km 1 5 0 km 1
C o m p e n sa tio n 1
B1 2
c
V s1 1 1 0 M va r B2
I_ S A R B re a ke r
1 1 0 M v a r1

F a u lt 250M VA
T im in g

96
Giáo trình MATLAB - SIMULINK

TÀI LIỆU THAM KHẢO


[1]

97
Giáo trình MATLAB - SIMULINK
MỤC LỤC
CHƯƠNG 0. MỞ ĐẦU.................................................................................................................1
CHƯƠNG 1. TỔNG QUAN VỀ MATLAB..................................................................................2
1.1 Cấu trúc chung và các lĩnh vực ứng dụng của MATLAB:.................................................2
1.2 Giới thiệu SIMULINK và TOOLBOXS trong MATLAB..................................................3
CHƯƠNG 2. CÁC THAO TÁC LẬP TRÌNH TRÊN MATLAB..................................................5
2.1 Các lệnh cơ bản quản lý MATLAB ...................................................................................5
2.1.1 Quản lý lệnh và các hàm...............................................................................................5
2.1.2 Quản lý biến, không gian workspace trên cửa sổ lệnh (Command window)..............6
2.1.3 Làm việc với Files môi trường làm việc.....................................................................6
2.1.4 Các phím thao tác trên cửa số dòng lệnh.......................................................................7
2.2 Dữ liệu, hàm và cấu trúc lệnh trong MATLAB .................................................................7
2.2.1 Khái niệm dữ liệu và biến............................................................................................7
2.2.2 Các ký hiệu và các toán tử.............................................................................................8
2.2.3 Các lệnh tương tác vào/ra (Interactive Input/Output).................................................18
2.2.4 Các lệnh, cấu trúc điều khiển chương trình (Control Flow)......................................20
2.3 Cách viết chương trình và hàm dạng m-files trong MATLAB.........................................22
2.4 Các bài tập ứng dụng **.....................................................................................................23
CHƯƠNG 3. CÁC HÀM TOÁN HỌC THÔNG DỤNG............................................................25
3.1 Các hàm toán học cơ bản....................................................................................................25
3.1.1 Các hàm xử lý số phức:...............................................................................................25
3.1.2 Các hàm lượng giác và hữu tỷ (thực hiện từng phần tử)..........................................25
3.1.3 Các hàm làm tròn số, ...................................................................................................25
3.2 Các hàm xử lý ma trận và vector........................................................................................26
3.3 Các thao tác trên dữ liệu chuỗi (STRING).........................................................................32
3.3.1 Khái niệm.....................................................................................................................32
3.3.2 Các hàm xử lý chuỗi ...................................................................................................32
3.4 Các hàm chuyển đổi dữ liệu..............................................................................................35
3.5 Các thao tác trên dữ liệu cấu trúc.......................................................................................36
3.5.1 Dữ liệu kiểu cấu trúc (Struct).....................................................................................36
3.5.2 Dữ liệu kiểu mảng cấu trúc (Cell Array)...................................................................38
3.6 Các hàm giao tiếp với tệp dữ liệu (FILES).......................................................................39
3.7 Các thao tác vẽ và xử lý đồ thị...........................................................................................46
3.7.1 Các lệnh xử lý trên cửa sổ đồ thị................................................................................46
3.7.2 Lệnh vẽ trong không gian 2-D....................................................................................48
3.7.3 Lệnh vẽ trong không gian 3-D **...............................................................................53
3.8 Các thủ tục in ấn và lưu trữ kết quả.................................................................................54
3.9 Các ví dụ và bài tập **.......................................................................................................55
CHƯƠNG 4. CÁC PHƯƠNG PHÁP TÍNH VÀ ỨNG DỤNG.................................................56
4.1 Khái niệm Symbolic và giới thiệu về Toolbox Symbolic.................................................56
4.1.1 Khái niệm Symbolic.....................................................................................................56
4.1.2 Cách khai báo biến symbolic ......................................................................................56
4.1.3 Các hàm trong Toolbox Symbolic **...........................................................................57
4.2 Đa thức và nội suy..............................................................................................................60
4.2.1 Đa thức.........................................................................................................................60
4.2.2 Nội suy và xấp xỉ.........................................................................................................63
4.3 Tính vi phân (Differentiation)..............................................................................................63
4.3.1 Vi phân số.....................................................................................................................63
4.3.2 Sử dụng symbolic........................................................................................................65
4.4 Tính tích phân (Integration).................................................................................................66
4.4.1 Tích phân số.................................................................................................................66
4.4.2 Sử dụng Symbolic........................................................................................................67

98
Giáo trình MATLAB - SIMULINK
4.5 Giải các phương trình và hệ phương trình........................................................................68
4.5.1 Phương pháp số...........................................................................................................68
4.5.2 Sử dụng Symbolic **...................................................................................................68
4.6 Giải phương trình vi phân và hệ phương trình vi phân ....................................................70
4.6.1 Phương pháp số: .........................................................................................................70
4.6.2 Sử dụng symbolic **...................................................................................................71
4.7 Các ví dụ ứng dụng **.......................................................................................................73
CHƯƠNG 5. LẬP TRÌNH TRỰC QUAN GIAO DIỆN NGƯỜI DÙNG (GUI: GRAPHIC
USER INTERFACE).....................................................................................................................74
5.1 Cách xây dựng các nút ấn và menu....................................................................................74
5.1.1 Phương pháp sử dụng UIMENU và UICONTROL ...................................................74
5.1.2 Phương pháp sử dụng GUIDE (GUI design)..............................................................75
5.2 Cách lập trình trên giao diện GUI......................................................................................77
5.3 Phương thức lập trình sự kiện thông qua truyền tham số “Action”.................................78
5.3.1 Khái niệm.....................................................................................................................78
5.3.2 Một số hàm thường dùng quản lý đối tượng.............................................................79
5.4 Ví dụ ứng dụng ..................................................................................................................80
CHƯƠNG 6. MÔ PHỎNG, THIẾT KẾ TRỰC QUAN (SIMULINK)......................................85
6.1 Tổng quan về SIMULINK..................................................................................................85
6.1.1 Khởi động SIMULINK................................................................................................85
6.1.2 Giới thiệu thư viện SIMULINK.................................................................................86
6.2 Cách xây dựng một chương trình SIMULINK..................................................................90
6.3 Cách tạo ra thư viện riêng (một subsystem) từ các khối đã có ........................................93
6.4 Ví dụ ứng dụng **..............................................................................................................93

99

You might also like