Tải bản đầy đủ (.pdf) (24 trang)

Chuyên đề MATLAB

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (983.01 KB, 24 trang )

Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
CHUYÊN ĐỀ
THIẾT KẾ HỆ THỐNG ĐIỀU KHIỂN DÙNG MATLAB
CHƯƠNG 1 – MÔI TRƯỜNG PHÁT TRIỂN ỨNG DỤNG TRÊN MATLAB
1.1. Sơ lược về MATLAB
Matlab là 1 ngôn ngữ hiệu năng cao được dung cho tính toán kỹ thuật. Nó tích hợp các
công cụ lập trình, hiển thị, tính toán dữ liệu trong 1 môi trường dễ sử dụng, nơi mà các vấn đề,
các giải pháp được đưa ra trong 1 dạng toán học rất thông dụng.
Matlab bao gồm:
- Các hàm tính toán và toán học
- Các môi trường phát triển các thuật toán
- Mô hình hóa và mô phỏng
- Hiển thị, khảo sát, phân tích dữ liệu
- Các giao diện đồ họa mang tính chất kỹ thuật và khoa học
- Môi trường phát triển ứng dụng gồm phát triển các giao diện đồ họa người dùng GUI
Matlab là một hệ thống tương tác mà các phần tử dữ liệu cơ bản là 1 mảng không yêu
cầu phải đặt kích thước. Điều này cho phép giải quyết rất nhiều vấn đề tính toán kỹ thuật, đặc
biệt là khi giải quyết bài toán về vector, ma trận.
Matlab (MATrix LABoratory) khi mới được phát triển thì nó được viết để cung cấp các
công cụ cho việc tính toán, thao tác trên ma trận. Matlab được đặc trưng bởi các giải pháp xây
dựng được xây dựng trước cho các ứng dụng cụ thể và được gọi là các toolbox.
Vĩ dụ:
- Simulink là công cụ giúp mô phỏng
- DSP: toolbox phục vụ xử lý tín hiệu số (phân tích, chuỗi…)
- Math: cung cấp các hàm toán học
- Realtime Workshop: mô phỏng thời gian thực
- Neural Network: mạng nơ ron
- Fuzzy: hàm điều khiển mờ
1.2. Hệ thống phần mềm Matlab
Phần mềm Matlab gồm 5 phần chính:


1.2.1. Môi trường phát triển
Đây là một tập các công cụ và phương tiện hỗ trợ cho việc sử dụng các hàm, các file của
Matlab. Phần lớn các công cụ này dùng cho giao diện người dùng. Nó bao gồm:
- Matlab desktop
- Cửa sổ lệnh: Comman Window, Command History
- Các trình duyệt xem trợ giúp
- Các file và tìm kiếm các đường dẫn
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
1.2.2. Thư viện các hàm toán học của Matlab
Đây là 1 tập hợp rất lớn các thuật toán cho việc tính toán từ những hàm tính toán cơ bản
như +, - , x, /, sin, cos,… cho tới những hàm tính toán phức tạp hơn như nghịch đảo, ma trận, tính
định thức….
1.2.3. Ngôn ngữ Matlab
Đây là ngôn ngữ thao tác trên mảng và ma trận bậc cao với các câu lệnh điều khiển, rẽ
nhánh, các hàm, cấu trúc dữ liệu, các dữ liệu vào ra và tính năng lập trình hướng đối tượng.
1.2.4. Quản lý giao diện đồ họa
Đây là hệ thống các công cụ đồ họa Matlab. Nó bao gồm các lệnh cho phép hiển thị dữ
liệu dưới dạng 2D, 3D, xử lý ảnh, tạo các ảnh động và hiển thị đồ họa
1.2.5. Giao diện lập trình ứng dụng trong Matlab (API – Application Programming Interface)
Đây là thư viện cho phép viết các ứng dụng bằng ngôn ngữ C để giao tiếp với môi trường
Matlab, nó bao gồm các hàm cho phép gọi các chương trình con trong Matlab hoặc gọi Matlab từ
chương trình viết trong C và đọc ghi MAT file *.mat

CHƯƠNG 2 – THAO TÁC TRÊN MA TRẬN
2.1. Ma trận
Trong Matlab, ma trận là 1 mảng hình chữ nhật chứa các số
2.1.1. Nhập ma trận
Ta có thể nhập ma trận trong Matlab theo nhiều cách khác nhau:
- Nhập danh sách các phần tử của ma trận

>> A = [1 2 3; 4 5 6]
Các hàng của ma trận cách nhau bởi một dấu “;”, các phần tử của một hàng cách nhau 1
dấu “space”
- Nhập ma trận từ một file bên ngoài
Ví dụ có file matran.txt có nội dung như sau :
1 2 3
4 5 6
>>load matran
- Sinh ra các ma trận bằng cách sử dụng các hàm được xây dựng trước trong Matlab
- Tạo ra các ma trận bằng cách viết những hàm *.m file riêng (gọi là M-file)
Ví dụ :
>> A = [1 2 3 4 ; 5 6 7 8 ; 9 10 11 12 ; 13 14 15 16] ↲
A = 1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội

1. Tính tổng ma trận, hoán vị, tìm đường chéo chính (diag)
- Tổng ma trận
>>sum(A)
ans = …
kết quả của lệnh này sẽ tính tổng các cột của ma trận A và in ra thành một ma trận hàng
Trong Matlab, khi không chỉ rõ biến đầu ra thì Matlab sử dụng biến ans để lưu giữ kết
quả tính toán.
Hàm “sum” sẽ thực hiện tính tổng các phần tử trong 1 cột của ma trận A và tạo nên một
ma trận hàng.
- Hoán vị ma trận
>>A’

>>sum(A’)
>>sum(A’)’
- Tìm đường chéo chính
>>diag(A)
ans =
1
6
11
16
>>sum(diag(A))
2. Khái niệm chỉ số, phần tử mảng trong Matlab (subscript)
Phần tử ở hàng thứ i và cột thứ j của ma trận A được ký hiệu là A(i,j)
Ví dụ: A(4,2) = 14
Có thể tính tổng của mảng thông qua các chỉ số
Trong Matlab, có thể truy xuất các phần tử của mảng nhiều chiều thông qua 1 chỉ số duy
nhất. Matlab quan niệm 1 ma trận là một vector nối các cột.
Ví dụ: A* = (1 5 9 13 2 6 10 14 3 7 11 15 4 8 12 16)
Do đó: A*(7) = 10 hoặc A(7) = 10
Nếu chúng ta truy xuất các phần tử của mảng mà chỉ số vượt qua kích thước của mảng
thì Matlab sẽ báo lỗi. Tuy nhiên, nếu chúng ta truyền giá trị cho một phần tử có chỉ số nằm ngoài
kích thước của mảng thì sẽ được 1 mảng mới với kích thước tăng lên.
Ví dụ:
>>X = A
>>X(4,5) = 9
X = 1 2 3 4 0
5 6 7 8 0
9 10 11 12 0
13 14 15 16 9
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội


2.1.2. Toán tử ‘:’ (colon)
Toán tử ‘:’ là một trong những toán tử quan trọng nhất của Matlab. Nó được dùng trong
rất nhiều dạng khác nhau trên các ứng dụng của Matlab.
Ví dụ: >>1:10 sẽ hiển thị trên 1 hàng một dãy số từ 1 đến 10
1 2 3 4 5…. 10
>>20:-7:5 -> 20 13 6
>>0:pi/4:pi -> 0 0.785 1.5708 2.862 3.1416
Tức là 0 pi/4 pi/2 3pi/4 pi

Cho ma trận A
- A( :) biểu diễn thành 1 vector tất cả các cột liên tiếp nhau của ma trận dưới dạng 1 hàng
- A(2 :5) gồm các phần tử A(2), A(3), A(4), A(5)
- A(:,3) biểu diễn tất cả các phần tử ở cột thứ 3 của A
- A(:2:4) biểu diễn tất cả các phần tử ở cột từ 2 đến 4 của A
- A(1:3,2:4) biểu diễn tất cả các phần tử ở hàng từ 1 đến 3 và cột 2 đến 4 của A
Ví dụ:
B = [2 4 10 13; 16 3 7 18; 8 4 9 25; 3 12 15 17]


   
   
   
   


>>B(:) =
ans 2 16 8 3 4 3 4 ….
>>B(2:5)
ans 16 8 3 4

>>B(:,3)
ans 10 7 9 15
>>B(:,2:3)
ans 4 10
3 7
4 9
12 15
>>C = B(2:3;1:3)
C = 16 3 7
8 4 9

2.2. Biểu thức trong Matlab
Giống như hầu hết các ngôn ngữ khác, Matlab cũng sử dụng các biểu thức toán học. Tuy
nhiên, các biểu thức ngày cũng thao tác trên ma trận.
2.2.1. Biến
Matlab không yêu cầu câu lệnh khai báo biến hay định nghĩa kích thước. Khi Matlab thấy
1 tên biến mới, nó sẽ tự động tạo ra biến và cấp phát vùng nhớ thích hợp cho biến đó. Nếu biến
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
đã tồn tại, nó chỉ thay đổi nội dung của biến và khi cần thiết, nó có thể cấp phát lại bộ nhớ cho
biến.
Tên biến bao gồm 1 chữ cái, theo sau có thể là bất kỳ số, chữ cái hay dấu ‘_’. Tuy nhiên,
Matlab chỉ cho phép tối đa biến có độ dài 31 ký tự. Biến trong Matlab có phân biệt chữ hoa và
chữ thường.
2.2.2. Số
Matlab sử dụng ký hiệu số thập phan thông thường với dấu ‘.’ thập phân cho các số có
phần lẻ. Ký hiệu khoa học thường sử dụng chữ e hoặc E để thể hiện phần lũy thừa 10. Còn các số
phức thì dùng ký hiệu j hoặc i.
Ví dụ:   






Chú ý, dấu * là không cần thiết trong việc biểu thị số phức. Tức là 5*i = 5i. Tuy nhiên, hai
biểu thức sau có kết quả khác nhau.
>> x = 7/2i
x = -3.5i (do biểu thức tương đương với x = 7/(2i))
>>x = 7/2*i
x = 3.5i (tương đương x = (7/2)*i)
 Ma trận số phức:
>>C = [1 2] +i*[3 4]
C = 1 + 3i 2 + 4i
2.2.3. Toán tử
- Các toán tử trên các biểu thức số học
Toán tử
Biểu thức
+
a + b
-
a – b
*
a * b
Chia trái /
c = a/b ⇔ c*b = a
Chia phải \
c = a\b ⇔ c*a = b
Mũ ^
a^b = a
b



- Toán tử trên ma trận
Toán tử
Dạng
Ví dụ
+
A + B
[1 2] + [3 4] = [4 6]
-
A – B
[1 2] - [3 4] = [-2 -2]
.*
A .*B
[1 2] .* [3 4] = [1*3 2*4] = [3 8]
./
A ./ B
[1 2] ./ [3 4] = [1/3 2/4] = [0.33 0.5]
.\
A .\B
[1 2] .\ [3 4] = [1\3 2\4] = [3 2]
.^
A .^ B
[1 2] .^ [3 4] = [1^3 2^4] = [1
3
4
6
]
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội

*
C = A * B
Nếu A(m,n)
B(n,p)
Thì C(m,p)


 






/
C = A / B
C = A/B ⇔A = C*B

Ví dụ 1:
Sau khi làm thí nghiệm, người thí nghiệm có một bảng sau về giá trị điện trở và sụt áp
trên nó:

1
2
3
4
R
10
4


2.10
4

3.5.10
4

10
5

U
120
80
110
200
Tìm dòng điện và công suất bằng Matlab
>>R = [10000 20000 35000 100000];
>>U = [120 80 110 200];
>>I = U./R
I =
0.0120 0.004 0.0031 0.002
>>P = U.*I
P =
1.44 0.32 0.3457 0.4
Ví dụ 2:
>>A = [6 -2;10 3;4 7];
>>B = [9 8;-5 12];
>>C = A*B
C =
64 246
75 116

1 116

2.3. Các thao tác khác trên ma trận
2.3.1. Các hàm tạo ma trận
- Hàm tạo ma trận đơn vị nxn
>>eye(n)
Ví dụ:
>>eye(3)
ans =
1 0 0
0 1 0
0 0 1
>>eye(2,4)
ans =
1 0 0 0
0 1 0 0

- Hàm sinh ma trận 0
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
>>zero(n) hàm tạo ma trận nxn
>>zero(n,m) hàm tạo ma trận nxm
- Hàm tạo ma trận 1
>>ones(n)
>>ones(n,m)
- Hàm magic
>>magic(n) hàm tạo một ma trận nxn mà tổng các phần tử trên cột = tổng các phần tử trên
hàng = tổng các phần tử ở đường chéo. Trong đó, các số của ma trận không bị lặp lại 2 lần.
Ví dụ:
>>magic(4)

ans =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1

- Để tìm thêm các hàm có liên quan đến ma trận, có thể sử dụng lệnh help như sau:
>>help elmat
- Lệnh Load để nhập ma trận từ file text
Ví dụ: có file dl.txt có dạng như sau:
1 2 3
4 5 6
thì:
>>load dl.txt
dl =
1 2 3
4 5 6
- Dùng m-file
Ví dụ: file text1.m có dạng như sau:
A = [
1 2 3
4 5 6]
%End
thì
>>text1
A =
1 2 3
4 5 6
- Liên kết ma trận
Chuyên đề: Lập trình điều khiển trong Matlab

Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
>>A = [1 2 3; 4 5 6];
>>B = [A; A.*2;A-5; A./2];
Kết quả:



 
  











  
  
  
  
  
  
  
  











2.3.2. Một số lệnh khác thao tác trên mảng
>>max(A) trả về 1 vector hàng các phần tử lớn nhất trong mỗi cột của ma trận A. Nếu A là
một ma trận số phức thì giá trị lớn nhất được hiểu là modul của số phức
>>min(A) ngược lại của max(A)
>>size(A) trả về một vector hàng gồm 2 phần tử [n m] là kích thước hàng, cột của ma trận A
>>sort(A) sắp xếp mỗi một cột của A theo thứ tự tăng dần
>>det(A) tính định thức
Ví dụ:
>>A = [6 2; -10 -5; 3 0]
A =
6 2
-10 -5
3 0
>>max(A)
ans = 6 2
>>min(A)
ans = -10 -5
>>size(A)
ans = 3 2
>>sort(A)
ans =
-10 -5

3 0
6 2
>>C = [6 2; -10 -5; 3+4i 0]
>>max(C)
ans = -10 -5
>>min(C)
ans = 3+4i 0
>>sort(C)
ans =
3+4i 0
6 2
-10 -5

Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
- Tìm ma trận nghịch đảo
>>B = inv(A)
Ví dụ:
>>A = magic(3)
A =
8 1 6
3 5 7
4 9 2
>>B = inv(A)
B =
0.1472 -0.1444 0.0639
-0.0611 0.0222 0.1056
-0.0194 0.1889 -0.1028

2.3.3. Xóa hàng và cột

>>A = magic(4);
>>A(:,2) = [ ] xóa tất cả các phần tử ở cột thứ 2
Ví dụ:


   
   
   
   


>>A(:,2) = [ ]
A = 16 3 13
5 10 8
9 6 12
4 15 1
>>A(1,3) = [ ] sẽ báo lỗi
>>A(2:2:10) = [ ] sẽ xóa các phần tử của vector hàng A từ phần tử
thứ 2 đến thứ 10 và cách nhau 2 phần tử
Kết quả:
A = [16 9 3 6 13 12 1]

2.4. Đa thức
2.4.1. Nhập đa thức
Một đa thức f(x) bậc n được biểu diễn như sau:









 



 



 



 




có thể biểu diễn f là 1 ma trận:








 






Ví dụ :
>>f = [3 7 2 1]
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
thì 





 

   
2.4.2. Các phép toán trên đa thức
Giả sử, có 2 đa thức có bậc khác nhau :






 

   







  
Do đó, để nhập đa thức này, các vector sẽ khai báo như sau:
>>f = [9 -5 3 7] ;
>>g = [6 -1 2] ;
Tuy nhiên, nếu muốn thao tác trên 2 ma trận này, chúng nên được làm cho cùng bậc với nhau,
tức là cần nâng bậc của g(x) lên cho bằng bậc của f(x)
>> g = [0 6 -1 2]
- Phép cộng
>>h = f + g
h =
9 1 2 9
- Phép tích chập (convalution)
>>f = [9 -5 3 7];
>>g = [0 6 -1 2];
>>h = conv(f,g)

















 

  



  
h =
54 39 41 29 -1 14
- Xác định bậc của hàm
>>length(conv(f,g)) = length(f)+length(g)-1
Ví dụ:
Tổng hợp sơ đồ:
W1 W2
X




 


   







 


















 






  





 


>>num1 =[2 3];
>>den1 = [3 5 1];
>>num2 = [1 0];
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
>>den2 = [1 0 1];
>>numh=conv(num1, num2)
numh = 2 3 0
>>denh=conv(den1, den2)
denh = 3 5 4 5 1

- Phép chia đa thức (deconvalution)
Nếu có: 













 





thì có thể sử dung phép chia đa thức f(x)/g(x) để tìm được h
1
(x) và h
2
(x).
>>f = [9 -5 3 7];
>>g = [0 6 -1 2];
>>[h1 h2] = deconv(f,g)
h1= 1.5000 -0.5833
h2 = -0.5833 8.1667
- Xác định nghiệm của đa thức
Cho phương trình 




với 




là một đa thức bậc n. Do đó, nó sẽ có n nghiệm.
>>roots(f) sẽ xác định nghiệm của đa thức cho cả nghiệm thực và ngiệm phức
Ví dụ:






 

   
>>f = [1 -7 40 -34];
>>x = roots(f)
x =
3.000 + 5.000i
3.000 – 5.000i
1
hoặc x = roots([1 -7 40 -34]);

- Xác định đa thức khi biết nghiệm
Giả sử, r là vector chứa các nghiệm của đa thức
lệnh f = poly(r) sẽ cho kết quả là hàm số f(x) có các nghiệm như r
Ví dụ:
>>r = [3+5i;3-5i;1];
>>f = poly(r)
f = 1 -7 40 -34




Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội

CHƯƠNG 3 – FILE, HÀM VÀ CÁC CẤU TRÚC DỮ LIỆU
3.1. File trong Matlab
Có 3 kiểu file trong Matlab:
- M-file (*.m)
- MAT-file (*.mat)
- Các file dữ liệu (ASCII file) là các file được viết theo chuẩn mã ASCII. Tùy theo mục đích
sử dụng mà có định dạng khác nhau.
3.1.1. Mat-file
MAT-file thực chất là dạng file dữ liệu để lưu các biến, các tham số trong workspace khi
sử dụng lệnh save. Mat-file có cấu trúc dữ liệu được định nghĩa trước bởi Matlab và có thể được
sử dụng lại khi cần biểu diễn các dữ liệu đó.
- Lệnh lưu toàn bộ workspace
>>save lưu và mặc định tên file là matlab.mat
>>save file_name
- Lấy dữ liệu
>>load
>>load file_name
- Lưu biến cần lưu
>>save file_name var1 var2 var3 ….
>>load file_name
>>save file_name -ascii Lưu các biến số thực có độ dài chính xác đơn vào file
>>save file_name -double Lưu các biến số thực có độ chính xác kép
Ví dụ: trong workspace có biến x = 2.57 10
9

>>save test1 –ascii
Trong file test1, x sẽ được lưu dưới dạng: x = 2.57E+09

>>save test1 –double
Trong file test1, x sẽ được lưu dưới dạng x = 2.57D+09
 Một số lệnh thao tác trên file
Lệnh
Miêu tả
>>dir
Hiển thị file trong thư mục hiện hành
>>dir dir_name
Hiển thị file trong thư mục có tên xác định (nằm trong
trong danh sách thư mục làm việc của Matlab – có thể
thêm hoặc bớt)
>>delete file_name
Xóa file
>>load

>>load file_name

>>load file_name.txt
Nạp ma trận lưu trong file_name
Phần mở rộng có thể là .txt hoặc .mat
>>save

>>save file_name

>>save file_name –keyword
Keyword: -ascii
-double
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
>>type file_name

Hiển thị nội dung của file_name
Mặc đinh: file_name.m
Trường hợp khác file_name.ext
>>what
Hiển thị các file của Matlab
>>what dir_name
Hiển thị các file của Matlab trong thư mục xác định
>>pwd
Hiển thị tên thư mục hiện hành

3.1.2. M-file
Matlab sử dụng 2 loại m-file là script-file và function-file
- Script-file chứa một loạt các câu lệnh của Matlab. Nó thích hợp khi sử dụng nhiều lệnh
hay làm việc trên các mảng. Nhưu vậy, khi gọi file này tại dấu nhắc ‘>>’, nó sẽ thực hiện
các lệnh trong script-file
- Function-file được sử dụng khi cần lặp đi lặp lại một tập hợp lệnh cần thiết nhiều lần. Ý
nghĩa và mục đích của nó giống như hàm trong ngôn ngữ C hoặc thủ tục trong Pascal.
1. Script-file
Để tạo Script-file trong Matlab, thực hiện các bước như sau :
File -> New -> M-file
Matlab sẽ gọi một cửa sổ soạn thảo m-file. Tại cửa sổ này, ta có thể viết các lệnh cần thiết và lưu
file này thông qua menu save
Ví dụ: Test1.m
%Vi du Test1
a = [1 2; 3 4];
b = [5; 6];
c = a*b;
%End
>>test1
c = ……


- Lưu ý:
o Tên của script-file phải được đặt theo quy tắc đặt tên biến trong Matlab
o Không được đặt tên của script-file giống tên biến mà nó tính toán
o Không được đặt tên của script-file giống tên lệnh, hàm đã được định nghĩa trước
trong Matlab
o Để kiểm tra file đã được tạo ra hay chưa, sử dụng lệnh sau:
>>exist(‘file_name’)
Lệnh này trả về các tham số sau:
0 Nếu tên đó chưa tồn tại
1 Nếu 1 biến đã có tên đó
2 Nếu 1 biến hay 1 m-file khác đã có tên đó
3 Nếu 1 MEX-file đã có tên đó
4 Nếu 1 hàm của Simulink đã được biên dịch có tên đó
5 Nếu 1 hàm built-in của Matlab đã có tên đó
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
- Một số hàm thường được sử dụng trong m-file
o disp(A): Hiển thị nội dung của 1 mảng lên màn hình nhưng không hiện tên mảng
o disp(‘text’): Hiển thị một xâu trên màn hình
Ví dụ: test2.m
%Vi du Test2
a = [1 2; 3 4];
disp(‘Ma tran a = ‘)
disp(a)
%End
>>test2
Ma tran a = 1 2
3 4


o fprintf(‘format’,A,B…) hiển thị các phần tử của mảng A, B… theo định dạng được
thiết lập trong xâu format
Cấu trúc định dạng:
%[-][numer1.number2]c
Trong đó:
[-] thể hiện số âm hoặc dương
number1: thể hiện số lượng ký tự dành cho hiển thị trên màn hình
Ví dụ: số lượng ký tự dành cho việc thể hiện số number1 = 6
1 2 5
80 ký tự
6 ký tự
25 dòng

number2: thể hiện số các chữ cái của phần thập phân được hiển thị trên
màn hình
c: mã điều khiển hoặc mã định dạng dữ liệu cần hiển thị (Format Code
and Control Code)
Control Codes
Format Codes
Codes
Miêu tả
Codes
Miêu tả
\n
Xuống dòng
%e
Dạng khoa học
VD: 1.25e-5
\r
Đầu dòng

%E
Dạng khoa học như
trên
\b
Backspace
%f
Dạng thập phân (số
thực)
\t
Tab



Hiển thị dấu ‘


\\
Hiển thị dấu \


Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội

Ví dụ: test3.m
%Vi du Test3
x = -12.345;
y = -12.345e-23;
fprintf(‘Gia tri x = %10.2f\n’,x)
fprintf(‘Gia tri y = %10.4E\n’,y);
%End

>>test3
Gia tri x = -12.35
Gia tri y = -12.345E-23

Ví dụ: Test4.m
%Vi du Test4
x = -12.345 ;
y = 5.63 ;
fprintf(‘\n Gia tri z = [1 x ;y 1]’)
z = [1 x ;y 1]
fprintf(‘Dang cua z khi dung lenh fprint : \n’)
fprintf(‘%10.2f %10.4f’,z) ;
%End
>>Test4
Gia tri f = [1 x ;y 1]
z = 1.0000 -12.3450
5.6300 1.0000
Dang cua z khi dung lenh fprintf:
1.00 5.6300 -12.35 1.0000

o Hàm nhập dữ liệu input(‘text’): hiển thị dòng text và đợi người dùng nhập dữ
liệu từ bàn phím. Dữ liệu sẽ được trả về sau khi người dùng nhấn nút Enter
Ví dụ: Test5.m
%Vi du Test5
x1 = input(‘\n Nhap x1 = ’)
s1 = input(‘\n Nhap s1 = ‘)
%End
>>Test5
Nhap x1 = -12.45 ↲
x1 = -12.45

Nhap s1 = Doan text cua Test 5
s1 = Doan text cua Test 5

Bài tập:
Viết một script-file tính diện tích hình chữ nhật S = x.y
Với x và y nhập từ bàn phím. Sau đó, tính S và in ra kết quả dưới dạng:
“Dien tich hinh chu nhat 3 x 5 là S = 15”
2. Function File
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
Không giống script-file, tất cả các biến trong Function file đều là biến cục bộ
Các thành phần chính của 1 Function file gồm:
- Dòng định nghĩa hàm
- Dòng H1
- Các dòng help
- Thân hàm
- Các chú thích
 Dòng định nghĩa hàm
Dòng đầu tiên trong 1 Function file phải bắt đầu bằng dòng định nghĩa hàm và liên hệ các
biến đối mục đầu vào, ra. Chính dòng này tạo nên sự khác biệt giữa 1 script file và 1 function file.
Cú pháp của dòng định nghĩa hàm như sau:
function [Cac bien ra] = function_name (cac bien vao);
Biến vào được đặt trong ()
Biến ra được đặt trong []
Tên hàm được đặt theo quy tắc đặt tên biến
Function_name phải được đặt trùng với tên file chứa hàm.
Ví dụ : Test7.m là tên file
Test7 là tên hàm
Một số các dạng định nghĩa hàm:
STT

Định nghĩa hàm
Tên file
1
function [dthv] = square (side)
square.m
2
function dthv = square (side)
square.m
3
function [vol_box] = box (heigh, width, length)
box.m
4
function [cv, dt] = circle (r)
circle.m
6
function square (side)
square.m

 Dòng H1
Là dòng đầu tiên cho các dòng help. Thực chất nó là dòng chú thích ngay sau dòng định
nghĩa hàm.
 Các dòng help
Chính là các dòng chú thích mà người lập trình đưa thêm vào để cung cấp các thông tin
về ý nghĩa và cách sử dụng hàm. Các dòng này cũng giống như các dòng chú thích và bắt
đầu bằng dấu % và phải được viết liên tiếp nhau, không có dòng trống ở giữa.
Ví dụ:
function [dthcn] = square(x, y);
%Tinh dien tich hinh chu nhat
%Chuong trinh tinh dien tich hinh chu nhat
%Dau vao la 2 canh

%

%Than ham
……

Tại Worrkspace:
>>help square
Tinh dien tich hinh chu nhat
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
Chuong trinh tinh dien tich hinh chu nhat
Dau vao la 2 canh

 Thân hàm
Thân hàm là toàn bộ các mã chương trình để thực hiện các thao tác tính toán. Đó chính là
các câu lệnh gán, vào ra dữ liệu, gọi hàm, cấu trúc điều khiển, rẽ nhánh, chú thích và các dòng
trống…
Các chú thích có để được đặt ở bất cứ đâu trong m-file trên 1 dòng độc lập hoặc trên
cùng một dòng với mã lệnh nhưng phải ở vị trí kết thúc của lệnh
Ví dụ: hcn.m
function [cv, dt] = hcn(x, y);
%Tinh chu vi va dien tich hinh chu nhat
%cv = (x + y).2 ; dt = x.y

%Than ham
cv = (x + y) * 2 ;
dt = x * y;
%EOF
>>[chu_vi, dien_tich] = hcn(2,4)
chu_vi = 12

dien_tich = 8


 Hàm kiểm tra số lượng đối mục vào ra của hàm
nargin (number of function input argument) và nargout (number of function
output argument)
Hàm này cho phép biết được số lượng các đối mục vào ra của hàm. Cú pháp nargin và
nargout chỉ được sử dụng trong thân hàm.

Ví dụ : Test6.m
%Vi du Test6
function z = Test6(x,y) ;
if(nargin == 1)
z = x .^ 3;
else if (nargin == 2)
z = x*y;
end
end
%End of File
Gọi hàm:
>>nargin(‘Test6’)
ans = 2
>>nargout(‘Test6’)
ans = 1
>>a = Test6(2)
a = 8
>>a = Test6(2,3)
a = 6
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội


Lưu ý, khi truyền tham số đầu vào cho hàm, nếu số lượng biến vào ở lời gọi hàm nhỏ hơn
số lượng biến vào thực tế, Matlab sẽ nhận biến đầu tiên từ trái sang (ở Ví dụ trên, biến vào đầu
tiên là x).
 Truyền đối mục tùy biến cho hàm varargin và varargout
Hai hàm này cho phép truyền bất cứ số lượng đối mục vào va ra nào cho một lời gọi hàm
Thực chất, Matlab đặt tất cả các đối mục vào trong 1 cell-array. Đây là một kiểu dữ liệu
mảng đặc biệt của Matlab gồm các ô thay thế các phần tử của mảng. Mỗi cell có thể lưu giữ bất
cứ kiểu, kích thước, dữ liệu Matlab nào. Chẳng hạn, một cell này có thể chứa 1 vector các dữ liệu
kiểu số, 1 cell cùng cell-array lại chứa một mảng dữ liệu kiểu chuỗi. Đối với các đối mục đầu ra
thì trong mã chương trình, người lập trình phải đặt chúng vào trong cell-array để Matlab có thể
trả về các đối mục cho lời gọi hàm.
Ví dụ Test7.m:
Cho phép truyền tham số cho hàm gồm các vector gồm 2 phần tử rồi nối các
điểm của các vector đó với nhau.
%Vi du Test7
function Test7(varargin);
for i = 1:length(varargin)
x(i) = varargin{i}(1);
y(i) = varargin{i}(2);
end
plot(x,y)
%End of File
>>Test7([2, 3], [1, 5], [2,5], [4,1], [7,2], [5,9], [8,2])



Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội


Ví dụ Test8.m
%Vi du Test8
function [varargout] = Test8(array_in)
for i = 1 : nargout
vararg{i} = array_in(i,:2);
end
%End of File
>>a = [1 2; 3 4; 5 6; 7 8,;9 10]
>>[c1 c2 c3] = Test8(a)
c1 = 1 2
c2 = 3 4
c3= 5 6

varargin và varargout có thể nằm cùng danh sách các đối mục khác của hàm, tuy nhiên,
2 hàm này phải nằm cuối danh sách các đối mục đó.

Ví dụ Test9.m
%Vi du Test9
function [out1, out2, varargout] = Test9(x1, y1, x2, y2, flag, varargin);
out1 = x1 + y1 + x2+ y2;
out2 = flag;
for i = 1 : (nargout – 2)
varargout{i} = 1;
end
%End of File


3. Sub-Function
Một function-file có thể chứa các mã của các hàm khác bên trong nó. Khi đó, hàm được
khai báo ở dòng định nghĩa hàm (dòng đầu) thì được gọi là hàm chính. Còn các hàm khác được

định nghĩa phía thân hàm thì được gọi là các hàm con. Mỗi một sub-funtion cũng có dòng định
nghĩa riêng của nó.
Ví dụ Test10.m:
Chương trình xác định trung bình cộng và tổng của các số
chẵn trong dãy n phần tử
%Vi du Test10
function [avg, sum] = Test10(array_in)
n = length (array_in);
avg = average(array_in,n);
sum = sum_even(array_in, n);
%Ham sub-function
function a = average(u,n)
a = sum(u)/a;
function m = sum_even(u, n)
tong = 0;
for i = 1: n
if rem(u(i),2) == 0
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
tong = tong + u(i);
end
end
m = tong;
%End of File
>> c = [1 2 3 4 5 6 7 8 9 10]
>>[avg, tongch] = Test10(c)
avg =
5.5
tongch =
30


4. Private-Function
Là các hàm nằm trong thư mục con có tên Private. Chúng chỉ được gọi đối với các hàm
nằm ở thu mục mẹ.
Chú ý: không được đặt (add) các thư mục private nằm trong đường dẫn chứa thư mục
của Matlab

CHƯƠNG 4 – CÁC VẤN ĐỀ VỀ XÂY DỰNG HỆ THỐNG ĐIỀU KHIỂN TRONG MATLAB
4.1. Xây dựng hàm truyền















 


 

 


 


Ví dụ Test11.m
%Vi du Test11
num = 18*[1 20];
den = conv(conv([1 5],[1 25]), [1 0.4]);
printsys(num,den,’s’);
%End
>>Test11
num/den =
18s + 360

s^3 + 40.4s^2 + 399s + 150


4.2. Xây dựng không gian trạng thái
Với hệ thống tuyến tính theo thời gian thì không gian trạng thái được mô tả bởi:









 









 

với: x(t) là viector biến biểu diễn các trạng thái của hệ thống
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
u(t) là tín hiệu vào
y(t) là đại lượng các biến đầu ra
a, b, c, d là các ma trận
Ví dụ Test12.m
%Vi du Test12
a = [-40.4 -331 -150 ; 1 0 0 ; 0 1 0] ;
b = [1 ; 0 ; 0] ;
c = [0 18 36] ;
d = 0 ;
printsys(a,b,c,d) ;
%End
>>Test12
a =
x1 x2 x3
x1 -40.40000 -331.00000 -150.00000
x2 1.00000 0 0
x3 0 1.00000 0
b =

u1
x1 1.00000
x2 0
x3 0
c =
x1 x2 x3
y1 0 18.00000 36.00000
d =
u1
y1 0

4.3. Chuyển đổi giữa không gian trạng thái và hàm truyền đạt
Để chuyển đổi qua lại giữa không gian trạng thái và hàm truyền đạt, Matlab cung cấp cho
người dùng 2 câu lệnh :
tf2ss: chuyển từ hàm truyền sang không gian trạng thái
ss2tf: ngược lại
Ví dụ Test13.m
%Vi du Test13
num = 18*[1 20];
den = conv(conv([1 5],[1 25]), [1 0.4]);
printsys(num,den,’s’);
%Now convert tf->ss
[a,b,c,d] = tf2ss(num,den);
printsys(a,b,c,d);
%Now convert ss->tf
[num,den] = ss2tf(a,b,c,d);
printsys(num,den);
%End

Chuyên đề: Lập trình điều khiển trong Matlab

Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
4.4. Tính toán đặc tính quá độ của hệ thống
Ví dụ: Xét hệ có hàm truyền như sau:








   







 




 sai lệch tĩnh













Ví dụ Test14.m
%Vi du Test14
num = 3;
den = [1 2 10];
printsys(num,den);
yss = polyval(num,0)/polyval(den,0);
t = 0:0.05:15;
[y,x,t]=step(num,den,t);
[ypeak,k]=max(y) ;
ypeak
tpeak=t(k)
overshoot=100*(ypeak-yss)/yss
%Tinh on dinh cua he thong
i=length(t);
while(y(i)>0.98*yss)&(y(i)<1.02*yss)
i = i-1;
ts=t(i)
step(num,den);
%End

4.5. Xây dựng hệ thống hàm truyền nối tiếp, song song và phản hồi
4.5.1. Hệ hai hàm truyền mắc nối tiếp
Giả sử có hai hàm truyền W1 và W2 mắc nối tiếp với nhau, trong đó:










   








  

Ví dụ Test15.m
%Vi du Test15
num1 = 1;
den1 = [1 2 10];
num2 = [1 0];
den2 = [1 5];
[numnt,dennt]=series(num1,den1,num2,den2);
Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội
printsys(numnt,dennt);

%Su dung khong gian trang thai
[a1,b1,c1,d1]=tf2ss(num1,den1);
[a2,b2,c2,d2]=tf2ss(num2,den2);
[ant,bnt,cnt,dnt]=series(a1,b1,c1,d1,a2,b2,c2,d2);
[numnt,dennt] = ss2tf(ant,bnt,cnt,dnt);
printsys(numnt,dennt);
step(numnt,dennt);
%End

4.5.2. Hệ hai hàm truyền mắc song song
Giả sử có hệ thống với 2 hàm truyền mắc song song,







  







  
  

Ví dụ Test16.m

%Vi du Test16
n1 = 1;
d1 = [1 2];
n2 = [1 2];
d2 = [1 1];
[nss,dss] = parallel(n1,d1,n2,d2);
printsys(nss,dss);
%End

4.5.3. Hệ kín có phản hồi
Giả sử có hệ kín phản hồi âm. Trong đó:





 

  

 











  


 

  


%Vi du Test17.m
n = [1 1] ;
d = conv([2 1],[1 3]) ;
nf = conv([1 0],[3 5]) ;
df = conv([2 3],[1 9]);
[nk,dk] = feedback(n,d,nf,df,-1); %-1 the hien phan hoi am
printsys(nk,dk);
t=0:0.0002:20;
step(nk,dk,t);
%End

Chuyên đề: Lập trình điều khiển trong Matlab
Biên soạn: Võ Duy Thành – Bộ môn Tự động hóa – Viện Điện – Đại học Bách Khoa Hà Nội

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×