- Thư viện các hàm toán học của MATLAB: bao gồm từ các hàm sơ cấp như tính tổng, sin, tính số phức cho đến các hàm phức tạp như hàm Bessel, nghịch đảo ma trận, tính trị riêng, biến đổi
Trang 1CHƯƠNG 1 CÁC KHÁI NIỆM CƠ BẢN VỀ MATLAB
1.1 MỞ ĐẦU
MATLAB, có nguồn gốc từ chữ matrix laboratory, là ngôn ngữ máy tính dùng để
tính toán kỹ thuật Ban đầu MATLAB được lập ra để giải quyết các phép tính trên ma trận, và điều này khiến cho MATLAB có ứng dụng rất lớn trong nhiều ngành kỹ thuật khác nhau so với các ngôn ngữ lập trình khác tính toán trên số vô hướng MATLAB kết hợp tính toán với lập trình và đồ họa trong môi trường phát triển tương tác, thời gian lập trình chỉ bằng một phần nhỏ so với thời gian lập trình bằng các ngôn ngữ khác nhờ vào những hàm có sẵn MATLAB là sản phẩm của công ty The Mathworks,
Inc với địa chỉ www.mathworks.com và sử dụng MATLAB phải có bản quyền, tuy
nhiên có rất nhiều hàm Matlab được viết bởi người sử dụng (third party) và phổ biến miễn phí trên mạng giúp cho MATLAB ngày càng phong phú hơn
Sức mạnh của MATLAB dựa trên các phần chính:
- Môi trường phát triển: gồm các công cụ và tiện nghi giúp viết chương trình,
sử dụng các hàm Matlab và các file
- Thư viện các hàm toán học của MATLAB: bao gồm từ các hàm sơ cấp như
tính tổng, sin, tính số phức cho đến các hàm phức tạp như hàm Bessel, nghịch đảo ma trận, tính trị riêng, biến đổi Fourier nhanh, wavelet…
- Ngôn ngữ MATLAB: gồm các lệnh cấp cao xử lý mảng/ ma trận, lệnh rẽ
nhánh, lập vòng, xuất nhập, cấu trúc dữ liệu, lập trình hướng đối tượng…
- Xử lý đồ họa: dùng các lệnh cấp cao để hiển thị dữ liệu dạng đồ họa hai
chiều và ba chiều, hoạt hình, xử lý ảnh Cho phép ngưởi dùng viết chương trình giao
diện đồ họa người dùng GUI (graphical user interface)
- Thư viện API của MATLAB: cho phép viết các chương trình C và Fortran liên
kết với MATLAB, chương trình MATLAB có thể gọi các chương trình viết bằng ngôn ngữ khác hay các chương trình viết bằng ngôn ngữ khác có thể gọi các hàm thư viện liên kết động tạo bởi công cụ MATLAB
- Các hộp dụng cụ : các hộp dụng cụ (toolbox) là tập hợp các hàm MATLAB
viết sẵn để giải quyết các vấn đề thuộc một chuyên ngành nào đó ví dụ như xử lý tín
hiệu, xử lý ảnh, điều khiển, logic mờ , mạng nơrôn, robot… Nhờ các toolbox mà lãnh
vực áp dụng của MATLAB rất rộng, bao gồm các ngành Kỹ thuật điện- Điện tử, Điều khiển tự động, Viễn thông, Cơ khí, Động lực,…
Các toolbox của MATLAB ngày càng được bổ sung theo sự phát triển của khoa học kỹ thuật Nhiều toolbox do các cơ quan nghiên cứu, các trường Đại học (third party) viết riêng bổ sung vào các toolbox của chính hãng Bên cạnh khả năng tính
toán mạnh, MATLAB còn có thể liên kết với các ngôn ngữ lập trình khác như Visual
Trang 2Basic, Visual C, Delphi và giao tiếp thời gian thực với thiết bị ngoại vi của máy tính thông qua cổng song song, cổng nối tiếp hay card ISA, PCI Theo thời gian từ năm
1984 đến nay, đã có nhiều phiên bản của MATLAB ra đời, tài liệu này dựa trên MATLAB 6.5 R13 chạy trên Windows 98 trở lên
Để thuận tiện cho việc sử dụng, MATLAB có những trợ giúp rất phong phú trong menu Help, hay các file PDF trong đĩa CD MATLAB Help và các trợ giúp trực tuyến Việc nghiên cứu MATLAB sẽ dễ dàng nhanh chóng nếu bạn ngồi trước máy tính đang chạy MATLAB khi đọc quyển sách nhỏ này
1.2 BƯỚC ĐẦU CHẠY MATLAB
Khi chạy MATLAB, một màn hình nền (desktop) xuất hiện bao gồm các cửa sổ:
- Cửa sổ Lệnh (Command window): với dấu nhắc >> dùng để chạy các lệnh MATLAB, viết chương trình, chạy chương trình…Có một số lệnh tổng quát liên quan đến cửa sổ này như sau:
clc: xoá cửa sổ Lệnh
home: di chuyển con chạy lên góc trên trái của cửa sổ(khi chạy chương trình) help: trợ giúp thông tin về một mục nào đó
echo, echo on/off: tắt mở hiển thị các dòng của file m khi chạy chương trình
edit: gọi chương trình soạn file *.m
type tên_file: đọc nội dung file *.m
demo: gọi chương trình demo
quit, exit: thoát chương trình MATLAB
Ngoài ra còn có một số phím hổ trợ thao tác liệt kê trong bảng sau:
Mũi tên lên Gọi lại hàng trước
Mũi tên xuống Gọi lại hàng kế
Mũi tên trái (mtt) Lui một ký tự
Mũi tên phải (mtp) Tới một ký tự
Backspace Xóa ký tự trước con chạy
Shift home Đánh dấu đến đầu hàng
Shift end Đánh dấu đến cuối hàng
- Cửa sổ Lịch sử lệnh (Command history): liệt kê các lệnh đã sử dụng trước đó
Trang 3Lệnh Ta kết hợp phím Ctrl và chuột trái để chọn lệnh sau đó đưa con trỏ sang Cửa sổ Lệnh nhấn chuột phải và chọn paste
- Cửa sổ Thư mục hiện tại (Current directory): cho biết thư mục hiện tại đang
sử dụng, thường mặc định khi cài là ‘thư mục cài đặt Matlab’\work, có thể thay đổi tuỳ ý
- Cửa sổ Bệ phóng (Launch Pad): cho phép truy cập các công cụ, tài liệu, demo
của Matlab từ bên trong
- Cửa sổ Không gian làm việc (Workspace): cho biết các biến sử dụng trong
chương trình
Các cửa sổ này có thể bật tắt từ menu View
Hình 1.1 Cửa sổ MATLAB
Ví dụ 1.1: tạo ma trận A 3 x 3, bạn gõ
Trang 4i,j: số ảo đơn vị
eps: độ chính xác của số chấm động, 2-52
realmin: số chấm động dương nhỏ nhất, 2-1022
realmax: số chấm động dương lớn nhất, 21023
inf: vô hạn
naN: không phải số
Kết quả tính toán có thể được định dạng bằng lệnh format Sau format ta ghi loại
định dạng
long: số chấm cố định 15 con số 3.14159265358979
long e: số chấm động 15 con số 3.141592653589793e+000
long g: chọn dạng tốt nhất giữa long và long e
short: số chấm cố định 5 con số 3.1416
short e: số chấm nổi 5 con số 3.1416e+000
short g: chọn tốt nhất giữa short và short e
loose: xuống hàng để dễ đọc kết quả, ngược với compact
Một cách khác là vào menu File-Preferences để chọn loại format
Muốn đưa vào nhiều hàng rồi mới tính thì sau mỗi hàng bấm Shift Enter hay thêm
dấu ‘;’ vào cuối mỗi hàng Khi tính toán xong từng hàng sẽ không xuất hiện kết quả tính toán Bạn hãy so sánh hai cách viết sau:
Trang 5Một hàng có thể chứa nhiều hàm cách nhau bằng dấu ’,’ hay ‘;’
Ví dụ1.3: tạo một bảng loga bằng các lệnh sau
format short; x = (1:10)’; logs = [x log10(x)]
trên màn hình hiện ra hai cột là trị của x từ 1 đến 10 và log x tương ứng
File-Chú thích đước viết sau ký tự % và không được MATLAB xử lý
Thay vì viết từng dòng lệnh và MATLAB xử lý từng dòng, bạn có thể soạn một
hàm MATLAB có đuôi m (xem thêm mục 1.6) bằng cách vào File – New- M_file để mở cửa sổ Soạn thảo/sửa lỗi (Editor/debugger), cũng có thể gõ edit (hay edit tênhàm) trong cửa sổ Lệnh để gọi cửa sổ Soạn thảo Sau khi soạn thảo xong ta có thể chạy thử dùng menu Debug-Run và lưu file dùng menu File-Save as Muốn gọi một file MATLAB có sẵn ra để biên tập, ta kích chuột lần lượt File – Open và chọn hàm phù hợp Hàm M có thể được gọi trực tiếp từ Cửa sổ Lệnh bằng cách gõ tên hàm sau dấu
nhắc
Sau đây hướng dẫn sử dụng các phím để gõ chương trình
Ví dụ1.4: tìm nghiệm của phương trình ax2 +bx+c Bạn gõ các dòng lệnh sau:
>>a =1;
Trang 6Bạn cũng có thể viết một hàm *.m nhận vào các hệ số a, b, c và tính nghiệm
phương trình bậc hai Dùng lệnh edit (hoặc vào menu File-New- M_File) để gọi chương trình biên tập, trong đó gõ các dòng sau:
Hình 1.2 Biên tập hàm M
Sau đó lưu file với tên abc dùng menu File- Save as Trong MATLAB, gõ abc gọi
hàm tính nghiệm, chương trình sẽ yêu cầu cho biết các giá trị của a, b, c
Trang 7c=input('Enter c:');
[x1, x2]=quadroot(a,b,c)
Có hai hàm M quan trọng là matlabrc.m do hệ thống sử dụng và startup.m do
người sử dụng viết Khi khởi động MATLAB hàm thứ nhất được gọi và nếu có hàm
thứ hai thì hàm này sẽ được gọi Hai hàm này đặt trong thư mục thưmụcMATLAB
\toolbox\local Bằng cách biên tập hàm startup bạn có thể thêm đường dẫn bằng lệnh addpath, đổi thư mục làm việc bằng lệnh cd , và gọi một hàm M khác… Bạn cũng có thể kích phải chuột vào biểu tượng của MATLAB, chọn Properties, và thay đổi option trong ô cửa sổ Target, ví dụ thêm sau matlab.exe chuỗi /r tênfileM_muốn_gọi khi khởi động, tương tự có thể thay đổi thư mục làm việc trong ô cửa sổ Start in
Hình 1.3 Đặt cấu hình khởi động MATLAB
Khi thoát khỏi MATLAB, hàm finish.m sẽ được gọi nếu có, người dùng có thể biên tập hàm này để thực hiện các thao tác tự động như lưu biến trong workspace vào đĩa
chẳng hạn
Sau đây liệt kê một số hàm tổng quát, dùng trong việc soạn chương trình
addpath(‘đường_dẫn_đến_thưmục’) : chỉ đường tìm đến thư mục (có thể vào menu File_Set path để thêm đường dẫn)
beep on, beep off : tạo và tắt tiếng beep
Trang 8beep: tạo tiếng beep
clear: xoá Workspace
cd('directory'): thay đổi thư mục làm việc hiện tại
disp(X): hiển thị mảng X, muốn hiển thị chuỗi ta đặt giữa hai dấu nháy dơn ‘ dir (‘name’): hiển thị các file có đặc tính name trong thư mục hiện tại
dos (‘command’): thực hiện lệnh *.exe của hệ điều hành Dos
pause:ngừng chạy file M cho đến khi bấm phím bất kỳ, pause(n): ngưng n sec type filename: trình bày nội dung file
ver: trình bày thông tin version của MATLAB, Simulink và toolbox
what (what dirname): hiển thị các file MATLAB hiện có trong thư mục hiện tại
hay thư mục dirname
who, whos: hiển thị các biến trong Workspace
which func: cho biết địa chỉ của hàm hay file func
mkdir (‘dirname’): tạo thư mục trong thư mục hiện tại
pwd: hiển thị thư mục hiện tại
!: thực hiện lệnh hệ điều hành
diary tên file: chép các hành động nhấn phím sau đó và kết quả xuất ra vào một
file văn bản, dùng để in hay lưu trữ
Ví dụ 1.5: minh họa một số hàm
>> ver
-
MATLAB Version 6.5.0.180913a (R13)
MATLAB License Number: 0
Operating System: Microsoft Windows 98 Version 4.10 (Build 2222: A )
Java VM Version: Java 1.3.1_01 with Sun Microsystems Inc Java HotSpot(TM) Client VM -
MATLAB Version 6.5 (R13)
Simulink Version 5.0 (R13)
Aerospace Blockset Version 1.0.1 (R13)
CDMA Reference Blockset Version 1.1 (R13)
Communications Blockset Version 2.5 (R13)
Communications Toolbox Version 2.1 (R13)
Control System Toolbox Version 5.2 (R13)
Curve Fitting Toolbox Version 1.1 (R13)
DSP Blockset Version 5.0 (R13)
Data Acquisition Toolbox Version 2.2 (R13)
Dials & Gauges Blockset Version 1.1.2 (R13)
Embedded Target for Motorola MPC555 Version 1.0.1 (R13)
Embedded Target for Texas Instrumen Version 1.0 (R13)
Excel Link Version 2.0 (R13)
Filter Design Toolbox Version 2.2 (R13)
Fuzzy Logic Toolbox Version 2.1.2 (R13)
GARCH Toolbox Version 1.0.2 (R13)
Image Processing Toolbox Version 3.2 (R13)
Trang 9LMI Control Toolbox Version 1.0.8 (R13)
MATLAB COM Builder Version 1.0 (R13)
MATLAB Compiler Version 3.0 (R13)
MATLAB Excel Builder Version 1.1 (R13)
MATLAB Link for Code Composer Studi Version 1.0 (R13)
MATLAB Report Generator Version 1.3 (R13)
MATLAB Runtime Server Development Kit Version 6.1.1 (R13)
Mapping Toolbox Version 1.3 (R13)
Model Predictive Control Toolbox Version 1.0.7 (R13)
Model-Based Calibration Toolbox Version 1.1 (R13)
Mu-Analysis and Synthesis Toolbox Version 3.0.7 (R13)
Neural Network Toolbox Version 4.0.2 (R13)
Nonlinear Control Design Blockset Version 1.1.6 (R13)
Optimization Toolbox Version 2.2 (R13)
Partial Differential Equation Toolbox Version 1.0.4 (R13)
Real-Time Windows Target Version 2.2 (R13)
Real-Time Workshop Version 5.0 (R13)
Real-Time Workshop Embedded Coder Version 3.0 (R13)
Requirements Management Interface Version 1.0.4 (R13)
Robust Control Toolbox Version 2.0.9 (R13)
SB2SL (converts SystemBuild to Simu Version 2.5 (R13)
Signal Processing Toolbox Version 6.0 (R13)
SimMechanics Version 1.1 (R13)
SimPowerSystems Version 2.3 (R13)
Simulink Performance Tools Version 1.2 (R13)
Simulink Report Generator Version 1.3 (R13)
Spline Toolbox Version 3.1.1 (R13)
Stateflow Version 5.0 (R13)
Stateflow Coder Version 5.0 (R13)
Statistics Toolbox Version 4.0 (R13)
Symbolic Math Toolbox Version 2.1.3 (R13)
System Identification Toolbox Version 5.0.2 (R13)
Virtual Reality Toolbox Version 3.0 (R13)
Wavelet Toolbox Version 2.2 (R13)
>>mkdir(‘examples’) % tạo thư mục examples trong thư mục hiện tại
>>mkdir(‘c:\’,’examples’) % tạo thư mục examples trong thư mục gốc C
>>mkdir(‘d:\work’) % tạo thư mục d:\work
>>cd (‘c:\examples’) % chọn thư mục c:\examples là thư mục hiện tại
>> dos('notepad file.m &') % mở notepad rồi quay về MATLAB
1.3 CÁC QUI ƯỚC VÀ PHÉP TOÁN:
Trang 10a/ Biến: tên biến dài tối đa 31 ký tự, bắt đầu bằng chữ sau đó là các chữ, số hay
gạch dưới MATLAB phân biệt chữ hoa và chữ thường, X và x là hai biến khác nhau Không cần khai báo loại và kích thước biến, MATLAB tự động bố trí bộ nhớ cho biến
b/ Số: số thập phân dùng dấu chấm để tách phần nguyên và phần lẻ, ký hiệu e chỉ
luỹ thừa của 10, số phức dùng ký hiệu i hay j
3 -99 0.0001
9.6397238 1.60210e-20 6.02252e23
1i -3.14159j 3e5i
c/ Ma trận và mảng:
Thông thường thuật ngữ ma trận (matrix) và mảng (array) được dùng lẫn lộn
Mảng gồm một số hữu hạn các phần tử có cùng kiểu Ma trận m x n là mảng chữ nhật hai chiều m hàng n cột các số thực hay phức Vectơ cột là ma trận m x1, vectơ hàng là
ma trận 1xn, số vô hướng là ma trận 1x1 hay vectơ/mảng/ma trận mà các phần tử đều giống nhau Ma trận là đối tượng chủ yếu của MATLAB
Ma trận vuông có m = n Đường chéo chính của ma trận gồm các phần tử akk Ma trận chéo là ma trận mà các phần tử không nằm trên đường chéo chính bằng 0 Ma trận đơn vị n x n là ma trận chéo vuông có các phần tử đường chéo chính là 1
Ma trận được đưa vào theo từng hàng, các phần tử của hàng cách nhau khoảng trắng hay có dấu phẩy, mỗi hàng cách nhau bằng dấu chấm phẩy Phần tử hàng i cột j ký hiệu là A(i,j)
Chuyển vị của ma trận A m x n là A’ n x m có các hàng là các cột của A
Dấu : (colon) có thể dùng để chỉ các phần tử của ma trận, ví dụ ký hiệu 1:10 chỉ vectơ hàng có các phần tử là 1 2 3 4 5 6 7 8 9 10, ký hiệu 100:-7:50 chỉ vectơ có các phần tử 100 93 86 79 72 65 58 51 Ký hiệu A(1:k,j) chỉ k phần tử của cột j A(:,j) và A(i,:) lần lượt chỉ các phần tử cột j và hàng i A(:,end) chỉ cột cuối của A Ký hiệu A(k)
chỉ phần tử thứ k của A theo kiểu sắp xếp ma trận thành vectơ dài gồm các cột kế tiếp
nhau Ký hiệu A(i:k:l) chỉ các phần tử thứ i, i+ k, i+2k …,l Sau đây là một số hàm trên
ma trận
sum(A) cho vectơ hàng mà các phần tử là tổng các phần tử mỗi cột của A, sum (A(end,:)) tính tổng các phần tử cột cuối của A, sum(A,2) cho vectơ cột mà các phần tử
Trang 11prod(A) cho vectơ hàng mà các phần tử là tích các phần tử mỗi cột, prod(A,2) cho
vectơ cột mà các phần tử là tích các các phần tử mỗi hàng của A Nếu A là vectơ thì
prod(A) trả về số vô hướng
diff(A) tính sự sai biệt giữa các phần tử kế nhau của A
diag(A) cho vectơ là đường chéo của ma trận A, nếu v là vectơ thì diag(v) cho ma trận vuông chéo gồm các phần tử của v sum(diag(A)) tính vết của A, tương đương hàm trace(A)
eye(n) cho ma trận vuông đơn vị n x n, hàm eye(m,n) cho ma trận chéo m x n có
các phần tử đường chéo chính là 1
ones(n) hay ones(m,n) cho ma trận mà các phần tử đều là 1, còn zeros(n),
zeros(m,n) thì cho ra ma trận có các phần tử là 0
magic (n) cho ma trận vuông bậc n mà tổng mỗi hàng, mỗi cột hay đường chéo
đều bằng nhau
randn(n) tạo ma trận vuông bậc n có các phần tử ngẫu nhiên phân bố chuẩn, randn(m, n, p) tạo mảng ba chiều có các phần tử ngẫu nhiên phân bố chuẩn
Ma trận có thể được nạp từ đĩa vào bằng lệnh load Trước đó ma trận số liệu được soạn dưới dạng văn bản m hàng n cột rồi lưu file có đuôi dat Ví dụ dùng trình notepad tạo file matran có nội dung sau:
Cũng có thể lưu ma trận dưới dạng hàm m rồi sau đó dùng lại Ví dụ tạo file văn
bản matran.m lưu vào thư mục work
Trong cửa sổ lệnh gõ matran để nạp ma trận A vào
Nhiều ma trận nhỏ có thể kết nối với nhau (concatenation) để tạo ma trận lớn hơn
Ví dụ ma trận B được tạo từ ma trận A như sau
B = [A A+32; A+48 A+16]
Trang 12Có thể bỏ bớt hàng hay cột ma trận Lệnh A(:,2) = [ ] bỏ cột thứ hai của A
d/ Các toán tử số học: thực hiện trên số vô hướng hay mảng, ma trận
Các phép toán + - thực hiện trên các ma trận có cùng kích thước
1lil
chú ý là (A*B)’=B’*A’
Tích ma trận A với số vô hướng s là ma trận sA =As với các phần tử là saij Phép chia ma trận với số vô hướng được thực hiện bằng cách nhân ma trận với nghịch đảo số vô hưởng
Tích vectơ hàng v với vectơ cột u cùng chiều dài k là sốvô hướng
ik1i
iu v u
Tích hai mảng u.*v là một mảng có các phẩn tử ukvk
Phép chia ma trận A/B thực hiện bởi A*B-1 trong đó B-1 là ma trận đảo của B với B*B-1= I, ma trận B-1 tính bởi inv(B), phép chia này thường dùng để giải phương trình XB=A
Trang 13Phép chia trái A\B tương đương A-1*B hay (B’/A’)’dùng để giải phương trình AX=B
Trường hợp hai số vô hướng thì a \b tương đương b/a Đối với mảng ta thưc hiện phép tính chia theo từng cặp phần tử
Nếu p nguyên dương và A là ma trận vuông thì A^p là tích của p ma trận A Nếu
A nghịch đảo được thì A ^-p là tích của p ma trận A-1 Khái niệm luỹ thừa của ma trận cũng được mở rộng cho trường hợp p là phân số
A.^p là ma trận có các phần tử aij luỹ thừa p
Ví dụ 1.6: Các phép toán số học (dòng ans = xin được phép lược bỏ)
Matrix dimensions must agree
>> u*v % tích vô hướng
Matrix dimensions must agree
>> u.*w % nhân hai vectơ theo từng phần tử
Trang 15e/ Toán tử logic: thực hiện phép tính logic trên các phần tử mảng hay ma trận, 0
biểu thị logic False, khác 0 biểu thị logic True
Phép toán Ký hiệu Hàm m
Ngoài ra còn các toán tử all (A) kiểm tra xem có phải A gồm các phần tử đều khác
zero, any(A) xem có phần tử nào của A khác zero.
f/ Toán tử so sánh: thực hiện so sánh từng phần tử của hai mảng cùng kích thước,
kết quả so sánh là mảng mà các phần tử có giá trị true (1) hay false (0) Nếu một mảng là số vô hướng thì số này được khai triển thành mảng có kích thước phù hợp
So sánh nhỏ hơn: A < B
So sánh lớn hơn: A > B
So sánh nhỏ hơn hay bằng:A <= B
So sánh lớn hơn hay bằng: A >= B
Bốn toán tử trên chỉ so sánh phần thực
So sánh bằng: A == B
So sánh không bằng: A ~= B
Hai toán tử trên so sánh cả phần thực và ảo
>> A =[1 2; 3-i -5+i]; B =[-2+i 4; -6 5];
>> A >B
Trang 161 0
1 0
g/ Các lệnh điều khiển chương trình:
Lệnh if else elseif
Có ba dạng sử dụng if
if biểu thức logic
các phát biểu
end
% nếu biểu thức logic là True thì thực hiện các phát biểu tiếp theo, nếu không thì
thực hiện các phát biểu sau end
các phát biểu 1
elseif biểu thức logic 2
các phát biểu 2
end
Ví dụ 1.7: Các lệnh điều khiển chương trình
xét xem a là chẵn hay lẻ
if rem(a,2) == 0 %tìm phần dư của a chia 2
disp('a is even')
b = a/2;
end
xét xem n âm dương chẵn hay lẻ
if n < 0 % Nếu n âm, báo sai
disp('Input must be positive');
elseif rem(n,2) == 0 % Nếu n dương chẵn, chia cho 2
A = n/2;
else
A = (n+1)/2; % Nếu n dương lẻ, tăng lên rồi chia
end
Lệnh switch case chọn nhiều trường hợp
switch biểu thức (vô hướng hay chuỗi)
Trang 17Ví dụ 1.8: lệnh switch
so sánh một số
Lệnh while lập vòng khi biểu thức logic là true:
while biểu thức logic
các phát biểu
Lệnh for thực hiện vòng lặp một số lần
for index = start:increment:end
statements
end
Ví dụ 1.10: dùng lệnh for lập vòng
lặp năm lần
for i = 2:6
x(i) = 2*x(i-1);
end
Trang 18nhiều vòng for lồng nhau
Lệnh break ngắt vòng lặp for, while
Ví dụ 1.11: chương trình xem nội dung help của một file, đọc nội dung file fft.m
vào một mảng ký tự s, ngừng đọc khi đến một hàng trống và hiển thị nội dung mảng
h/ Các hàm toán học: MATLAB có rất nhiều hàm toán học xây dựng sẵn, bạn có
thể gõ help elfun, help elmat, help specfun để tìm hiểu rõ hơn Một số hàm không đọc được mã nguồn (built-in) ví dụ hàm sin, sqrt…, một số viết dưới dạng M file mà ta có
thể đọc mã nguồn và sửa chữa tuỳ ý Nhiều hàm có cùng tên nhưng tác dụng khác nhau:
Trang 19Bảng dưới đây liệt kê các hàm sơ cấp toán học (elementary math function) trong thư mục \toolbox\matlab\elfun (gõ help elfun) Đối số của hàm có thể là số vô hướng hay mảng Muốn được hướng dẫn về cách sử dụng hàm bạn chỉ cần gõ help tênhàm
Các biến và hằng đặc biệt
eps Độ chính xác chấm động nan Không phải số (0/0 hay inf/inf) realmax Số chấm động dương lớn nhất isnan Xét có phải không là số
realmin Số chấm động dương nhỏ nhất isinf Xét có phải là inf
pi 3.1415926535897 isfinite Xét có phải là số hữu hạn
I, j Số ảo đơn vị why Câu trả lời ngắn gọn bất kỳ
Hàm lượng giác và hyperbol
sin (x) Tính sin x (góc x tính bằng
radian)
atanh(x) Tang hyperbol đảo (arth x) sinh(x) Sin hyperbol (sh x= (ex- e-x)/2) sec(x) secant (sec x=1/cos x)
asin(x) arcsin x, sin-1 x sech(x) 1/ch(x)
asinh(x) Sin hyperbol đảo (arsh x) asec(x) secant đảo arcos(1/x)
cosh(x) cosine hyperbol (ch x= (ex+ e
-x)/2)
csc(x) Cosecant ( cosec x=1/sin x)
acos(x) arcos x, cos-1 x csch Cosech x= 1/sh(x)
acosh(x) cosine hyperbol đảo( arch x) acsc Cosecant đảo
tanh(x) Tang hyperbol (th x= sh x/ch x) cot(x) ctg x (1/tg x)
atan(x) Tính arctg x coth(x) cotang hyperbol (1/th x)
atan2(x,y) Tính arctang bốn góc phần tư,
tuỳ dấu của x và y
acot(x) arcotg x, ctg-1x acoth cotang hyperbol đảo
Hàm luỹ thừa và logarit
log10(x) Log thâp phân nextpow2(N
)
Tìm số p để 2^p >= N log2(x) Log cơ số 2
Ví dụ 1.12: hàm mũ ma trận
Trang 20Hàm phức
abs(x) Trị tuyệt đối real(Z) Lấy phần thực
angle(z) Góc pha của số phức unwrap Sửa góc pha
Imag Lấy phần ảo
Làm tròn và lấy phần dư
fix Làm tròn về zero mod(x,y) Tính phần dư phép chia, lấy dấu của
y floor Làm tròn nhỏ hơn rem(x,y) Tính phần dư phép chia, lấy dấu của
x ceil Làm tròn lớn hơn sign(x) Lấy dấu của x
round Làm tròn về số nguyên gần
Các hàm toán học đặc biệt
Hankel besseli, besselk, besselj,
bessely
Hàm Bessel biến đổi
beta, betainc, betaln
scale dấu chấm động
rat, rats Xấp xỉ phân số hữu tỷ
Trang 211.4 CÁC HÀM XỬ LÝ MA TRẬN
Hàm sơ cấp ma trận
zeros(m,n
)
Tạo mảng mxn chứa zero randn Tạo ma trận ngẫu nhiên phân bố
chuẩn ones(m,n) Tạo mảng mxn chứa 1 linspace Tạo vectơ khoảng cách đều
eye (m,n) Tạo ma trận mxn chứa 1 trên đường
chéo
logspace Tạo vectơ khoảng cách theo log
repmat Tạo ma trận theo mẫu freqspac
Taylor sqrtm Căn bậc hai ma trận expm3 Tính hàm mũ ma trận dùng trị và
vectơ riêng funm Tính hàm ma trận tổng quát numel Số phần tử của ma trận
Tạo ma trận đặc biệt
compan(
u)
Ma trận đồng hành của đa thức u magic Ma trận magic
gallery Ma trận kiểm tra pascal Ma trận Pascal
hadamar
d
Ma trận Hadamard rosser Ma trận Rosser
hankel Ma trận Hankel toeplitz Ma trận Toeplitz
invhilb Ma trận Hilbert đảo wilkinson Ma trận Wilkinson
Thông tin về ma trận
size Kích thước ma trận isequal Xem các mảng có bằng nhau
không
c
Xem có phải là dãy số không
ndims Số chiều islogical Xem mảng có phải là dãy logic
không
isempty Xem ma trận có trống không
Xử lý ma trận
reshape Đổi kích thước ma trận flipdim Lật ma trận theo chiều định trước diag Tính đường chéo ma trận và tạo ma rot90 Quay ma trận 90 độ
Trang 22trận chéo
blkdiag Tạo ma trận gồm các khối trên
đường chéo
: Toán tử colon
tril Tạo ma trận tam giác dưới find Tìm các phần tử khác zero
triu Tạo ma trận tam giác trên end Chỉ số cuối
fliplr Lật ma trận trái phải sub2ind Đổi subscript ra index
flipud Lật ma trận trên dưới ind2sub Đổi index ra subscript
Phân tích ma trận
norm Chuẩn ma trận hay vectơ trace Tính vết (tổng các phần tử đường
chéo) normest Ước lượng chuẩn ma trận null Không gian null của ma trận
e
Góc giữa hai không gian con
Phương trình tuyến tính
\ and / Phép chia giải phương trình tuyến tính inv Nghịch đảo ma trận
rcond Ước lượng đảo của số điều kiện cond Số điều kiện (condition number) condest Ước lượng số điều kiện normest
lu Phân tích ma trận thành thừa số LU luinc Phân tích thừa số LU không đủ
qr Phân tích ma trận thành thừa số trực
covariance
Trị riêng và trị bất thường
eig Tính trị riêng và vectơ riêng polyeig Bài toán trị riêng đa thức ma trận svd Phân tích ma trận theo trị bất thường condeig Số điều kiện đối với trị riêng gsvd Phân tích ma trận theo trị bất thường
Thừa số hóa (phân tích ma trận thành tích ma trận)
qrdelete Bỏ cột trong thừa số hoá QR balance Cải thiện độ chính xác tính trị riêng qrinsert Xen cột trong thừa số hóa QR planerot Phát sinh mặt phẳng quay Given rsf2csf Đổi dạng khối chéo thực sang dạng
Trang 23
Sau đây trình bày một số ví dụ về các hàm ma trận thường sử dụng, muốn tìm hiểu
kỹ hơn bạn dùng lệnh help tênhàm hay bấm help rồi vào cửa sổ help chọn index và
điền tên hàm vào
Ví dụ 1.14: Tạo ma trận và tính toán trên ma trận
>> A = pascal(3) % ma trận có các phần tử lấy từ tam giác Pascal
Trang 240.4368 1.0654 1.9418
Ví dụ 1.15: Tính hàm ma trận và vẽ Cho phương trình vi phân dx/dt=Ax, nghiệm
có dạng x=eArx(0), các dòng lệnh sau vẽ x(t)
plot3(X(1,:),X(2,:),X(3,:),'-o') % vẽ x trong không gian ba chiều
Ví dụ 1.16: Giải phương trình đại số tuyến tính, phương trình Ax=u với A là ma
trận vuông, x và b là vectơ cột có nghiệm là x=A\u Phương trình AX=B với A,B, X là các ma trận vuông có nghiệm X=A\B
Trang 25Ví dụ1.17: Trị riêng và vectơ riêng Trị riêng và vectơ riêng của ma trận vuông A
là số vô hướng và vectơ thoả phương trình A = Nếu D là ma trận chéo các trị riêng và V là ma trận mà các cột là vectơ riêng thì A = VDV-1
>>A= pascal(3); lambda = eig(A) % tính trị riêng
Trang 26>> poly(A) % tạo đa thức đặc trưng (định thức) của ma trận A, det(sI-A)
ans =
1.0000 -9.0000 9.0000 -1.0000
kết quả det(A)=x3-9x2+9x-1
Ma trận sparse là ma trận kích thước lớn mà đa số phần tử là 0, hàm eigs thuận
tiện để tính trị riêng ma trận này, cho sáu trị rtêng lớn nhất của ma trận
>> s=sparse(10000,10000,pi) % ma trận chỉ có một phần tử khác không
Ví dụ 1.18: Trị bất thường và vectơ bất thường Cho ma trận A, trị bất thường (trị
kỳ dị, singular value) s và vectơ bất thường (vectơ kỳ dị) là cặp vectơ u v sao cho Au =
sv và A’v= su Có thể phân tích A =USV’, trong đó U, V là ma trận mà các cột là vectơ u, v theo thứ tự, còn S là ma trận chéo tạo bởi s
Ví dụ 1.19: Thừa số hoá Thừa số hoá chol phân tích ma trận A đối xứng xác định
dương thành tích hai ma trận tam giác R và R’, A= R’*R
>>A = pascal(6)
Trang 27Có thể kiểm tra thấy A=R’*R
% Thừa số hoá LU (lower-upper) A = L*U
Trang 280 0 0
Ví dụ 1.20: Chuẩn ma trận
Chuẩn ma trận là số vô hướng cho biết độ lớn các phần tử ma trận Có nhiều loại
chuẩn khác nhau, tính bằng hàm norm(A,p)
p =1 :chuẩn 1, trả về trị lớn nhất của tổng mỗi cột, max(sum(abs((A)))
p =2: chuẩn 2 (chuẩn Euclide), tính trị bất thường lớn nhất của A, max(svd(A)), norm(A)
p =inf: chuẩn vô cùng, max(sum(abs(A')))
p=’fro’: chuẩn Frobenius, sqrt(sum(diag(A'*A)))
Chuẩn p của vectơ x là
p p i
x
/ 1
norm(x, inf)= max(abs(x))
norm(x,-inf)= min(abs(x))
1.5 CÁC CẤU TRÚC DỮ LIỆU KHÁC
MATLAB có 14 loại dữ liệu cơ bản, mỗi loại còn gọi là class có dạng mảng, ở
phần trước chúng ta đã khảo sát các hàm tác động trên mảng số, bảng sau cho thấy các loại dữ liệu của MATLAB
- Dữ liệu loại số: biểu thị dưới dạng số nguyên 8/16/32 bit, số chấm nổi đơn và
kép Sau đây là tầm giá trị của các loại số
Trang 29double: số thực biểu diễn bằng 64 bit gồm bit dấu s, 11 bit số mũ và 52 bit số lẻ f,
giá trị số: 1s( 2e1023)( 1 f )
Mọi phép tính toán của MATLAB đều thực hiện trên số chính xác kép
- Mảng nhiều chiều: mảng nhiều chiều là mảng có hơn hai chỉ số, ví dụ mảng ba
chiều biểu thị nhiệt độ trong phòng với các chỉ số tương ứng các toạ độ rời rạc trong
không gian phòng Các hàm zeros, ones, rand, randn với hơn hai đối số tạo mảng
nhiều chiều Mảng ba chiều có thể coi là gồm một loạt các mảng hai chiều cùng kích thước
- Mảng tế bào (cell array): gồm các mảng kích thước có thể khác nhau
Ví dụ 1.21: mảng tế bào
- Chuỗi ký tự: chuỗi ký tự được đặt giữa hai dấu nháy đơn, dòng lệnh
>> s = 'Hello' tạo biến s là mảng 1 x 5
Chuỗi ký tự chiều dài n kể cả khoảng trống là mảng 1xn, mỗi phần tử là mã 16 bit
của mỗi ký tự Một văn bản text có thể xem như một mảng ký tự
Do tính chất văn bản biểu diễn dưới dạng mảng và các phần tử là mã ASCII từ 32 đến 127 của ký tự nên ta có thể thao tác trên văn bản như với số
Các hàm chuyển đổi
char Tạo mảng ký tự từ mảng số double Đổi chuỗi sang mã ASCII int2str Đổi số nguyên sang chuỗi mat2str Đổi ma trận sang chuỗi
Trang 30num2str Đổi số sang chuỗi str2double Đổi chuỗi sang số chính xác
kép str2mat Đổi chuỗi sang ma trận str2num Đổi chuỗi sang số
Các hàm xử lý chuỗi
deblank Bỏ các khoảng trống cuối chuỗi findstr Tìm chuỗi trong chuỗi
lower Đổi chuỗi sang ký tự thường strcat Đặt chuỗi kề nhau
strcmp,
strcmpi
strmatch Tìm sự trùng hợp của chuỗi strncmp,
chuỗi ký tự
upper Đổi chuỗi sang chữ viết hoa
Các hàm đổi cơ hệ
bin2dec Đổi nhị phân sang thập phân dec2bin Đổi thập phân sang nhị phân dec2hex Đổi thập phân sang mã hex hex2dec Đổi mã hex sang thập phân hex2num Đổi mã hex sang số chính xác
Trang 31This is a great example
Một dạng chuỗi đặc biệt là ngày giờ, hàm date cung cấp ngày hiện tại, hàm now trả về ngày và giờ dạng số nguyên (gốc thời gian là 1-1- 0000), hàm datestr(now) trình bày ngày giờ dạng chuỗi, datenum đổi chuỗi ngày giờ ra số
Hàm clock cung cấp ngày giờ dạng vectơ
- Cấu trúc (structure): là mảng nhiều chiều mà các phần tử được truy cập theo
trường (field) Ví dụ tạo structure Student có các field là name, score, grade, có thể dùng phép gán hay hàm struct
Ví dụ 1.23: cấu trúc
>> Student.name = ' George Bush';
- Function handle: chứa mọi thông tin về hàm, muốn tạo handle cho một hàm ta
viết tênhandle = @tênhàm, tính toán trên handle thực hiện nhờ hàm feval, handle có
thể có cấu trúc mảng, được lưu vào đĩa và xử lý
Trang 32>>fh_array = [@sin @cos @tan];
>>save savefile fh_array;
>>clear
>>load savefile
whos
Name Size Bytes Class
fh_array 1x3 48 function_handle array
Grand total is 3 elements using 48 bytes
- Lớp và đối tượng: Lớp (class) mô tả một loại dữ liệu có tính chất đặc biệt nào
đó, chúng ta có thể tuỳ ý tạo ra một lớp mới và tạo ra các phép tính (method) trên các
đối tượng của lớp
Muốn tạo một lớp mới ta định nghĩa một cấu trúc chứa dữ liệu cho đối tượng của
lớp, một thư mục lớp chứa các hàm M thao tác trên đối tượng (method), định nghĩa lại các toán tử có sẵn của MATLAB khi thao tác trên đối tượng (overload) Chi tiết về
tạo lớp mới được trình bày ở mục 1.15
1.6 LẬP TRÌNH HÀM M
Hàm M gồm tập hợp các lệnh MATLAB gom dưới dạng một file văn bản (text
file) tênfile.m Nó có thể chỉ đơn giản là một nhóm các dòng lệnh (script) hay có thể
nhận vào các đối số và xuất ra kết quả
Muốn tạo hàm M có thể vào menu File-New-M_file hay gõ edit tênhàm từ dấu nhắc hoặc đơn giản edit.Danh sách các hàm M trong thư mục xuất hiện khi bạn gõ what, muốn hiện nội dung hàm M gõ type tênhàm Muốn chạy hàm M chỉ cần gõ tên
hàm
Dòng đầu tiên của hàm M bắt đầu bằng từ khoá function rồi đến tên đối số trả về
(có thể không có đối số trả về) và tên hàm cùng với danh sách các đối số nhận vào
Trang 33nhiều đối số thì ta đóng khung bằng dấu ngoặc vuông [ ] và các đối số cách nhau bằng dấu phẩy Trong hàm cũng có thể có nhiều hàm con Các dòng của hàm M khi bắt đầu bằng % là dòng chú thích, các ký tự sau % cũng là chú thich Các dòng chú thích ngay sau khai báo hàm và trước dòng đầu tiên không phải là chú thích sẽ xuất
hiện khi bạn gõ help tênhàm Dòng chú thích đầu tiên gọi là dòng H1 xuất hiện khi gõ help tênthưmục
Ví dụ 1.25: các dạng khai báo hàm:
function [x,y,z] = sphere(theta,phi,rho)
function printresults(x)
function [] = printresults(x)
Ví dụ 1.26: tạo file script vẽ các cánh hoa (Hình 1.5), từ dấu nhắc >> ta gõ edit,
khi cửa sổ soạn thảo hiện ra gõ các dòng sau rồi cất dưới tên canhhoa Sau đó từ >> gõ canhhoa
% M-file script tao ra bon hinh canh hoa % Hàng chú thích
theta = -pi:0.01:pi; % Góc theta từ –pi đến pi gia số 0.01
Trang 34% calculate standard deviation and mean
% RANK Matrix rank
% RANK(A) provides an estimate of the number of linearly
% independent rows or columns of a matrix A
% RANK(A,tol) is the number of singular values of A
% that are larger than tol
% RANK(A) uses the default tol = max(size(A)) * norm(A) * eps
% Tinh canh huyen
while 1>0 % vòng lặp vô hạn
disp('Pythagore Calculation'); % hiển thị tiêu đề
disp('Enter values a and b');
Các hàm M có biến địa phương riêng, độc lập với biến của hàm khác, ngoài ra các
hàm cũng có thể có biến toàn cục chung, khai báo dưới dạng global biến1 biến2 Biến
toàn cục cho phép đưa tham số vào hàm mà không cần dùng đối số
Trang 35Ví dụ 1.30: tạo hàm lotka định nghĩa hai phương trình vi phân có hai biến toàn cục
ALPHA, BETA
function yp = lotka(t,y)
%LOTKA Lotka-Volterra predator-prey model
global ALPHA BETA
yp = [y(1) - ALPHA*y(1)*y(2); -y(2) + BETA*y(1)*y(2)];
các dòng lệnh sau giải phương trình vi phân trên với alpha và beta đưa vào từ bên ngoài
>>global ALPHA BETA
>>ALPHA = 0.01
>>BETA = 0.02
>>[t,y] = ode23('lotka',0,10,[1; 1]);
>>plot(t,y)
Hàm nargin (number argument in), nargin(‘fun’) và nargout, nargout(‘fun’) cho
biết số biến vào và ra của hàm, thường dùng kèm với các lệnh có điều kiện để thực hiện các công việc khác nhau
Ví dụ 1.31: hàm sau thực hiện phép tính bình phương nếu có một biến vào và thực
hiện phép cộng nếu có hai biến vào
Có trường hợp số đối số vào và ra không xác định, lúc đó ta dùng các đối số là
varargin (variable argument in) và varargout , biến cụ thể sẽ do lúc gọi hàm quyết
định, cú pháp tổng quát là:
function [varout1, varout2,…,varargout] = tênhàm (varin1,varin2,… ,varargin) trong đó varout, varin là các biến cụ thể
Ví dụ 1.32: nhận vào các điểm trong mặt phẳng và nối chúng lại
Trang 36Các hàm M có thể đặt trong một thư mục, trong thư mục này đặt hàm Contents.m gồm toàn các dòng chú thích giới thiệu nội dung các hàm, khi gõ help tênthưmục,
phần giới thiệu sẽ xuất hiện Nếu không có file này dòng chú thích đầu tiên của mỗi hàm M xuất hiện
Hàm M có thể chứa hơn một hàm, hàm đầu tiên là hàm sơ cấp (primary), là hàm được gọi bởi tên hàm M, các hàm khác là hàm con (subfunction) Các hàm phụ bắt
đầu bằng dòng định nghĩa hàm, sau đó là mã của hàm Các hàm phụ có thể dùng tên trùng với tên hàm MATLAB có sẵn nhưng với ý nghĩa khác và chỉ được nhìn thấy bởi các hàm trong M file đó
Ví dụ 1.33:
function [avg,med] = newstats(u) % Primary function
% NEWSTATS Find mean and median with internal functions
Hàm private là hàm ở trong thư mục con Private, hàm này chỉ thấy được bởi các
hàm ở thư mục cha, do đó có thể dùng cùng tên với các hàm trong các thư mục khác, điều này có lợi khi bạn muốn tạo một kiểu riêng khác với hàm M có sẵn nhưng vẫn
giữ nguyên bản gốâc Ta chỉ cần tạo thư mục con Private rồi di chuyển các hàm M cần
thiết vào đó
1.7 TÍNH ĐA THỨC
Đa thức được sắp xếp theo lũy thừa giảm và biểu diễn dưới dạng vectơ hàng gồm các hệ số , ví dụ đa thức x3- x + 5 biểu diễn dưới dạng p = [1 0 -1 5] Bảng sau cho một số hàm xử lý đa thức
Trang 37poly Lập đa thức từ nghiệm polyder Đạo hàm đa thức
polyfit Xấp xỉ bằng đa thức polyval Tính giá trị đa thức
polyvalm Tính ma trận đa thức residue Tính thặng dư, Khai triển riêng phần
phân số roots Tìm nghiệm đa thức
Ví dụ 1.34:Tính đa thức
>> p = [1 0 -1 5]; %đưa các hệ số đa thức vào
>> r=roots(p) %tính nghiệm đa thức
>> a = [1 2 3]; b = [4 5 6]; % lập hai đa thức s2 + 2s + 3 và 4s2+ 5s + 6
c = conv(a,b) % nhân hai đa thức
Trang 38>> b = [-4 8]; a = [1 6 8]; % cho hàm truyền b/a=(-4s+8)/(s2+ 6s+8)
>>[r,p,k] = residue(b,a) % khai triển thành dạng phân số riêng phần r1/(s-p1) + r2/(s-p2)+ … +ks
%Copyright 1996 Justin Shriver
%polyadd(poly1,poly2) adds two polynominals possibly of uneven length
Trang 39else
poly=long+short;
end
1.8 HÀM CỦA HÀM
MATLAB có hai cách biểu diễn một hàm toán học là định nghĩa bằng hàm M và
định nghĩa bằng inline Xét ví dụ hàm
) 10 s )(
5 s ( s
) 3 s ( 10 y
Hàm feval dùng để tính giá trị một hàm theo biến còn hàm fplot dùng để vẽ hàm
theo biến Xét ví dụ sau:
1.9 GIẢI PHƯƠNG TRÌNH PHI TUYẾN
Muốn tìm một nghiệm của phương trình một biến f(x)=0 ta dùng hàm fzero
x = fzero(fun, x0)
x0 là giá trị ước đoán
fun là hàm mô tả f(x)
Ví dụ 1.35: tìm nghiệm của phương trình ex= 1, giả sử nghiệm ở gần 0.5 (nghiệm đúng là 0) Ta mô tả phương trình f(x) = ex-1 bằng dòng sau:
>> f=inline(‘exp(x)-1’);
sau đó tìm nghiệm
>> x=fzero(f,0.5) % cũng có thể viết x=fzero(inline(‘exp(x)-1’),0.5)
x =
Trang 40Ví dụ 1.36: tìm nghiệm của phương trình cos x = 0 trong khoảng 1 2
>>x = fzero(@cos,[1 2]) % cũng có thể viết x = fzero(‘cos’,[1 2])
x =
1.5708
Muốn tìm một nghiệm của hệ phương trình phi tuyến nhiều biến ta dùng hàm
x = fsolve(fun, x0)
Ví dụ 1.37: tìm nghiệm của hệ phương trình
Tạo hàm myfun
và viết các lệnh sau:
>>x0 = ones(2,2); % Đoán vùng nghiệm
>>[x,Fval,exitflag] = fsolve(@myfun,x0)
optimization terminated successfully: