You are on page 1of 70

Bài giảng Matlab

CHƯƠNG 1
NHẬP MÔN MATLAB
1.1 Giới thiệu Matlab
MatLab là một phần mềm chuyên dụng chạy trong môi trường Windows
do hãng MathWork sản xuất và cung cấp. Có thể coi MatLab là một ngôn ngữ
tính toán, kỹ thuật. Nó tích hợp các công cụ rất mạnh phục vụ tính toán, lập
trình, thiết kế, mô phỏng,… trong một môi trường rất dễ sử dụng trong đó các
bài toán và các lời giải được biểu diễn theo các ký hiệu toán học quen thuộc.
Các ứng dụng điển hình:
- Toán học tính toán
- Phát triển thuật toán
- Tạo mô hình, mô phỏng
- Khảo sát, phân tích số liệu
- Đồ hoạ khoa học kỹ thuật
- Phát triển ứng dụng, gồm cả xây dựng giao diện người dùng đồ hoạ
GUI
Matlab là một hệ thống tương tác mà phần tử dữ liệu cơ bản là một mảng
mà không cần khai báo kích thước. Điều này cho phép giải nhiều bài toán
kỹ thuật , đặc biệt là các bài toán liên quan đến ma trận và vector.
Matlab (Matrix Laboratory).
Ban đầu Malab được viết chỉ để phục vụ cho việc tính toán ma trận. Trải
qua thời gian dài, nó đã được phát triển thành một công cụ hữu ích, một ngôn
ngữ của tính toán kỹ thuật.
Trong môi trường đại học, nó là một công cụ chuẩn cho các khoá học mở
đầu và cao cấp về toán học, khoa học và kỹ thuật.
Trong công nghiệp, nó là công cụ được lựa chọn cho việc phân tích, phát
triển và nghiên cứu hiệu suất cao.
Malab cung cấp một họ các giải pháp theo hướng chuyên dụng hoá được
gọi là các Toolbox. Các toolbox cho phép người sử dụng học và áp dụng các kỹ
thuật chuyên dụng cho cho một lĩnh vực nào đó. Toolbox là một tập hợp toàn
diện các hàm của Matlab (M-File) cho phép mở rộng môi trường Matlab để

1
Bài giảng Matlab

giải các lớp bài toán cụ thể. Các lĩnh vực trong đó có sẵn các toolbox bao gồm:
xử lý tín hiệu, hệ thống điều khiển, logic mờ, mô phỏng,…
1.2 Hệ thống Matlab
Hệ thống Matlab gồm 5 thành phần chính:
- Ngôn ngữ Matlab: là một ngôn ngữ ma trận, mảng cấp cao với các câu
lệnh, hàm, cấu trúc dữ liệu, vào/ ra, các tính năng lập trình hướng đối tượng.
Nó cho phép lập trình các ứng dụng từ nhỏ đến các ứng dụng lớn và phức tạp.
- Môi trường làm việc Matlab: Đây là một bộ các công cụ và phương
tiện mà ta sử dụng hoặc lập trình. Nó bao gồm các phương tiện cho việc quản
lý các biến trong không gian làm việc Workspace cũng như xuất nhập dữ liệu,
gỡ rối,…
- Xử lý đồ họa: Đây là hệ thống đồ hoạ của Matlab. Nó bao gồm các lệnh
cao cấp cho trực quan hoá dữ liệu hai chiều và ba chiều, xử lý ảnh, ảnh động,…
Nó cung cấp các lệnh cấp thấp cho phép ta tuỳ biến giao diện đồ họa cũng như
xây dựng một giao diện đồ hoạ mạnh và hoàn chỉnh các ứng dụng của Matab.
- Thư viện toán học Matlab: Đây là tập hợp khổng lồ các thuật toán tính
toán từ các hàm cơ bản như sin, cos,… tới các hàm cơ bản như nghịch đảo ma
trận, tìm trị riêng ma trận,…
- Giao diện chương trình ứng dụng Matlab API (Application
program Interface): Đây là thư viện cho phép viết các chương trình C và
Fortran tương thích với Matlab, Simulink, một chương trình đi kèm với Matlab,
là một hệ thống tương tác với việc mô phỏng các hệ động học phi tuyến. Nó là
một chương trình đồ hoạ sử dụng chuột để thao tác cho phép mô hình hoá một
hệ thống bằng cách vẽ một sơ đồ khối trên màn hình. Nó có thể làm việc với
các hệ thống tuyến tính, hệ thống phi tuyến, hệ thống liên tục theo thời gian, hệ
gián đoạn theo thời gian,…
1.3 Câu lệnh và các biến trong Matlab
1.3.1 Đặc điểm biến trong Matlab
- Không cần khai báo biến và kiểu của biến. Tuy nhiên trước khi gán
một biến bởi một biến khác thì cần đảm bảo rằng biến ở bên phải phép gán có
một giá trị xác định.

2
Bài giảng Matlab

- Bất kỳ một phép toán nào gán một giá trị vào một biến sẽ tạo ra biến đó
nếu cần (biến đó chưa xác định) hoặc ghi đè lên giá trị hiện tại nếu nó đã tồn tại
trong workspace
- Tên biến bao gồm một dãy các chữ cái, chữ số và dấu gạch dưới và một
số ký tự đặc biệt (bắt đầu bằng chữ cái), MatLab phân biệt chữ in hoa và in
thường, độ dài tối đa là 31 ký tự: Bình thường Matlab có sự phân biệt các biến
tạo bởi chữ cái thường và chữ cái in hoa. Các lệnh của Matlab nói chung
thường sử dụng chữ cái thường. Việc phân biệt đó có thể được bỏ qua nếu ta
thực hiện lệnh: casensen off
1.3.2 Một số lệnh đối với biến
Clear: lệnh xoá tất cả các biến đã được định nghĩa trước trong chương trình.
Lệnh gán(=): dùng để gán giá trị cho biến
Ví dụ:
>> h=3+5 ↵
h=
8
>> k=h+2
k=
10
Lời giải thích(%): Các ký hiệu sau dấu % đều bị bỏ qua.
Clear biến 1, biến 2…: Xoá các biến đã được liệt kê trong câu lệnh.
Who: Hiển thị các biến đã được định nghĩa trong chương trình.
Whos: hiển thị các biến đã được định nghĩa trong chương trình cùng với các
thông số của biến.
Size(Tên biến đã được định nghĩa): Cho biết kích cỡ của biến dưới dạng ma
trận với phần tử thứ nhất là số hàng của ma trận, phần tử thứ 2 là số cột của ma
trận.
Save: Lưu giữ các biến vào một File có tên là Matlab.mat
Load: Tải các biến đã được lưu giữ trong một File đưa vào vùng làm việc
X= input(dòng thông báo): Lệnh vào dữ liệu cho biến x từ bàn phím.
Disp(Biểu thức): Lệnh hiển thị dữ liệu lên màn hình.

3
Bài giảng Matlab

1.3.3 Một số biến đã được định nghĩa trước


Ans: tự động gán tên này cho kết quả của một phép tính mà ta không đặt tên
Realmax: đưa ra giá trị của số lớn nhất mà máy tính có thể tính toán được.
Ví dụ:
>> realmax ↵
ans =
1.7977e+308
Realmin: Đưa ra giá trị của số nhỏ nhất mà máy tính có thể tính toán được.
Ví dụ:
>> realmin ↵
ans =
2.2251e-308
i, j: đơn vị ảo của số phức.
inf: infinity - Vô cùng lớn
Nan: Not a number - biểu diễn dạng 0/0, ∞/∞
Eps: độ sai số nhỏ nhất. Nếu cộng với một được một số nhỏ nhất lớn hơn một.
Ví dụ:
>> eps ↵
ans =
2.2204e-016
>> 1+eps
ans =
1.0000
1.3.4 Biến toàn cục (Global variable)
Matlab cho phép sử dụng cùng một biến cho các hàm hoặc giữa các hàm
và chương trình chính của Matlab, điều này được thông qua việc khai báo biến
toàn cục.
Global biến 1 biến 2 …
(Lưu ý các biến cách nhau bằng dấu khoản trống, không sử dụng dấu phẩy)

4
Bài giảng Matlab

Việc khai báo biến toàn cục phải được thực hiện ở chương trình chính
hoặc ở File lệnh (scrìptile) hoặc ở file hàm (Function) có sử dụng các biến.
Biến toàn cục có tác dụng cho đến khi kết thúc quá trình tính toán hoặc khi
toàn bộ Workspace được xoá. Không được đưa tên biến toàn cục vào danh sách
các đối số của hàm. Khi sử dụng biến toàn cục các lệnh sau tỏ ra rất cần thiết.
Để loại bỏ các biến toàn cục ta sử dụng lệnh Clear global
Để kiểm tra xem một biến có là biến toàn cục hay không ta dùng lệnh
isglobal(Tên biến), nếu là biến toàn cục thì trả về giá trị là 1, ngược lại trả về
giá trị 0.
1.4 Script file(M_File)
Trong Matlab, yêu cầu tại dấu nhắc của Matlab trong cửa sổ lệnh là
nhanh và hiệu quả. Tuy nhiên vì số lệnh tăng lên, hoặc khi muốn thay đổi giá
trị của một hoặc nhiều biến và thực hiện lại một số lệnh với giá trị mới, nếu cứ
lặp đi lặp lại tại dấu nhắc thì sẽ trở nên buồn tẻ, do vậy Matlab cung cấp một
giải pháp cho vấn đề này là: Cho phép thay thế các lệnh của Matlab bằng một
file văn bản đơn giản, và yêu cầu Matlab mở file thực hiện lệnh chính xác như
là tại dấu nhắc của Matlab tại cửa sổ lệnh, những file này gọi là Script file hay
còn gọi là M_file. Danh từ Script để chỉ rằng thực tế Matlab đọc từ file kịch
bản tìm thấy trong file. Danh từ M_file để chỉ rằng tên script file đó phải kết
thúc bằng phần mở rộng là ‘.m’. Tên của file phải bắt đầu bằng một ký tự.
Các bước thực hiện như sau:
Bước 1: File/ New/ M-file, môi trường soạn thảo Editor/ Debugger xuất
hiện
B ước 2: Trên màn hình soạn thảo gõ vào các lệnh sau:
%tinh gia tri bieu thuc
x=input('Nhap x=');
y=x+3;
z=y+4;
y
z
disp(y);

5
Bài giảng Matlab

disp(z);

Bước 3: Ghi lại nội dung tập tin với tên vidu.m rồi trở về cửa sổ lệnh.
Bước 4: Tại cửa sổ lệnh gõ tên tệp tin, ta được kết quả sau:
>> vidu ↵
Nhap x=3 ↵
y=
6
z=
10
6
10
1.5 Hàm M_File
Khi sử dụng các hàm của Matlab như hàm sin, cos,… Matlab nhận giá
trị truyền vào, sau đó hàm trả về kết quả tính toán. Các lệnh tính toán bằng hàm
cũng như các biến trung gian được tạo ra bởi các lệnh này ta đều không nhìn
thấy, tất cả những gì thấy được chỉ là giá trị nhập vào và các giá trị đưa ra, vì
vậy có thể coi một hàm như một hộp đen. Các thuộc tính này làm cho hàm trở
lên hữu dụng đối với các lệnh tính toán mà phải dùng đến các hàm toán học
phức tạp thường xuất hiện khi ta giải quyết vấn đề lớn. Dựa vào ưu điểm này,
Matlab cung cấp một cấu trúc để ta có thể tự tạo một hàm cho mình dưới dạng
M_file.
Cú pháp khai báo hàm M_file:

6
Bài giảng Matlab

Funtion [tên kết quả] = tên hàm[(danh sách các biến)]


Phần thân của chương trình hàm là các lệnh của Matlab thực hiện việc
tính toan giá trị của đại lượng được nêu trong phần tên kết quả theo các biến
được nêu trong phần danh sách các biến.
Các biến chỉ có tác dụng nội trong hàm khai bào, các biến trong danh
sách được phân cách nhau bởi dấu phẩy “,”
Các quy luật và thuộc tính của hàm M_file
Hàm M_file phải tuân theo những quy luật và thuộc tính nhất định,
ngoài ra chúng còn có một số tính chất sau:
(1) Tên hàm phải trùng tên file (tên hàm không có phần mở rộng ‘.m’)
(2) Khi Matlab thực hiện lần đầu hàm M_file, nó sẽ mở file văn bản
tương ứng và dịch dòng lệnh của file đó ra một dạng mã lưu trong bộ nhớ nhằm
mục đích tăng tốc độ thực hiện các lời gọi hàm tiếp theo. Nếu trong hàm có
chứa lời gọi hàm M_file khác thì các hàm đó cũng được dịch vào trong bộ nhớ.
(3) Các dòng chú thích cho tới dòng đầu tiên không phải là chú thích
trong hàm M_file là những dòng văn bản, nó sẽ hiện ra khi sử dụng lệnh Help.

Ví dụ:
>> help vidu ↵
tinh gia tri bieu thuc
(4) Mỗi hàm có một không gian làm việc riêng tách biệt so với môi
trường Matlab, mối quan hệ duy nhất giữa các biến trong hàm với môi trường
Matlab là các biến vào ra của hàm đó.
Nếu bản thân hàm giá trị bị thay đổi thì sự thay đổi này chỉ tác động bên
trong của hàm đó mà không làm ảnh hưởng đến các biến của môi trường
Matlab.
Các biến được tạo ra bên trong một hàm thì chỉ nằm trong không gian
làm việc của hàm đó và được giải phóng khi hàm kết thúc, vì vậy không thể sử
dụng thông tin của lần gọi trước cho lần gọi sau.
(5) Số các tham số vào và ra khi một hàm được gọi thì chỉ có tác dụng
bên trong hàm đó.

7
Bài giảng Matlab

Biến nargin chứa các tham số đưa vào.


Biến nargout chứa các giá trị đưa ra.
Trong thực tế thì các biến này thường được sử dụng để xác định giá trị
ra dựa vào số lượng các đối số đưa vào.
(6) Việc thi hành hàm M_file sẽ kết thúc khi gặp dòng cuối cùng của file
đó hoặc gặp dòng lệnh Return giúp ta kết thúc một hàm mà không cần phải thi
hành hết các lệnh của hàm đó.
Ví dụ: Tính giá trị tổng bình phương hai số được nhập từ bàn phím
Bước 1: Tạo hàm M_file:
% ham M_file
function y=fvidu(x1,x2)
y=x1*x1+x2*x2;
vao=nargin
ra=nargout
Sau đó ghi tên file: fvidu.m
Bước 2: Tạo script file
%Scip file
t1=input('Nhap so thu nhat:');
t2=input('Nhap so thu hai:');
kq=fvidu(t1,t2);
kq
Sau đó ghi tên file là: vidu
Bước 3: Thoát khỏi script file, Tại dấu nhắc của Matlab gõ vào tên file
vidu được kết quả sau:
>> vidu ↵
Nhap so thu nhat:3↵
Nhap so thu hai:4↵
vao =
2
ra =
1

8
Bài giảng Matlab

kq =
25
(7) Một M_file có thể chứa nhiều hàm. Hàm chính trong M_file này
phải được đặt tên trùng với tên của M_file như đã đề cập ở trên. Các hàm khác
được khai báo thông qua câu lệnh Function được viết sau hàm đầu tiên. Các
hàm con chỉ được sử dụng bởi các hàm chính, có nghĩa là ngoài hàm chính ra
thì không có hàm nào khác để gọi được chúng. Tính năng này cung cấp một
giải pháp hữu hiệu để giải quyết từng phần của hàm chính một cách riêng rẽ
làm giảm bớt các khó khăn khi ta lập trình một hàm lớn.
Ví dụ: Ở ví dụ trước hàm M_file ta sửa lại như sau:
% ham M_file
function y=fvidu(x1,x2)
vao=nargin;
ra=nargout;
vao
ra
y=hamcon(x1,x2);
function z=hamcon(x1,x2);
z=x1*x1+x2*x2;
Kết quả ta thu được như trước.
Sự khác biệt của hàm M_file và Script file
(1) Điểm giống nhau:
- Cùng là các file văn bản
- Có cùng phần mở rộng là ‘.m’.
(2) Điểm khác nhau:
- Các hàm M_file không được nhập từ cửa sổ lệnh.
- Hàm M_file chỉ trao đổi thông tin với Matlab thông qua các biến truyền vào
và các biến ra mà nó tạo thành, các biến trung gian ở trong hàm thì không xuất
hiện hay tương tác với môi trường Matlab.

9
Bài giảng Matlab

Nói tóm lại, hàm M_file cung cấp cho ta một phương pháp đơn giản để
mở rộng khả năng của Matlab. Trong thực tế rất nhiều hàm của Matlab là các
hàm M_file.
1.6 Vẽ các hàm
Khi muốn vẽ một hàm nào đó, phải xác định hàm đó trong một file ‘.m’
sau đó sử dụng lệnh: Fplot(‘tên hàm’, [khoảng vẽ])
Ví dụ: Tạo hàm M_file
% ham M_file
function y=fvidu(x)
y=x*x;
trong cửa sổ lệnh nhập vào lệnh: >> fplot('fvidu',[-1,1]) ↵
ta được kết quả hình vẽ như sau:

Lưu ý: - Tên hàm phải đặt trong dấu nháy đơn (Tên hàm nhận vào dưới dạng
một xâu ký tự)
- Phải chỉ ra đoạn cần vẽ.
Bài tập: Lập chương trình nhập vào từ bàn phím ba số thực a,b,c. Sau đó vẽ đồ
thị của hàm số y=ax2+bx+c (sử dụng file hàm và script file).

10
Bài giảng Matlab

CHƯƠNG 2
MA TRẬN VÀ CÁC PHÉP TOÁN TRÊN MA TRẬN
2.1 Các phép toán số học và logic trong Matlab
2.1.1 Phép toán số học
Matlab có hai kiểu phép toán số học, đó là phép toán ma trận (matrix
arithmatic operation) và phép toán mảng (array arithmatic operation). Phép
toán ma trận được định nghĩa bởi các luật của đại số tuyến tính. Phép toán
mảng được thực hiện tương ứng từng phần tử, chẳng hạn phép nhân mảng hai
ma trận A{a(i,j)} và B{b(i,j) } được thực hiện bằng cách nhân tương ứng từng
phần tử của A và B. c(i,j)=a(i,j)*b(i,j)
Để phân biệt giữa phép toán ma trận và phép toán mảng người ta đưa
thêm vào trước các toán tử một dấu chấm “.”
Phép toán ma trận theo luật Phép toán mảng không theo
đại số tuyến tính luật đại số tuyến tính
Phép toán Toán tử Phép toán Toán tử
Cộng + Cộng +
Trừ - Trừ -
Nhân. * Nhân. .*
Chia phải / Chia phải ./
Chia trái \ Chia trái .\
Luỹ thừa. ^ Luỹ thừa. .^
Phép gán. = Phép gán. =
Thứ tự ưu tiên các phép toán
Ngoặc đơn
Luỹ thừa
Nhân, chia
Cộng, trừ
2.1.2 Các phép toán quan hệ

11
Bài giảng Matlab

Các phép toán quan hệ bao gồm


- Nhỏ hơn: <
- Nhỏ hơn hoặc bằng: <=
- Lớn hơn: >
- Lớn hơn hoặc bằng: >=
- Bằng: = =
- Không bằng: ~ =
Biểu thức có các toán tử quan hệ nhận giá trị đúng (true) hoặc sai
(false). Trong Matlab, biểu thức đúng có giá trị là 1, biểu thức sai có giá trị là 0.
Ví dụ:
>> x=3==3
x=
1
>> x=3~=3
x=
0
2.1.3 Các phép toán logic và các hàm logic
Các phép toán logic được thực hiện bởi các câu lệnh sau:
- Phép And: &
- Phép Or: |
- Phép phủ định: ~
Các hàm logic: and, or, xor, not
2.1.4 Số phức và các phép toán về số phức
Biểu diễn số phức:
Tên biến = Phần thực + Phần ảo i
hoặc
Tên biến = Phần thực + Phần ảo j
Ví dụ: a= 2+3i
Các phép toán đối với số phức: Cộng(+), trừ(-), nhân(*), chia(/)
Các hàm đặc biệt trên số phức: x=a+bi
real(x): Trả về phần thực của số phức x

12
Bài giảng Matlab

image(x): Trả về phần ảo của số phức x


conj(x): Trả về số phức liên hợp của số phức x
Ví dụ:
>> x=1+1i ↵
x=
1.0000 + 1.0000i
>> conj(x) ↵
ans =
1.0000 - 1.0000i
abs(x): Trả về modul của số phức x
Ví dụ
>> x=3+4i ↵
x=
3.0000 + 4.0000i
>> abs(x) ↵
ans =
5
angle(x): agument của số phức x (arctn(b/a))
Ví dụ:
x=
1.0000 + 1.0000i
>> angle(x) ↵
ans =
0.7854
2.1.5 Các hàm toán học
Trong mục này giới thiệu một số hàm toán học thông dụng thường gặp
khi lập trình.
Tên hàm Cú pháp Giải thích
Sin sin(x) Hàm sin
cos cos(x) Hàm cos
Tan tan(x) Hàm tang

13
Bài giảng Matlab

asin asin(x) Hàm arcsin


acos acos(x) Hàm arccos
atan atan(x) Hàm arctang
acos acos(x) Hàm arccos
sinh sinh(x) Hàm sin hyperbolic
cosh cosh(x) Hàm cos hyperbolic
tanh tanh(x) Hàm tang hyperbolic
asinh asinh(x) Hàm arcsin hyperbolic
acosh acosh(x) Hàm arccos hyperbolic
atanh atanh(x) Hàm arctang hyperbolic
abs abs (x) Giá trị tuyệt đối hoặc modulo của số phức
round round(x) Làm tròn đến số nguyên gần nhất
Fix fix(x) Làm tròn về không
floor floor(x) Làm tròn về - ∞
ceil ceil(x) Làm tròn về + ∞
rem rem(x,y) Phần dư của x chia y
gcd gcd(x,y) Ước số chung lớn nhất của hai số nguyên x và y
Lcm lcm(x,y) Bội số chung nhỏ nhất của hai số nguyên x và y
exp exp(x) Luỹ thừa của e
Log log(x) Logarit cơ số e
Log2 log2(x) logarit cơ số 2
Log10 log10(x) logarit cơ số 10
sqrt sqrt(x) Căn bậc hai của x
2.2 Ma trận
Khái niệm
Ma trận là một mảng hai chiều mà các phần tử có thể là số thực hoặc số
phức hoặc cũng có thể là các ký tự không số.
Khi biểu diễn ma trận trong Matlab thì tên ma trận là một chuỗi có tối đa
là 31 ký tự và bắt đầu là chữ sau đó có thể là chữ hoặc số hoặc một số ký tự đặc
biệt (ngoại trừ các ký tự: +,-,*,/,..).
Bao quanh các phần tử của ma trận là dấu ngoặc vuông: [ai j]
Các phần tử trong một hàng của ma trận được cách nhau bởi ký tự trắng
(space) hoặc dấu phẩy
Các hàng được phân cách nhau bởi dấu chấm phẩy
Các cách để nhập dữ liệu cho ma trận
(1) Liệt kê trực tiếp
Ví dụ:
>> M=[3 2 3;3 4 5] ↵

14
Bài giảng Matlab

M=
3 2 3
3 4 5
(2) Nhập thông qua lệnh input
Ví dụ:
>> M=input('Hay nhap ma tran M=') ↵
Hay nhap ma tran M=[3 4 5;4 3 2] ↵
M=
3 4 5
4 3 2
Chú ý: - Khi kết thúc lệnh có thể dùng dấu chấm phẩy (;) hoặc không.
Nếu kết thúc bằng dấu chấm phẩy thì kết quả không hiển thị lên màn hình. Nếu
không sử dụng dấu chấm phẩy thì kết quả được hiển thị lên màn hình. Tuy
nhiên trong cả hai trường hợp dữ liệu đều được lưu trong không gian làm việc
của Matlab và được sử dụng cho lần tiếp theo.
Ví dụ:
>> a=[1 2;2 3]; ↵
>> b=[4 5;1 2]; ↵
>> c=a*b ↵
c=
6 9
11 16
- Các phần tử trong ma trận có thể là số phức:
Ví dụ:
>> M=[1+i 2+2i; 1+2i 2+i] ↵
M=
1.0000 + 1.0000i 2.0000 + 2.0000i
1.0000 + 2.0000i 2.0000 + 1.0000i
- Các phần tử trong ma trận có thể là các ký tự (biểu tượng). Nhưng
trước hết cần khai báo bằng lệnh Syms (Khai báo là các biến Symbolic)

15
Bài giảng Matlab

Ví dụ:
>> syms sinx cosx tanx ↵
>> b=[sinx cosx; cosx tanx] ↵
b=
[ sinx, cosx]
[ cosx, tanx]
Hiển thị dữ liệu của ma trận
- Gõ trực tiếp tên ma trận sau đó nhấn phím ↵
Ví dụ:
>> b=[sinx cosx; cosx tanx]; ↵
>> b ↵
b=
[ sinx, cosx]
[ cosx, tanx]
- Dùng lệnh disp để hiển thị dữ liệu nhưng không hiển thị tên ma trận.
Ví dụ:
>> b=[sinx cosx; cosx tanx]; ↵
>> disp(b) ↵
[ sinx, cosx]
[ cosx, tanx]
2.3 Xử lý trong ma trận và vector
Tạo vector
Để tạo vector ta có các cách sau:
STT Cú pháp Chú thích Ví dụ
>> x=[1 4 2]
Tạo vector hàng x chứa các
1 X=[x1 x2..xn ] x=
phần tử đặc biệt
1 4 2
2 X=first:last Tạo vector hàng x bắt đầu >> x=1:4.3
tại first và kết thúc là phần x =
tử có giá trị nhỏ hơn hoặc 1 2 3 4

bằng last, phần tử sau bằng

16
Bài giảng Matlab

phần tử trước cộng 1


Tạo vector x bắt đầu tại
first, phần tử sau bằng phần >> x=1:2:6
3 X=first:inc:last tử trước cộng inc, kết thúc là x =
phần tử có giá trị nhỏ hơn 1 3 5

hoặc bằng last


>>
Tạo vector hàng x bắt đầu
x=linspace(2,8,4)
4 X=linspace(first, last, n) tại first, kết thúc là last,
x=
vector có n phần tử.
2 4 6 8
Truy nhập tới các phần tử của ma trận
Matlab cho phép ta xử lý đến từng phần tử của ma trận. Để truy nhập tới
phần tử của ma trận ta sử dụng tới chỉ số của từng phần tử:
Cú pháp: Tên ma trận(chỉ số hàng, chỉ số cột)
Ví dụ:
>> a=[1 3; 2 1] ↵
a=
1 3
2 1
>> a(1,2)
ans =
3
Lưu ý: Chỉ số của mảng phải là số nguyên dương hoặc có kiểu logic
2.4 Các ma trận đặc biệt
Ma trận zeros: zeros(số hàng, số cột)
Tất cả các phần tử trong ma trận đều bằng không
Ví dụ:
>> c=zeros(2,3) ↵
c=
0 0 0
0 0 0
Ma trận Ones: Ones(số hàng, số cột)

17
Bài giảng Matlab

Ví dụ
>> c=ones(2,3) ↵
c=
1 1 1
1 1 1
Ma trận ma phương
Tổng tất cả giá trị các phần tử trên hàng=tổng tất cả giá trị các phần tử
trên cột=tổng các giá trị các phần tử trên đường chéo của ma trận
Cú pháp: magic(cấp ma trận)
Ví dụ:
>> magic(3) ↵
ans =
8 1 6
3 5 7
4 9 2
Ma trận eye (Ma trận đồng nhất)
Tất cả các phần tử trên đường chéo bằng 1, các phần tử khác có giá trị 0.
Cú pháp: eye(số hàng, số cột)
Ví dụ:
>> m=eye(2,3) ↵
m=
1 0 0
0 1 0
Ma trận pascal
Cú pháp: Pascal(cấp ma trận)
Ví dụ
>> m=pascal(3) ↵
m=
1 1 1
1 2 3

18
Bài giảng Matlab

1 3 6
Ma trận compan(tạo ma trận vuông rỗng: [])
Cú pháp: compan(cấp ma trận)
2.5 Các phép toán vector
Phép toán Biểu thức Cú pháp Ví dụ
>> A=[1 3 4];

>> B=A;

Gán A=B A=B >> B

B=

1 3 4
>> C=A+B

Cộng, trừ A+B, A-B A+B, A-B C =

2 6 8
>> C=A.*B

Nhân A.B A.*B C=

1 9 16
>> D=C.\A

Chia trái B\A B.\A D=

1.0000 0.3333 0.2500


>> D=C./A

Chia phải A/B A./B D=

1 3 4
>> D=A.^B

Luỹ thừa AB A.^B D=

1 27 256
Ngoài ra còn có phép cộng, trừ, nhân, chia, luỹ thừa một số với một vector
Tìm kiếm mảng con
Nhiều khi ta muốn biết các chỉ số hay danh sách các chỉ số của những
phần tử của một mảng mà thoả mãn một biểu thức quan hệ, trong Matlab để

19
Bài giảng Matlab

thực hiện việc đó ta sử dụng hàm Find, hàm này trả về danh sách con chỉ số tại
những phần tử mà biểu thức quan hệ của chúng là đúng.
Ví dụ:
>> A=[-3 -1 -5 0 5 6] ↵
A=
-3 -1 -5 0 5 6
>> find(abs(A)>3) ↵
ans =
3 5 6
Hàm cho biết số phần tử của vector: length(tên vector)
2.6 Các phép toán về ma trận
Phép chuyển vị
Phép chuyển đổi vetor hàng thành vector cột gọi là phép chuyển vị, thực
hiện phép chuyển vị bằng dấu nháy đơn (‘).
Ví dụ:
>> A=[2 3 4;3 4 5] ↵
A=
2 3 4
3 4 5
>> A' ↵
ans =
2 3
3 4
4 5
Nếu cả hai vector x và y là các vector mà các phần tử là các số thực thì
tích x*y không được định nghĩa, nhưng x*y` được coi như là tích vô hướng.
Ví dụ:
>> x=[2 3 4] ↵
x=
2 3 4

20
Bài giảng Matlab

>> y=[1 2 3] ↵
y=
1 2 3
>> t=x*y' ↵
t=
20
Đối với ma trận hay vector có các phần tử là số phức z, đại lượng z` biểu
thị chuyển vị liên hợp của z. Phép chuyển vị không liên hợp của số phức biểu
thị bởi z.` tương tự như các phép toán mảng khác.
Ví dụ:
>> z=1+2i;↵
>> z' ↵
ans =
1.0000 - 2.0000i
Ví dụ:
>> A=[1+2i 2+i; 3-i 4+2i] ↵
A=
1.0000 + 2.0000i 2.0000 + 1.0000i
3.0000 - 1.0000i 4.0000 + 2.0000i
>> A' ↵
ans =
1.0000 - 2.0000i 3.0000 + 1.0000i
2.0000 - 1.0000i 4.0000 - 2.0000i
Phép nghịch đảo của ma trận
Nếu A là một ma trận vuông, định thức của A khác không, khi đó A-1
được gọi là nghịch đảo của A nếu A.A-1 = I.
Cú pháp: inv(A)
Ví dụ:
>> A=[1 2; 3 4] ↵
A=

21
Bài giảng Matlab

1 2
3 4
>> inv(A) ↵
ans =
-2.0000 1.0000
1.5000 -0.5000
Về mặt lý thuyết thì B*inv(A) tương đương B/A, inv(A)*B tương
đương A\B, tuy nhiên các phép toán / \ thường được sử dụng nhiều hơn, vì
chúng thực hiện nhanh hơn, sai số ít hơn.
Phép cộng, trừ trên ma trận
Phép cộng, trừ ma trận được định nghĩa như là đối với mảng, cộng hoặc
trừ trên ma trận phải đảm bảo cả hai ma trận phải có cùng kích thước hoặc một
trong hai ma trận là vô hướng.
A±B ={ai j ± bi j }, c ± B ={c ± bi j }
Phép nhân, chia trên ma trận
C = A*B khi đó C = {ci j: ci j =Σai kbk j }
C = A/B tương đương C = A*inv(B)
Phép luỹ thừa và số mũ của ma trận
Nếu p là một số nguyên dương thì A^p = A*A*…*A (nhân A lần)
Nếu p là số nguyên nhỏ hơn không, A là ma trận vuông và tồn tại nghịch
đảo thì A^p = inv(A)*inv(A)*…*inv(A) (nhân p lần).
Phép quay ma trận
rot90(A): Quay ma trận A đi một góc 900 ngược chiều kim đồng hồ.
rot(A, k): Quay ma trận đi một góc k*900 ngược chiều kim đồng hồ.
Tính định thức ma trận: det(A)
Tính hạng của ma trận A: rank(A)
2.7 Các hàm logic trên ma trận và vector
Trong phần trước ta đã biết một số các phép toán logic, thì ở phần này ta
đề cập đến một số các hàm logic sau:
Tên hàm Chú thích
any(x) Trả lại 1 nếu tồn tại một phần tử khác 0 trong x, trả lại 1 cho mỗi

22
Bài giảng Matlab

cột trong ma trận x mà có các phần tử khác 0


Trả lại 1 nếu tất cả các phần tử của vector x khác 0, trả lại một
all(x)
cho mỗi cột trong ma trận x mà tất cả các phần tử khác 0
isequal(A,B) Hàm trả lại 1 nếu A và B giống nhau
isnumeric(x) 1 khi đối số là mảng số

Bài tập. Nhập vào ma trận An,n và vetor bn. Hãy giải phương trình Ax=b.

23
Bài giảng Matlab

CHƯƠNG 3
LẬP TRÌNH TRONG MATLAB
Các ngôn ngữ lập trình và máy tính có khả năng đều cho phép điều
khiển vòng lặp của câu lệnh dựa trên những cấu trúc của nó. Matlab đưa ra các
dạng vòng lặp có điều khiển: for, while, cấu trúc if-else-end và cấu trúc switch
case. Vì cấu trúc thường hoàn thiện các lệnh của Matlab, nên chúng thường
xuất hiện trong M-file hơn là trong câu lệnh đánh trực tiếp tại dấu nhắc của
Matlab.
3.1 Cấu trúc if-else-end
Nhiều khi ta cần thực hiện những câu lệnh được thực hiện theo một điều
kiện nào đó. Trong ngôn ngữ lập trình, logic này được cung cấp bởi cấu trúc if-
else-end. Cú pháp của cấu trúc này như sau:
- Dạng 1:
if Biểu thức điều kiện
Khối lệnh…
end;
Khối lệnh được thực hiện nếu điều kiện đúng
- Dạng 2:
if Biểu thức điều kiện
Khối lệnh 1…
else
Khối lệnh 2…
end;
Nếu điều kiện đúng thì khối lệnh 1 được thực hiện
Ngược lại, nếu điều kiện sai thì khối lệnh 2 được thực hiện.
- Dạng 3:
if Biểu thức điều kiện 1
Khối lệnh 1
elseif Biểu thức điều kiện 2
Khối lệnh 2

24
Bài giảng Matlab

……………………………..
elseif Biểu thức điều kiện n
Khối lệnh n
else
Khối lệnh được thực hiện nếu không có điều kiện nào đúng
end;
Trong mẫu này, khi biểu thức điều kiện đầu tiên đúng thì các lệnh sau
không được kiểm tra nữa, các cấu trúc if-else-end được bỏ qua. Hơn nữa câu
lệnh else ở cuối có thể không cần cho vào.
Ví dụ: Giải phương trình bậc hai ax2 + bx + c =0, trong đó a, b, c được nhập từ
bàn phím (Sử dụng script file, không dùng lệnh roots của Matlab)
3.2 Cấu trúc switch-case
Khi một chuỗi các lệnh đánh giá dựa trên một biểu thức thử hoặc biểu
thức điều kiện với nhiều giá trị thử khác nhau, người ta thường dùng cấu trúc
switch-case có dạng như sau:
switch Biểu thức điều kiện
case Giá trị thử 1
Khối lệnh 1
case {Giá trị thử 2, Giá trị thử 3, Giá trị thử 4}
Khối lệnh 2
otherwise
Khối lệnh 3
end;
Lưu ý: Biểu thức điều kiện phải có dạng số hoặc chuỗi, nếu biểu thức điều kiện
là dạng số thì lệnh case sẽ thử xem giá trị của biểu thức có bằng giá trị thử i
hay không. Nếu biểu thức điều kiện là một chuỗi thì lệnh case sẽ so sánh chuỗi
đó với giá trị thử thứ i. Biểu thức điều kiện được đem so sánh với giá trị thử 1,
nếu chúng bằng nhau thì khối lệnh đầu tiên được thực hiện, mà các khối lệnh
tiếp theo cho đến trước trạng thái end được bỏ qua, nếu chúng không bằng
nhau thì điều kiện tiếp tục được đem so sánh với giá trị thử 2, giá trị thử 3, giá
trị thử 4, nếu một trong các giá trị này bằng biểu thức điều kiện thì khối lệnh 2

25
Bài giảng Matlab

được thực hiện. Nếu tất cả các lệnh so sánh của case đều không đúng thì khối
lệnh 3 được thực hiện.
Chú ý: Trong cấu trúc switch-case có ít nhất một nhóm lệnh phải được thực
hiện.
Ví dụ:
Nhập vào 2 số thực và một phép toán(+,-,*,/), sau đó cho biết kết quả của
phép toán lên hai số được nhập
3.3 Cấu trúc lặp
Vòng lặp For
Vòng lặp for cho phép một nhóm lệnh thực hiện lặp lại một số lần cố
định.
Cú pháp:
for x = array
Khối lệnh
end;
Các câu lệnh giữa hai trạng thái for và end được thực hiện một lần cho
tất cả các cột của mảng array. Tại mỗi lần lặp, x được gán cho phần tử cột tiếp
theo như trong suốt n lần của vòng lặp.
VD: (1) Tính tổng n số tự nhiên liên tiếp thoả mãn điều kiện số được cộng
phải là số chia hết cho 5, n được nhập từ bàn phím (sử dụng Script file).
(2) Hãy nhập vào một ma trận cấp n, sau đó kiểm tra xem ma trận vừa
nhập có phải là ma phương hay không. Thông báo kết quả ra màn hình (n được
nhập từ bàn phím, sử dụng script file)
Vòng lặp While
Vòng lặp While thực hiện lặp lại một nhóm lệnh một số lần cố định,
nhưng không biết trước số lần lặp.
Cú pháp:
while <Biểu thức điều kiện>
Khối lệnh
end;

26
Bài giảng Matlab

Khối lệnh giữa hai trạng thái while và end được thực hiện lặp đi lặp lại
khi tất cả các biểu thức điều kiện là đúng. Thông thường giá trị của điều kiện
đưa ra kết quả là một số. Nhưng nếu kết quả đưa ra là một mảng thì vẫn hợp lệ.
Trong trường hợp là mảng, tất cả các phần tử trong mảng kết quả đưa ra phải là
True (đúng).
Ví dụ:
(1) Hãy nhập vào một số cho tới khi số được nhập có giá trị bằng
không (sử dụng Script file).
(2) Cho x0 là một số nguyên dương bất kỳ. Giả sử chuỗi xk được
định nghĩa như sau:
xk+1=xk/2 nếu xk chẵn
xk+1 = 3xk +1 nếu xk lẻ.
Hãy tính giá trị của xk cho tới khi xk <=1 hoặc k > 500.
Vẽ đồ thị của chuỗi bằng lệnh Plot.
Các lệnh Break, return, error
Lệnh break: Kết thúc sự thực thi vòng lặp for hoặc while
Lệnh return: Thường được sử dụng trong các hàm của Matlab. Lệnh
return cho phép quay trở về thực thi những lệnh nằm trong tác dụng của lệnh
return.
Lệnh error(‘dòng thông báo’): Kết thúc thực hiện lệnh và hiển thị dòng
thông báo lên màn hình.
Ví dụ:
Nhập vào 2 số thực và một phép toán(+,-,*,/), sau đó cho biết kết quả của
phép toán lên hai số được nhập, nếu phép toán không hợp lệ thì thông báo
phép toán không hợp lệ bằng lệnh error.
Bài tập:
Một số hàm xâu ký tự cần dùng: num2str(số): chuyển từ số sang xâu.
Str2num(xâu): chuyển từ xâu sang số. strcat(s1,s2,..): Nối các xâu.
1. Lập chương trình thực hiện các việc sau:
- tính giá trị của đa thức P(x) = a0xn +a1xn-1+…+an bằng sơ đồ HoocNe. Trong
đó n, các hệ số ai (0=1,2,..,n) được nhập từ bàn phím.

27
Bài giảng Matlab

Sơ đồ HoocNe:
b0 = a0
b1 = a1 +b0x
b2 = a2 + b1x
……………
bn = an + bn-1x
bn tính được là giá trị của p(x).
- Vẽ đồ thị của hàm đa thức P(x).
2. Sử dụng Script file và file hàm hãy lập chương trình nhập vào một ma trận A
cấp n, n được nhập từ bàn phím (Nếu n < 1 thì yêu cầu nhập lại). Việc nhập ma
trận thực hiện bằng cách nhập từng phần tử. Sau đó tính định thức của ma trận
A. Nếu định thức khác không thì cho biết ma trận nghich đảo của A và giải hệ
phương trình Ax = b, trong đó b là một vector gồm n phần tử được nhập từ bàn
phím. Còn ngược lại thì thông báo định thức bằng không. Hiển thị kết quả ra
màn hình.

28
Bài giảng Matlab

CHƯƠNG 4
CÁC HÀM TOÁN HỌC TRONG
ĐẠI SỐ VÀ GIẢI TÍCH SỐ
4.1 Các phép tính đối với đa thức và tối ưu hoá
4.1.1 Các phép tính đối với đa thức
 Tìm nghiệm của đa thức và tìm đa thức khi biết nghiệm
Tìm nghiệm khi biết đa thức
Tìm nghiệm của đa thức là tìm giá trị để đa thức bằng không, một bài
toán thường gặp trong thực tế. Matlab có thể giải quyết những bài toán này và
đồng thời cung cấp những công cụ để tính toán đa thức. Trong Matlab một đa
thức được biểu diễn bằng một vector hàng các hệ số với bậc giảm dần.
Ví dụ: đa thức x6+ x4 -7x3+ 20x+116 được nhập vào như sau:
>> p=[1 0 1 -7 20 116]↵
p=
1 0 1 -7 20 116
Lưu ý: Mục dành cho hệ số 0 cũng phải được nhập vào, nếu không
Matlab sẽ không hiểu được hệ số của biểu thức bậc mấy là không.
Sử dụng dạng này thì nghiệm của một đa thức có thể tìm được bằng lệnh
roots: Cú pháp roots(Tên vector hệ số)
Ví dụ:
>>r= roots(p)↵
r=
2.1626 + 1.5807i
2.1626 - 1.5807i
-1.1350 + 2.5648i
-1.1350 - 2.5648i
-2.0551
Vì trong Matlab cả đa thức và các nghiệm của nó đều là vector, nên
Matlab ngầm quy ước đa thức là vector hàng, còn các nghiệm là vector cột.
Tìm đa thức khi biết nghiệm

29
Bài giảng Matlab

Khi biết nghiệm của đa thức ta có thể tìm đa thức bằng lệnh poly. Cú
pháp: poly(tên vector nghiệm)
Ví dụ:
>> pp=poly(r)↵
pp =
1.0000 0.0000 1.0000 -7.0000 20.0000 116.0000
 Nhân đa thức
Hàm conv thực hiện nhân hai đa thức (thực ra là hai ma trận). Cú pháp
conv(a,b), trong đó a là vector hệ số đa thức thứ nhất, b là vector hệ số đa thức
thứ hai.
Ví dụ:
A(x)=x3+3x2+2x+4; B(x)=2x+3
>> a=[1 3 2 4];↵
>> b=[2 3];↵
>> conv(a,b)↵
ans =
2 9 13 14 12
C(x) = 2x4+9x3+13x2+14x+12
Khi nhân nhiều đa thức với nhau thì ta phải sử dụng lệnh conv nhiều lần
 Phép cộng đa thức
Matlab không cung cấp các hàm trực tiếp thực hiện phép cộng đa thức,
dùng phép cộng ma trận chỉ có tác dụng khi hai đa thức là hai vector có cùng
kích thước, nên khi hai đa thức có bậc khác nhau thì đa thức có bậc thấp hơn
phải được thêm vào các hệ số 0 để cho bậc của nó có cùng bậc với đa thức có
bậc cao hơn.
Ví dụ: a(x)=x3+2x2+x+7; b(x)=2x+4.
>> a=[1 2 1 7];↵
>> b=[0 0 2 4];↵
>> c=a+b↵
c=

30
Bài giảng Matlab

1 2 3 11
c(x)=x3+2x2+3x+11
Bài tập:
Lập hàm M_file function p=polyadd(a,b) tính tổng hai đa thức mà
vector hệ số là a và b, kết quả trả về đa thức có vector hệ số p. Nếu tham số
truyền vào là một tham sô thì thông báo lỗi ‘chua du tham so’, nếu lớn hơn hai
tham số thì thông báo lỗi ‘co qua nhieu tham so, ngược lại nếu hai tham số thì
tính tổng hai đa thức (Biết rằng hai đa thức a và b là bất kỳ, không nhất thiết
phải cùng bậc).
Ở cửa sổ lệnh nhập vào hai vector a và b, sau đó tính gọi lệnh
p=polyadd(a,b)↵
 Chia hai đa thức
Tong một số trường hợp ta phải chia đa thức này cho một đa thức khác,
trong Matlab công việc này được thực hiện bởi hàm deconv.
Cú pháp: deconv(a,b): a, b là các vector hệ số của các đa thức. Lấy đa
thức a chia cho đa thức b.
Ví dụ:
>> a=[2 10 17 15];↵
>> b=[1 3];↵
>> c=deconv(a,b)↵
c=
2 4 5
 Đạo hàm
p(x) = a0xn + a1xn-1 + …+ an-1x +an
p’(x)= na0 xn-1+ (n-1)a1xn-2 +…+ an-1
Cú pháp: polyder(p)
Ví dụ
>> p=[2 3 4 5];↵
>> polyder(p)↵
ans =

31
Bài giảng Matlab

6 6 4
 Tính giá trị của một đa thức
Cú pháp: polyval(p, x): tính giá trị của đa thức p tại x.
p: là vector hệ số của đa thức p(x), x: là một giá trị vô hướng hoặc cũng có thể
là một mảng, nếu là mảng thì hàm tính giá trị của đa thức tại các phần tử của
mảng.
Ví dụ: Tính giá trị p(x)=2x3 + 3x2 + 4x +5, sau đó vẽ p(x) bằng
lệnh plot.
>> p=[2 3 4 5];↵
>> x=[1 2 3];↵
>> polyval(p,x)↵
ans =
14 41 98
>>plot(x,ans);xlabel('x');ylabel('y');title('14x^2+41x+98');↵

 Phân thức hữu tỉ

32
Bài giảng Matlab

Khi gặp những bài toán liên quan đến tỉ số của hai đa thức hay còn gọi
là phân thức hữu tỉ.
Ví dụ: n(x)/d(x) = (N1xm + N2xm-1 +…+Nm+1)/(D1xn + D2xn-1 +…+Dn+1)
Trong Matlab phân thức cũng được mô phỏng bằng hai đa
thức riêng rẽ. Ví dụ:
>> n=[1 -10 100]↵
n=
1 -10 100
>> d=[1 10 100 0]↵
d=
1 10 100 0
>> z=roots(n)↵
z=
5.0000 + 8.6603i
5.0000 - 8.6603i
>> p=roots(d)↵
p=
0
-5.0000 + 8.6603i
-5.0000 - 8.6603i
Đạo hàm của phân thức này theo biến x được tính như sau:
>> [nd,dd]=polyder(n,d)↵
nd =
-1 20 -100 -2000 -10000
dd =
1 20 300 2000 10000 0 0
Trong đó nd và dd là tử thức và mẫu thức của đạo hàm. Phần dư của phân thức
được tính:
>> [r,p,k]=residue(n,d)↵
r=

33
Bài giảng Matlab

0.0000 + 1.1547i
0.0000 - 1.1547i
1.0000
p=
-5.0000 + 8.6603i
-5.0000 - 8.6603i
0
k=
[]
Trong trường hợp này hàm residue trả về các hệ số mở rộng phân thức
từng phần r, các nghiệm của phân thức là p và phần thương chia hết của phân
thức là k. Nếu bậc của tử số nhỏ hơn bậc của mẫu số thì phân thức chia hết sẽ
bằng không. Trong ví dụ trên thì phần mở rộng phân thức từng phần của phân
thức đã cho là:
n(x)/d(x) = 1.1547/(x+5-8.6603i) + -1.1547i/(x-5+8.6603i) + 1/x
Nếu cho trước các đa thức này thì phân thức ban đầu sẽ tìm được bằng
cách sử dụng hàm residue.
>> [nn,dd]=residue(r,p,k)↵
nn =
1.0000 -10.0000 100.0000
dd =
1.0000 10.0000 100.0000 0
Vì vậy trong trường hợp này, hàm residue có thể thực hiện việc chuyển
đổi hai chiều tuỳ thuộc vào số lượng các tham số vào và ra truyền cho nó.
4.1.2 Hàm eval tính giá trị của hàm một biến
Hàm tính giá trị của hàm cho trước dưới dạng xâu ký tự được thực hiện
bởi hàm eval:
Cú pháp: eval(fn, x) hoặc eval(fn) nếu x đã có giá trị.
Trong đó:
fn: là hàm được định nghĩa dưới dạng một xâu ký tự

34
Bài giảng Matlab

x: là biến của hàm fn, x có thể là vô hướng hoặc là mảng, nếu là mảng
thì kết quả của hàm cũng là mảng mà các phần tử là các giá trị tính được tại các
phần tử của mảng x.
Ví dụ:
>> fn='x.^2';↵
>> x=[1 2 3];↵
>> eval(fn,x)↵
ans =
1 4 9
4.1.3 Tìm cực trị của hàm
Ngoài việc sử dụng phương pháp vẽ đồ thị để thu được những thông tin
trực quan về hàm, ta còn phải biết thêm những thông tin về một số thuộc tính
nhất định của hàm. Trong nhiều trường hợp ta cần phải biết cực trị của hàm, đó
là cực đại, cực tiểu. Về mặt toán học thì cực trị được tìm theo phương pháp giải
tích bằng cách tính đạo hàm của hàm và tìm những điểm mà tại đó đạo hàm
bằng không, tuy nhiên trong một số trường hợp việc tính đạo hàm có thể thực
hiện đơn giản nhưng việc tìm nghiệm mà tại đó đạo hàm bằng không thì lại
không đơn giản, Matlab cung cấp hàm fminbnd để tìm giá trị cực tiểu của
hàm một biến trên khoảng cố định (việc tìm giá trị lớn nhất của hàm f(x) chỉ
cần tìm giá trị nhỏ nhất của hàm –f(x)). Ở đây trình bày một trong nhiều cách
gọi hàm như sau:
Cú pháp: xmin = fminbnd(fun,x1,x2)
Hàm trả về giá trị xmin là giá trị mà tại đó hàm đạt giá trị nhỏ nhất trong đoạn
[x1, x2]. Ví dụ:

35
Bài giảng Matlab

>> fn='sin(x)*exp(-x)';↵
>> xmin=fminbnd(fn,1,8)↵
xmin =
3.9270
>> fplot(fn,[1 8])↵
Lưu ý: xmin tìm được là cực tiểu địa phương.
Ví dụ:
>> fn='x*sin(x)';↵
>> x=fminbnd(fn,0,4*pi)↵
x=
4.9132
>> fplot(fn,[0 4*pi])↵

36
Bài giảng Matlab

4.1.4 Tìm giá trị không


Nếu quan tâm đến việc tìm kiếm khi khi nào hàm qua không và khi nào
qua các giá trị không đổi.
Matlab cung cấp cho ta công cụ để giải quyết vấn đề này. Hàm fzero tìm
giá trị không của hàm một biến. Có nhiều cách cách gọi hàm fzero với số các
tham số truyền vào và giá trị đưa ra là khác nhau, chức năng khác nhau, ở đây
trình bày một cách gọi hàm fzero.
Cú pháp x = fzero(fun,x0)
- Nếu x0 là dữ liệu kiểu vô hướng, thì hàm fzero trả về giá trị gần x0 mà tại đó
hàm fun có giá trị bằng không. Nếu không tìm thấy thì hàm trả về giá trị nan,
trong trường hợp này việc tìm kiếm kết thúc khi khoảng tìm kiếm được mở
rộng cho tới khi tìm được giá trị nan, inf hoặc giá trị phức.
- Nếu x0 là một vector gồm hai phần tử x0(1) và x0(2) thì hàm trả về giá trị x
mà tại đó hàm fun đổi dấu khi xét hàm fun trong đoạn từ x0(1) đến x0(2) (tại
đó hàm cho giá trị bằng không) với điều kiện fun(x0(1)) khác dấu fun(x0(2))
Ví dụ:
>> fn='x*sin(x)';↵

37
Bài giảng Matlab

>> x = fzero(fn,[-7 -4])↵


x=
-6.2832
>> fplot(fn,[-7 -4])↵

Trong trường hợp hàm có nhiều điểm tại đó hàm bằng không trong đoạn
từ x0(1) đến x0(2) thì hàm trả về một giá trị trong các giá trị đó.
Nếu tại hai mút x0(1) và x0(2) hàm cùng dấu thì Matlab thông báo lỗi.
4.2 Phép lấy tích phân
Matlab cung cấp một số hàm để xác định các phép toán liên quan đến
tích phân: trapz, quad và quadl,…
Hàm trapz cho ta giá trị xấp xỉ tích phân ở phía dưới hàm bằng cách lấy tổng
các miền hình thang của các điểm dữ liệu như trong hình vẽ dưới.
Cú pháp: z = trapz(x,y)
x: là mảng mà các phần tử là các điểm chia trên miền lấy tích phân
y: là mảng mà các phần tử là giá trị của hàm tại các điểm tương ứng
thuộc x
Các miền hình thang độc lập có giá trị ước lượng dưới mức thực tế. Khi
thay đổi một cách độc lập các vùng hình thang, ví dụ như làm cho nó nhỏ đi thì
kết quả sẽ chính xác hơn.

38
Bài giảng Matlab

Ví dụ: tính tích phân: sin(x), x∈[0, pi], chia x thành 6 đoạn

Tạo script file:


x=0:pi/6:pi;
y=sin(x);
z=trapz(x,y)
plot(x,y),grid on, box on,xlabel('x'),ylabel('sin(x)'),title('Do thi y=sin(x)')
Ghi file với tên intrapz.m, sau đó dịch và chạy chương trình ta được kết quả
z=
1.8232
(Ngoài ra ta còn có các hàm z = trapz(y), z = trapz(...,dim) cũng được
dùng để tính tích phân)
Hàm quad và quadl: là các hàm có cách tính như nhau. Sự định giá của hai
hàm là rất cần thiết để đạt kết quả chính xác. Hơn nữa độ xấp xỉ của chúng là
cao hơn so với hình thang đơn, với quadl có kết quả chính xác cao hơn quad.
Cú pháp: q = quad(fun,a,b)
q= quadl(fun,a,b)

39
Bài giảng Matlab

Giải thích: hàm quad(fun,a,b) hoặc quadl(fun,a,b) tính tích phân của
hàm fun trên đoạn [a,b].
Ví dụ: Tính tích phân hàm y=sinx trên [a, b] với a,b được nhập từ bàn phím.
%script file: inquad.m
clc;
fun='sin(x)';
a=input('a=');
b=input('b=');
z=quadl(fun,a,b)
fplot(fun,[a b]);
Kết quả:
a=0
b=pi
z=
2.0000

4.3 Phép lấy vi phân


Phép lấy vi phân khó hơn so với phép lấy tích phân, phép lấy tích phân
cho cả một vùng, hoặc đặc tính vĩ mô của hàm trong khi phép lấy vi phân chỉ

40
Bài giảng Matlab

lấy tại một điểm nào đấy, hay còn gọi là đặc tính vi mô của hàm. Kết quả là
phép tính vi phân sẽ không ổn định khi đặc tính của hàm thay đổi, trong khi
phép tính tích phân ít chịu ảnh hưởng hơn.
Vì phép tính vi phân là khó nên người ta cố tránh những phép tính nào
mà không thể thực hiện được, đặc biệt khi dữ liệu lấy tích phân là kết quả của
thực nghiệm.
Cú pháp: Y = diff(X)
Y = diff(X,n)
Y = diff(X,n,dim)
Y = diff(X)
o Nếu X là dữ liệu kiểu vô hướng thì Y=[]
o Nếu X =[x1 x2 x3 x4 …xn-1 xn ] thì Y=[x2-x1 x3-x2 x4-x3 …xn-xn-1 ]

o Nếu X là một ma trận m×n thì Y=[X(2:m,:)-X(1:m-1,:)]

Ví dụ:
>> X=[2 3 3;4 5 1;3 4 5;2 3 4; 3 3 3]

X=
2 3 3
4 5 1
3 4 5
2 3 4
3 3 3
>> Y=diff(X)
Y=
2 2 -2
-1 -1 4
-1 -1 -1
1 0 -1
Y=diff(X,n): diff(diff(…diff(X)…)): tính n lần
Ví dụ: Với X và Y ở ví dụ trên.

41
Bài giảng Matlab

>> Z=diff(Y) >> Z=diff(X,2)


Z= Z=
-3 -3 6 -3 -3 6
0 0 -5 0 0 -5
2 1 0 2 1 0
Y = diff(X,n,dim): Hàm tính n lần độ chênh lệch giữa các phần tử theo chiều
dim.
Ví dụ:
X=
2 3 3
4 5 1
3 4 5
2 3 4
3 3 3
>> diff(X,1,2)
ans =
1 0
1 -4
1 1
1 1
0 0
Nếu dim ≥ số chiều của ma trận thì hàm trả về mảng rỗng.
Nhờ hàm diff mà ta có thể tính đạo hàm một cách sơ bộ dựa vào dữ liệu mô
tả một số hàm. Đạo hàm được định nghĩa như sau:
dy/dx = limh->0(f(x+h)-f(x))/h. Nên đạo hàm của hàm f(x) có thể được tính một
cách xấp xỉ dựa vào công thức: y’ = (f(x+h)-f(x))/h, hay còn gọi là số gia của y
chia cho số gia của x.
Ví dụ: Tính đạo hàm của hàm y=sinx trên đoạn [-pi,pi]. Nghiệm đúng y’=cosx.
Để tính gần đúng ta thực hiện chia đoạn cần tính thành 100 khoảng.
%script file: daoham.m
clc;

42
Bài giảng Matlab

x=linspace(-pi,pi,100);
y=sin(x);
dy=diff(y);
dx=diff(x);
dyx=dy./dx;
dyx=[dyx 0];
plot(x,y,'*',x,dyx)
Dịch và chạy chương trình ta được kết quả sau:

CHƯƠNG 5
ĐỒ HOẠ HAI CHIỀU
5.1 Sử dụng lệnh plot
Vẽ một đường
Phần lớn các câu lệnh để vẽ đồ thị trong mặt phẳng đều là lệnh plot.
Lệnh plot vẽ đồ thị của một mảng dữ liệu trong một hệ trục toạ độ thích hợp, và
nối các điểm bằng đường thẳng.
Ví dụ: script file
x = linspace(0,pi,50);
y = tan(sin(x)) - sin(tan(x));
plot(x,y,'--p','LineWidth',1,...
'MarkerEdgeColor','r',...
'MarkerFaceColor','r',...

43
Bài giảng Matlab

'MarkerSize',5)
(Dấu ‘…’ dùng để nối câu lệnh khi xuống dòng)

Ví dụ này tạo 50 điểm theo chiều ngang của đồ thị trong đoạn [0,pi], và tạo một
vector y = tansinx-sintanx. Lệnh plot mở ra một cửa sổ đồ hoạ figure, trong
cửa sổ này tạo độ chia phù hợp với dữ liệu, vẽ đồ thị qua các điểm, và đồ thị
được tạo thành bởi việc nối các điểm này bằng đường nét liền. Các thang chia
số và dấu được tự động cập nhật vào, nếu cửa sổ figure đã tồn tại, plot xoá cửa
sổ hiện thời và thay vào đó là cửa sổ mới.
Vẽ nhiều đường
Ví dụ: vẽ hai đường cos(x) và sin(x) trên cùng một hệ trục toạ độ.
>> x=linspace(0,2*pi,1000);
>> y=sin(x);
>> z=cos(x);
>> plot(x,y,x,z)

44
Bài giảng Matlab

Ví dụ này cho thấy ta có thể vẽ nhiều đường trên cùng một hệ trục toạ
độ bằng cách đưa thêm vào plot một cặp đối số, plot tự động vẽ đồ thị thứ hai
bằng màu khác trên màn hình. Nhiều đường cong có thể cùng vẽ một lúc nếu ta
cung cấp đủ các cặp đối số cho lệnh plot.
Nếu một trong các đối số là ma trận và đối số còn lại là vector, thì lệnh
plot sẽ vẽ tương ứng mõi cột của ma trận với vector đó.
Ví dụ:
>> w=[y;z];
>> plot(x,w)

Nếu thay đổi trật tự các đối số thì đồ thị sẽ xoay một góc bằng 900.
Ví dụ:
>> plot(w,x)

45
Bài giảng Matlab

Lệnh plot có một đối số


Nếu lệnh plot được gọi mà chỉ có một đối số, ví dụ plot(y) thì hàm plot
sẽ đưa ra một kết quả khác, phụ thuộc vào dữ liệu chứa trong y.
Nếu giá trị của y là một số phức, plot(y) tương đương với plot(real(y))
và plot(imag(y)). Trong tất cả các trường hợp khác thì phần ảo của y thường
được bỏ qua.
Ví dụ:
>> y=[0+i 1+2i 2+4i 3+9i];
>> plot(y)

Mặt khác nếu y là phần thực thì plot(y) tương đương với
plot(1:length(y),y).
Ví dụ:
>> x=linspace(0,2*pi,1000);

46
Bài giảng Matlab

>> y=sin(x);
>> plot(y)

5.2 Kiểu đường, dấu và màu


Trong Matlab khi vẽ đồ thị ta có thể khai báo kiểu màu, nét vẽ riêng
bằng việc đưa vào plot một đối số thứ ba sau mỗi cặp dữ liệu của mảng. Các
đối số tuỳ chọn này là một xâu ký tự, có thể chứa một hoặc nhiều hơn.
Nếu không khai báo màu thì Matlab sẽ chọn màu mặc định là blue. Kiểu
đường mặc định là kiểu solid, còn về dấu, nếu không có dấu nào được chọn thì
sẽ không có kiểu của dấu nào được vẽ.
Nếu một màu, dấu, và kiểu đường tất cả đều chứa trong một xâu, thì
kiểu màu chung cho cả dấu và kiểu nét vẽ. Để khai báo màu khác cho dấu, ta
phải vẽ cùng một dữ liệu với các kiểu khai báo chuỗi khác nhau.
Bảng màu, dấu và kiểu nét.
Biểu Biểu Biểu
Màu Dấu Kiểu nét vẽ
tượng tượng tượng
b Xanh da trời . Điểm - Nét liền
g Xanh lá cây 0 Tròn : Đường chấm
đường gạch
r Đỏ x dấu x -.
chấm
đường gạch
c Xanh xám + Dấu + --
gạch
m Đỏ tím * Dấu *
y Vàng s Vuông
k Đen d Diamond
w Trắng v Triangle(down)

47
Bài giảng Matlab

^ Triangle(up)
< Triangle(left)
> Triangle(Right)
p Pentagram
h hexagram

Ví dụ 1:
>> x=linspace(0,2*pi,1000);
>> y=sin(x);
>> plot(x,y,'g--')

Ví dụ 2:
>> x=linspace(0,2*pi,20);
>> y=sin(tan(x));
>> plot(x,y,'m--+')

48
Bài giảng Matlab

5.3 Kiểu đồ thị


Lệnh colordef cho phép lựa chọn kiểu hiển thị. Giá trị mặc định của
colordef là white. Kiểu này sử dụng trục toạ độ, màu nền, nên hình vẽ màu
xám sáng, và tiêu đề của trục màu đen, có thể dùng lệnh colordef black. kiểu
này sẽ cho ta nền trục toạ độ đen, nền hình vẽ màu tối xám, tiêu đề trục màu
trắng.
5.4 Đồ thị lưới, hộp chứa trục, nhãn và lới chú giải
Lệnh grid on sẽ thêm đường lưới vào đồ thị hiện tại.
Lệnh grid off sẽ bỏ các nét này.
Lệnh grid không có tham số đi kèm theo thì sẽ xen kẽ giữa chế độ on
và off. Matlab khởi tạo với grid off. Thông thường trục toạ độ có nét gần kiểu
solid nên gọi là hộp chứa trục. Hộp này có thể tắt đi với box off và box on sẽ
khôi phục lại. Trục đứng và trục ngang có thể có nhãn với lệnh xlabel và
ylabel. Lệnh title thêm vào đồ thị tiêu đề ở đỉnh.
Ví dụ: Tạo script file: ‘graphexample.m’
clc;
x=linspace(-10,10,50);% Tao mang x
y=x.^2+sin(x);% Tao mang y
z=10*x.^2+cos(x);% mang z
plot(x,y,'b--',x,z,'m*');% Ve z va y
grid on% Tao luoi
xlabel('independent variable x');% Nhan x
ylabel('independent variable y and z');% Nhan y
title('y=x^2+sin(x) and z=10x^2+cos(x)');% Tieu de o dinh

49
Bài giảng Matlab

Thêm chuỗi ký tự vào đồ thị tại một vị trí được chọn: text(x,y,’string’)
trong đó x,y là toạ độ tâm bên trái của chuỗi văn bản.
Ví dụ:
clc;
x=linspace(-10,10,50);% Tao mang x
y=x.^2+sin(x);% Tao mang y
z=10*x.^2+cos(x);% mang z
plot(x,y,'b--',x,z,'m');% Ve z va y
grid on% Tao luoi
xlabel('independent variable x');% Nhan x
ylabel('independent variable y and z');% Nhan y
title('y=x^2+sin(x) and z=10x^2+cos(x)');% Tieu de o dinh
text(0,0,'(0,0)');%Toa do (0,0)
text(-6,400,'z=10x^2+cos(x)');%Toa do (-6,400)
text(4,-100,'y=x^2+sin(x)');%Toa do (4,-100)

50
Bài giảng Matlab

Thêm chuỗi văn bản bằng cách di chuột tới vị trí mong muốn
Lệnh gtext(string)
Ví dụ:
gtext('y=x^2+sin(x)');
gtext('z=10*x^2+cos(x)');

5.5 Kiến trúc hệ trục toạ độ

51
Bài giảng Matlab

Matlab cung cấp công cụ để có thể kiểm soát hoàn toàn hình dáng và
thang chia của cả hai trục đứng và ngang với lệnh axis. Do lệnh này có nhiều
yếu tố, nên ở đây đề cập một số dạng hay dùng. Để biết chi tiết hơn về lệnh
axis có thể mở help để xem trợ giúp trực tuyến của Matlab. Các đặc tính cơ bản
của lệnh axis được cho trong bảng dưới đây.
Lệnh Mô tả
Thiết lập các giá trị min, max của hệ trục
axis([xmin xmax ymin ymax]) dùng các giá trị được đưa ra trong vector
hàng.
v là vector cột có chứa thang chia cho đồ thị
v=axis
hiện tại [xmin xmax ymin ymax]
axis auto Trả lại giá trị mặc định thang chia
axis(‘auto’) xmin=min(x), xmax=max(x),…
axis manual Giới hạn thang chia như thang chia hiện tại
Sử dụng (mặc định) hệ toạ độ decac trong đó
gốc toạ độ ở góc thấp nhất bên trái, trục
axis xy
ngang tăng từ trái qua phải, trục đứng tăng từ
dưới lên trên.
Sử dụng hệ toạ độ ma trận, trong đó gốc toạ
axis ij độ ở đỉnh góc trái, trục đứng tăng từ đỉnh
xuống, trục ngang tăng từ trái qua phải.
Thiết lập đồ thị hiện tại là hình vuông, so với
axis square
mặc định hình chữ nhật.
Thiết lập thang chia giống nhau cho cả hai hệ
axis equal
trục.
Tương tự như equal nhưng hộp đồ thị vừa đủ
axis tightequal
đối với dữ liệu
axis normal Tắt chế độ axis equal, equal, tight và 3D
Tắt bỏ chế độ nền trục, nhãn, lưới và hộp dấu.
axis off Thoát khỏi chế độ lệnh tight và bất cứ lệnh
label nào, và thay bởi lệnh text và gtext
axis on Ngược lại với lệnh axis off nếu chúng có thể

5.6 In hình

52
Bài giảng Matlab

Để in hình vừa vẽ hoặc các hình trong chương trình của Matlab đã dược
tạo, ta có thể dùng lệnh từ bảng chọn hoặc đánh lệnh in từ cửa sổ lệnh.
In bằng lệnh từ bảng chọn
Trước tiên chọn cửa sổ hình là cửa sổ hoạt động bằng cách nhấn chuột
lên đó, sau đó chọn mục bảng chọn print từ bảng chọn file. Dùng các thông số
tạo nên trong mục bảng chọn print Setup, đồ thị hiện tại sẽ được gửi ra máy
in.
In bằng lệnh từ cửa sổ lệnh
Chọn cửa sổ hình làm cửa sổ hoạt động bằng cách nhấn chuột lên đó
hoặc dùng lệnh figure(n). Sau đó dùng lệnh in print
Lệnh orient thay đổi kiểu in. Kiểu mặc định là kiểu portrait, in theo
chiều đứng, ở giữa trang. Kiểu Lanscape là kiểu in ngang. Kiểu in tall là kiểu
in đứng nhưng kín toàn bộ trang. Để thay đổi kiểu in khác với kiểu mặc định, ta
có thể dùng lệnh orient với các thông số của nó như sau:
>>orient
ans=
portrait
>>orient landscape
>> orient tall
5.7 Thao tác với đồ thị
 Lệnh hold
Thêm nét vẽ vào đồ thị đã có sẵn bằng lệnh hold. Khi thiết lập hold on,
Matlab không bỏ đi hệ trục đã tồn tại trong khi lệnh plot mới đang thực hiện,
thay vào đó, nó thêm đường cong mới vào hệ trục hiện tại. Tuy nhiên nếu dữ
liệu không phù hợp với hệ trục toạ độ cũ, thì trục được chia lại.
Lệnh hold off bỏ đi cửa sổ figure hiện tại và thay vào đó bằng một đồ
thị mới. Lệnh hold mà không có đối số sẽ bật tắt chức năng của chế độ thiết lập
hold trước đó.
Ví dụ:
clc
x=linspace(0,pi,1000);

53
Bài giảng Matlab

y=sin(x);
plot(x,y);
hold on
ishold% Ham tra ve 1 neu hold o trang thai on
z=cos(x);
plot(x,z,'r --');
hold off
ishold
axis([0 pi -1 1]);
gtext('sinx');
gtext('cosx');

 Tạo nhiều cửa sổ figure


Nếu muốn hai hay nhiều đồ thị ở các cửa sổ khác figure nhau, có thể
dùng lệnh figure trong cửa sổ lệnh hoặc chọn new figure từ bảng chọn file,
figure không có tham số sẽ tạo một figure mới. Ta có thể chọn kiểu figure
bằng cách dùng chuột hoặc dùng lệnh. figure(n) trong đó n là số cửa sổ hoạt
động.
Lệnh subplot
Một cửa sổ figure có thể có nhiều hơn một hệ trục toạ độ. Lệnh
subplot(m,n,p) chia cửa sổ hiện tại thành một ma trận m×n khoảng để vẽ đồ
thị, và chọn p là cửa sổ hoạt động. Các đồ thị thành phần được đánh số từ trái
qua phải, từ trên xuống dưới, sau đó đến hàng thứ hai,…

54
Bài giảng Matlab

Ví dụ:
x=linspace(0,2*pi,30);

y=sin(x);
subplot(1,2,1);
plot(x,y);
axis([0 2*pi -1 1]);
title('sinx');

z=cos(x);
subplot(1,2,2);
plot(x,z);
axis([0 2*pi -1 1]);
title('cosx');

55
Bài giảng Matlab

CHƯƠNG 6
ĐỒ HOẠ TRONG KHÔNG GIAN BA CHIỀU
Matlab cung cấp một số hàm để hiển thị dữ liệu ba chiều như các hàm
vẽ đường thẳng trong không gian ba chiều, các hàm vẽ bề mặt và khung dây,
màu có thể được sử dụng thay thế cho chiều thứ tự.
6.1 Đồ thị đường thẳng
Lệnh plot từ trong không gian hai chiều có thể mở rộng cho không gian
ba chiều bằng lệnh plot3. Khuôn dạng của plot3 như sau:
plot3(X1,Y1,Z1,S1,X2,Y2,Z2,S2,...)

Trong đó Xn, Yn, Zn là các vector hoặc ma trận, Sn là xâu ký tự tuỳ


chọn dùng cho việc khai báo màu, tạo biểu tượng hoặc kiểu đường.
Ví dụ:
clc
t = 0:pi/50:10*pi;
x1=sin(t);y1=cos(t);z1=t;
x2=cos(t);y2=sin(t);z2=2*t;
plot3(x1,y1,z1,'r--*',x2,y2,z2,'bo');
grid on

56
Bài giảng Matlab

box on
title('Vi du plot3');
xlabel('sint');ylabel('cost');zlabel('t');
axis square

Đối với đồ thị trong không gian ba chiều khi muốn đặt một xâu ký tự
vào một vị trí bất kỳ ta có thể dùng hàm text, hàm text cũng có khuôn mẫu như
sau: text(x,y,z,string)
6.2 Đồ thị bề mặt và lưới
Matlab định nghĩa bề mặt lưới bằng các điểm theo hướng trục z ở trên
đường kẻ ô hình vuông trên mặt phẳng x-y. Nó tạo nên mẫu một đồ thị bằng
cách ghép các điểm gần kề với các đường thẳng. Kết quả là nó trông như một
mạng lưới đánh cá với các mắt lưới là các điểm dữ liệu. Đồ thị lưới này thường
được sử dụng để quan sát những ma trận lớn hoặc vẽ những hàm có hai biến.
Hàm meshgrid và hàm mesh

57
Bài giảng Matlab

Bước đầu tiên là đưa ra đồ thị lưới của hàm hai biến z=f(X,Y), tương
ứng với ma trận X và Y chứa các hàng và các cột lặp đi lặp lại, Matlab cung
cấp hàm meshgrid cho mục đích này.
[X,Y]=meshgrid(x,y), tạo một ma trận X, mà các hàng của nó là bản
sao của vector x, và ma trận Y có các cột của nó là bản sao của vector y. Cặp
ma trận này sau đó được sử dụng để ước lượng hàm hai biến sử dụng đặc tính
toán học về mảng của Matlab.
Ví dụ:
clc
x = 0:1:10;
y=2*x;
[X,Y]=meshgrid(x,y)
[X,Y] là một cặp của ma trận tương ứng một lưới chữ nhật trong mặt phẳng x-
y. Mọi hàm z=f(x,y) có thể sử dụng tính chất này.
Ví dụ:
clc
x = 0:pi/50:10*pi;
y=x;
[X,Y]=meshgrid(x,y);
R=sqrt(X.^2+Y.^2)+eps;
Z=sin(R)./R;
mesh(X,Y,Z);
box on
Ma trận R chứa bán kính của mỗi điểm trong [X,Y], nó là khoảng cách
từ mỗi điểm đến tâm ma trận, cộng thêm eps để không xảy ra phép chia cho
không. Ma trận Z chứa sine của bán kính mỗi điểm trong sơ đồ. Câu lệnh
mesh(X,Y,Z) vẽ đồ thị lưới.
Để thay đổi màu sắc với sự trợ giúp của Matlab có thể tham khảo
colormaps…
Trong ví dụ này hàm mesh sắp xếp giá trị của các phần tử của ma trận
vào các điểm (Xi, Yi, Zi) trong không gian ba chiều. Hàm mesh cũng có thể vẽ

58
Bài giảng Matlab

một ma trận đơn tương tự như với một đối số; mesh(Z), sử dụng các điểm
(i,j,Zj). Như vậy Z được vẽ ngược lại với các chỉ số của nó, trong trường hợp
này mesh(Z) chỉ đơn giản chia lại độ khác của các trục x, y theo các chỉ số của
ma trận Z.
Hàm surf
Đồ thị bề mặt của cùng một ma trận Z trông như đồ thị lưới trước đó,
ngoại trừ khoảng cách giữa hai đường thẳng là khác nhau. Đồ thị loại này dùng
hàm surf với đối số như hàm mesh.
Ví dụ:
clc
x = 0:pi/10:10*pi;
y=x;
[X,Y]=meshgrid(x,y);
R=sqrt(X.^2+Y.^2)+eps;
Z=sin(R)./R;
surf(X,Y,Z);
box on

6.3 Thao tác với đồ thị

59
Bài giảng Matlab

Matlab cho phép khai báo góc để từ đó quan sát được đồ thị trong không
gian ba chiều.
Hàm view
view(azimuth, elevation) thiết lập góc xem bằng việc khai báo azimuth
và elevation. ‘elevation’ mô tả vị trí người quan sát, được xem như là góc đo
bằng độ trên hệ trục x-y. ‘azimuth’ mô tả góc trong hệ trục nơi người quan sát
đứng.
Azimuth được đo bằng độ từ phần âm trục y. Phía âm trục y có thể quay
theo chiều kim đồng hồ một góc -37.5 độ từ phía người quan sát.
Elevation là góc mà tại đó mắt ta thấy được mặt phẳng x-y.
Sử dụng hàm view cho phép quan sát hình vẽ từ các góc độ khác nhau.
Ví dụ nếu elevation thiết lập âm, thì view sẽ nhìn hình từ phía dưới lên. Nếu
azimuth thiết lập dương, thì hình sẽ quay ngược chiều kim đồng hồ từ điểm
nhìn mặc định. Thậm chí ta có thể nhìn trực tiếp từ trên bằng cách thiết lập
view(0,90). Thực ra thì đây là điểm nhìn mặc định hai chiều, trong đó x tăng từ
trái qua phải, và y tăng từ trên xuống dưới, khuôn dạng view(2) hoàn toàn
giống như mặc định của view(0,90), và view(3) thiết lập mặc định trong không
gian ba chiều.
Lệnh view có một dạng khác mà rất tiện ích khi sử dụng là view([X Y
Z]) cho phép quan sát trên một vector chứa hệ trục toạ độ decac trong không
gian ba chiều. Khoảng cách từ vị trí quan sát đến gốc toạ độ không bị ảnh
hưởng. Ví dụ: view([0 10 0]), view([0 -1 0]), và view(0,0) cho kết quả như
nhau:
clc
[X,Y] = meshgrid(-3:.125:3);
Z = peaks(X,Y);
meshc(X,Y,Z);
axis([-3 3 -3 3 -10 5])
box on
view(-105,25);
[az,el]=view

60
Bài giảng Matlab

Kết quả:

Có thể lấy lại các thông số azimuth và elevation mà ta quan tâm bằng
lệnh [az,el]=view.
Ví dụ:
[az,el]=view cho kết quả là az=-105, el=25
Lệnh rotate3d
Một công cụ hữu ích khác là quan sát đồ thị không gian ba chiều bởi
hàm rotate3d. Các thông số azimuth và elevation có thể được tác động bởi
chuột. rotate3d on cho phép chuột can thiệp. rotate3d off không cho phép.
Lệnh hidden
Lệnh dấu các nét khuất. Khi vẽ đồ thị, thì một số phần của nó bị che
khuất bởi các phần khác, khi đó nếu dùng lệnh này thì các nét khuất sẽ bị dấu
đi, ta chỉ có thể nhìn thấy phần nào nằm trong tầm nhìn. Nếu chuyển đến
hidden off ta có thể nhìn thấy phần khuất đó qua mạng lưới.
Ví dụ:
clc
[X,Y] = meshgrid(-3:.125:3);
Z = peaks(X,Y);
meshc(X,Y,Z);
axis([-3 3 -3 3 -10 5])

61
Bài giảng Matlab

box on
view(-105,25);
hidden off

6.4 Các đặc điểm khác của đồ thị trong không gian ba chiều
* Hàm ribbon(x,y) tương tự như plot(x,y) ngoại trừ cột của y được vẽ như là
một dải riêng biệt trong không gian ba chiều.
* Hàm clabel tăng thêm độ cao cho đồ thị đường viền, có ba mẫu clabel(cs),
clabel(cs,V) và clabel(cs,’manual’). clabel(cs), trong đó cs là cấu trúc đường
viền được trả về từ lệnh contour, cs=contuor(z) lấy nhãn tất cả các đồ thị
đường viền với độ cao của nó. Vị trí của nhãn được lấy ngẫu nhiên.
clabel(c,’manual’) định vị nhãn đường viền ở vị trí kích chuột tương tự như
lệnh ginput đã nói ở trên. Nhấn phím return kết thúc việc tạo nhãn này.
* Hàm contourf sẽ vẽ một đồ thị đường viền kín, không gian giữa đường viền
được lấp đầy bằng màu.
* Hai mẫu trạng thái của lệnh mesh dùng với đồ thị lưới là: meshc vẽ đồ thị
lưới và thêm đường viền bên dưới, meshz vẽ đồ thị lưới và đồ thị có dạng như
màn che.
* Hàm waterfall được xem như mesh ngoại trừ một điều là hàm mesh chỉ xuất
hiện ở hướng x.
* fill3 phiên bản ba chiều của fill, vẽ một đa giác đều trong không gian ba
chiều. Khuôn dạng tổng quát của nó là fill3(x,y,z,c), trong đó chiều đứng của

62
Bài giảng Matlab

đa giác được chỉ bởi ba thành phần x,y,z. Nếu c là một ký tự, đa giác sẽ được
lấp đầy màu như ở bảng màu. c cũng có thể là một vector hàng có ba thành
phần ([r g b]) trong đó r, g, b là các giá trị giữa 0 và 1 thay cho các màu đỏ,
xanh lá cây và xanh da trời. Nếu c là một vector hoặc ma trận, nó được sử dụng
như một chỉ số chỉ ra sơ đồ màu. Nhiều đa giác có thể được tạo ra bằng cách
cho thêm nhiều đối số như fill3(x1,y1,z1,c1,x2,y2,z2,c2,…).
Ví dụ:
>>color(cool);fill3(rand(3,4),rand(3,4),rand(3,4),rand(3,4));hidden off;box on↵

Lệnh rand(m,n) tạo một ma trận ngẫu nhiên m hàng n cột bao gồm các phần tử
ngẫu nhiên thuộc đoạn [0,1]
6.5 Bảng màu
Matlab định nghĩa biểu đồ màu như là một ma trận có ba cột. Mỗi hàng
của ma trận định nghĩa một màu riêng biệt sử dụng các số trong dải 0 và 1.
Những số này chỉ ra các giá trị RGB, độ nhạy của các màu thành phần đỏ, xanh
lá cây, và xanh da trời trong một màu do các thành phần đó tạo ra. Một số mẫu
cơ bản được cho trong bảng dưới đây:
Đỏ Xanh lá cây Xanh da trời Màu
0 0 0 Đen
1 1 1 Trắng

63
Bài giảng Matlab

1 0 0 Đỏ
0 1 0 Xanh lá cây
0 0 1 Xanh da trời
1 1 0 Vàng
1 0 1 Tím đỏ
0 1 1 Lam xám
-5 -5 -5 Xám trung bình
-5 0 0 Đỏ tối
1 -62 -40 Đỏ hồng
-49 1 -83 Ngọc xanh biển
Một số hàm của Matlab tạo ra bảng màu ở trên.
Hàm Mô tả bảng màu
hsv Giá trị màu bão hoà (HSV)
hot Đen-đỏ-vàng-trắng
gray Xám cân bằng tuyến tính
bone Xám có pha nhẹ với màu xanh
copper sắc thái của màu đồng
pink Màu hồng nhạt nhẹ
white Trắng hoàn toàn
flag Xen kẽ đỏ, trắng, xanh da trời, và đen
jet Sự thay đổi màu bão hoà
prism Có màu sắc lăng kính
cool Màu xanh tím
lines Màu của nét vẽ
summe Bóng của xanh lá cây và vàng
autumn Bóng của đỏ và vàng
winter Bóng của xanh lá cây và xanh da trời
spring Bóng của magenta và yellow

6.6 Sử dụng bảng màu


Lệnh colormap(M) cài đặt ma trận M như là bảng màu được sử dụng
bởi hình hiện tại.
Ví dụ: colormap(cool) cài đặt một version 64 đầu vào của bảng màu
cool.
Hàm plot và plot3 không dùng bảng màu ở trên, chúng sử dụng các màu
liệt kê trong bảng kiểu đường, điểm đánh dấu, màu của plot. Phần lớn các hàm
vẽ khác như mesh, surf, contour, fill, pcolor và các biến của nó, sử dụng bảng
màu hiện tại.
Ví dụ:

64
Bài giảng Matlab

clc
[X,Y,Z] = peaks(100);
mesh(X,Y,Z);
colormap(hsv);
title('using a color argument to mesh');

6.7 Sử dụng màu để thêm thông tin


Màu có thể được dùng để thêm thông tin vào đồ thị ba chiều nếu nó
được sử dụng để tạo thành chiều thứ tự. Các hàm như mesh và surf biến đổi
màu dọc theo trục z, trừ khi một đối số màu được đưa ra như surf(X,Y,Z) hoàn
toàn tương đương với surfX,Y,Z,t) trong đó thành phần thứ t được dùng như
một chỉ số trong biểu đồ màu. Điều này khiến cho đồ thị đầy màu nhưng lại
không thông tin khi mà trục z đã tồn tại.
Ví dụ:
x=-7.5:0.5:7.5;
y=x;
[X,Y]=meshgrid(x,y);
R=sqrt(X.^2+Y.^2)+eps;
Z=sin(R)./R;
subplot(1,2,1);
surf(X,Y,Z);
box on
subplot(1,2,2);
surf(X,Y,Z,R);
title('Color variable with the Z-axis');

65
Bài giảng Matlab

box on

6.8 Hiển thị bảng màu


Ta có thể hiển thị bảng màu theo một số cách sau. Một trong những cách
đó là xem tất cả các phần tử trong một ma trận bảng màu một cách trực tiếp.
Ví dụ:
>> hot(8)

ans =

0.3333 0 0
0.6667 0 0
1.0000 0 0
1.0000 0.3333 0
1.0000 0.6667 0
1.0000 1.0000 0
1.0000 1.0000 0.5000
1.0000 1.0000 1.0000

66
Bài giảng Matlab

Thêm vào đó hàm pcolor có thể được sử dụng để biểu diễn một bảng
màu.
Ví dụ:
n=10;
pcolor([1:n;1:n]);
title('using pcolor to display a color map')

Hàm colorbar thêm một thanh màu đứng hoặc thanh màu ngang(cân
chỉn màu) vào cửa sổ hình vẽ, đưa ra biểu đồ màu cho trục hiện tại.
colorbar(‘h’) định vị thanh màu ngang dưới hình vẽ hiện tại, colorbar(‘v’)
định vị thanh màu đứng về bên phải hình vẽ. colorbar không có đối số thì
thêm một thanh màu ngang, nếu thanh màu này không tồn tại hoặc là cập nhật
nếu nó tồn tại.
Ví dụ:
[X,Y,Z]=peaks;
mesh(X,Y,Z);
colormap(hsv)
axis([-3 3 -3 3 -6 8]);
colorbar

67
Bài giảng Matlab

6.9 Thiết lập và thay đổi bảng màu


Thực tế colormaps là các ma trận, có nghĩa là ta có thể thao tác chúng
giống như bất kỳ một ma trận nào khác. Hàm bridhten(n) nhờ vào đặc điểm
này thay đổi colormap độ tăng hoặc độ giảm độ nhạy của của các màu đậm.
brighten(n) và brighten(-n) phục hồi colormap ban đầu. Lệnh
newmap=brighten(cmap,n) điều chỉnh phiên bản của thanh màu đã được khai
báo mà không làm ảnh hưởng đến colormap hiện tại hoặc cmap,
brighten(gcf,n) làm sáng tất cả các đối tượng trong hình vẽ hiện tại.
Ta có thể tạo colormap của riêng mình bằng cách tạo ra một ma trận
mymap m hàng, 3 cột và cài đặt nó cùng với colormap(mymap) mỗi giá trị
trong một ma trận colormap phải thuộc khoảng từ 0 đến 1. Nếu sử dụng một
ma trận với nhiều hơn hoặc ít hơn 3 cột hoặc chưa một giá trị nào đó bé thua 0
hoặc lớn hơn 1 colormap sẽ đưa ra thông báo lỗi.
Ta có thể kết nối các colormap theo kiểu toán học. Mặc dù kết quả đôi
khi không thể đoán trước được.
Ví dụ:
pinkmap=sqrt(2/3*gray+1/3*hot)

68
Bài giảng Matlab

0.1179 0 0 0.7431 0.4825 0.4825 0.8938 0.8702 0.6824


0.1959 0.1029 0.1029 0.7594 0.4933 0.4933 0.8997 0.8842 0.6901
0.2507 0.1455 0.1455 0.7664 0.5175 0.5040 0.9056 0.8979 0.6977
0.2955 0.1782 0.1782 0.7732 0.5407 0.5143 0.9114 0.9114 0.7052
0.3343 0.2057 0.2057 0.7800 0.5628 0.5245 0.9172 0.9172 0.7272
0.3691 0.2300 0.2300 0.7868 0.5842 0.5345 0.9230 0.9230 0.7485
0.4009 0.2520 0.2520 0.7935 0.6048 0.5443 0.9287 0.9287 0.7692
0.4303 0.2722 0.2722 0.8001 0.6247 0.5540 0.9344 0.9344 0.7893
0.4579 0.2910 0.2910 0.8067 0.6440 0.5634 0.9400 0.9400 0.8090
0.4839 0.3086 0.3086 0.8133 0.6627 0.5727 0.9456 0.9456 0.8282
0.5085 0.3253 0.3253 0.8197 0.6809 0.5819 0.9512 0.9512 0.8469
0.5320 0.3412 0.3412 0.8262 0.6986 0.5909 0.9567 0.9567 0.8653
0.5546 0.3563 0.3563 0.8325 0.7159 0.5998 0.9623 0.9623 0.8832
0.5762 0.3709 0.3709 0.8389 0.7328 0.6086 0.9677 0.9677 0.9008
0.5971 0.3849 0.3849 0.8452 0.7493 0.6172 0.9732 0.9732 0.9181
0.6172 0.3984 0.3984 0.8514 0.7655 0.6257 0.9786 0.9786 0.9351
0.6367 0.4115 0.4115 0.8576 0.7813 0.6341 0.9840 0.9840 0.9517
0.6557 0.4241 0.4241 0.8637 0.7968 0.6424 0.9894 0.9894 0.9681
0.6741 0.4364 0.4364 0.8698 0.8120 0.6506 0.9947 0.9947 0.9842
0.6920 0.4484 0.4484 0.8759 0.8270 0.6587 1.0000 1.0000 1.0000
0.7094 0.4600 0.4600 0.8819 0.8416 0.6667
0.7265 0.4714 0.4714 0.8879 0.8560 0.6746

Vì các colormap là các ma trận, chúng có thể được vẽ đồ thị. Lệnh


rgbplot vẽ đồ thị các giá trị của colormap tương tự như lệnh plot, nhưng sử
dụng màu đỏ, màu xanh lá cây và xanh da trời cho nét vẽ. rgbplot(gray) cho
biết cả ba màu tăng tuyến tính và đồng đều. Lệnh rgbplot với một số
colormap khác như jet, hsv, và prism.
Giá trị hiện tại của cmin và cmax được trả lại bằng caxis không có đối
số. Chúng thường là những giá trị lớn nhất và nhỏ nhất của dữ liệu, caxis([cmin
cmax]) sử dụng colormap nguyên bản cho dữ liệu trong dải giữa cmin và
cmax, những điểm dữ liệu lớn hơn cmax sẽ bị chia ra thành các màu kết hợp
với cmax. Những điểm dữ liệu có giá trị nhỏ hơn cmin sẽ bị chia ra thành các
màu kết hợp với cmin. Nếu cmin nhỏ hơn min(data) hoặc cmax lớn hơn
max(data) thì các màu kết hợp với cmin hoặc cmax sẽ không bao giờ được sử

69
Bài giảng Matlab

dụng; chỉ một phần nhỏ của colormap được sử dụng. caxis(‘auto’) sẽ hồi phục
giá trị mặc định của cmin và cmax.
Ví dụ:
clc;
pcolor([1:17;1:17]);
title('Default color range');
colormap(hsv(8));
axis('auto');
colorbar;
caxis
ans =
1 17

70

You might also like