You are on page 1of 74

TIN HỌC CHUYÊN NGÀNH DÀNH CHO KHOA CƠ ĐIỆN

LẬP TRÌNH TÍNH TOÁN TRONG MATLAB

SỐ TIẾT: 45 (30 LÝ THUYẾT + 15 THỰC HÀNH)

1. Sách, giáo trình chính:


- Lập trình Matlab và ứng dụng, Nguyễn Hoàng Hải - Nguyễn Việt
Anh, NXB Khoa học và kỹ thuật
- Bài giảng LẬP TRÌNH TÍNH TOÁN TRONG MATLAB - Đỗ Thị Mơ

2. Sách tham khảo


- Matlab for engineers, Adrian Biran - Moshe Breiner, Addision Wesley
Publishing Company.
- Cơ sở Matlab & ứng dụng, Nguyễn Hữu Tình-Lê Tấn Hùng- Phạm Thị
Ngọc Yến-Nguyễ Thị Lan Hương, NXB Khoa học và kỹ thuật
- Matlab & Simulink, Nguyễn phùng Quang, NXB Khoa học và kỹ thuật

3. Giáo viên: Đỗ Thị Mơ - Bộ môn Công nghệ phần mềm


Email: dtmo@hau1.edu.vn

Chương 1: Giới thiệu chung


1. Không gian làm việc của Matlab
Cửa số lệnh của Matlab có dấu mời (dấu nhức) là dấu >>. Tại
đây ta có thể gõ vào các lệnh của Matlab hoặc gõ các biến.
Những lệnh hoặc biến được lưu trong không gian làm việc của
Matlab và có thể được gọi lại khi ta cần. Dùng các mũi tên (↓↑ )
để chọn các lệnh, có thể cắt, copy, dán và sửa chữa dòng lệnh.
Ví du:
>> X=2
X=
2
>> A=’XIN CHAO’
A=
XIN CHAO
Nếu ta không nhớ tên biến, ta có thể yêu cầu Matlab cho danh
sách các biến bằng cách đánh lệnh who từ dấu nhắc lệnh.
>> who

1
2. Biến
* Tên biến: Tên biến là một dãy kí tự được bắt đầu bằng chữ
cái, có độ dài tối đa là 31 kí tự, bao gồm các chữ cái, chữ số và
dấu gạch dưới ( _ ), có phân biệt chữ hoa và chữ thường.
Ví dụ : x ; a12 ; b_a
Có thể gán giá trị cho tên biến bằng cách viết :
Tên_biến = biểu thức
Ví dụ :
>> x=20
>>a12=4
>>A12= ‘ABCD’

* Matlab có các biến đặc biệt được cho trong bảng sau:

Giá trị
Các biến đặc
biệt
Ans Tên biến mặc định dùng để trả về kết quả
Pi π = 3.1415
Eps Số nhỏ nhất, nếu cộng thêm 1 sẽ được số nhỏ nhất lớn hơn 1
Flops Số của phép toán số thực
Inf Để chỉ số vô cùng như kết quả của 1/0
NAN hoặc nan Dùng để chỉ số không xác định như kết qẩu của 0/0
i hoặc j i=j= −1

Nargin Số các đối số đưa vào hàm được sử dụng


narout Số các đối số hàm đưa ra
realmin Số nhỏ nhất có thể được của số thực
realmax Số lớn nhất có thể được của số thực

2
Các biến đặc biệt ở trên có sẵn giá trị, nếu ta thay đổi giá trị của nó thì giá trị
ban đầu sẽ mất cho đến khi ta khởi động lại Matlab thì nó mới trở lại giá trị
ban đầu. Không nên thay đổi giá trị của các biến đặc biệt.
Ví dụ:
>> i
ans =
0 + 1.0000i
>> j
ans =
0 + 1.0000i
>> i*i
ans =
-1
>> pi
ans =
3.1416

>> eps
ans =
2.2204e-016
>> realmin
ans =
2.2251e-308
>> realmax
ans =
1.7977e+308
3. Xoá các biến trong không gian làm việc
Để xoá các biến ta dùng lệnh clear , có các cách sau:
- Xoá một biến clear tên_biến
>> clear x
- Xoá nhiều biến clear tên_biếm1 tên_biến2
>> clear a b c
- Xoá một nhóm biến tên trùng nhau một số kí tự: clear a* % xoá các
biến có tên bắt đầu là a.

3
- Xoá tất cả các biến trong không gian làm việc: clear
Dùng lệnh trên tất cả các biến bị xoá không khôi phục được, do
vậy ta phải thận trọng khi dùng nó.
4. Câu gải thích và sự chấm câu
* Câu giải thích: Câu giải thích được viết sau dấu %
>> a=100 % a nhận giá trị 100
* Có thể viết nhiều lệnh trên một dòng, chúng được ngăn cách
bởi dấu phẩy hặc dấu chấm phẩy. Dấu phẩy là yêu cầu hiển
thị kết qủa trên màn hình, còn dấu chấm phẩy là không hiển thị
kết quả trên màn hình.Ví dụ:
>> A=2,B='abcde',x=456.32;y='mnopq'
A=
2
B=
abcde
y=
mnopq

* Dùng dấu ba chấm ( . . . ) viết sau phép toán để chỉ câu lệnh được
tiếp tục ở hàng dưới. Không dùng dấu ba chấm cho các trường hợp khác, hay
cho câu giải thích.
>> x=10,y=20
x=
10
y=
20
>> z=x+...
y
z=
30
5. Các phép toán số học
Các phép tính số học của Matlab được cho trong bảng sau :

Kí hiệu Ví dụ
Phép tính
Phép cộng + 5+4
Phép trừ - 8-2
Phép nhân * 3*5
Phép chia / ( chia trái) ,\ (chia phải) 4/2=2 hoặc 2\4=2
Phép luỹ thừa ^ 2^3

4
Các phép tính trên có mức độ ưu tiên như sau :
1. Phép luỹ thừa.
2. Phép nhân, phép chia
3. Phép công, phép trừ.
>> x=2+10/5+4^2-6*2
x=
8
6. Số phức
Một trong các ưu thế của Matlab là làm việc với số phức. Số phức của Matlab
được định nghĩa theo nhiều cách.
* Cách 1 : Chèn kí tự i hoặc j vào phần ảo.
>> c1=1+3i
c1 =
1.0000 + 3.0000i
>> c1=2-4j
c1 =
2.0000 - 4.0000i
* Cách 2 : Dùng căn bậc hai của số âm.
>> c2=3+sqrt(-1)

c2 =
3.0000 + 1.0000i
>> c2=4-sqrt(-4)
c2 =
4.0000 - 2.0000i
* Cách 3 : Dùng biểu thức *i hoặc *j
>> c3=2-sin(1)*j
c3 =
2.0000 - 0.8415i
>> c3=3+cos(1)*i
c3 =
3.0000 + 0.5403i
>> c3=4+2*i
c3 =
4.0000 + 2.0000i
>> c3=4+(6/3)*i
c3 =
4.0000 + 2.0000i

5
* Các phép toán đối với số phức đều thao tác tương tự như số thực.
>> a=2+3i
a=
2.0000 + 3.0000i
>> b=1+4i
b=
1.0000 + 4.0000i
>> a+b
ans =
3.0000 + 7.0000i
>> a-b
ans =
1.0000 - 1.0000i
>> a/b
ans =
0.8235 - 0.2941i
>> a*b
ans =
-10.0000 +11.0000i

* Có thể biểu diễn số phức ở dạng cực ( độ lớn và góc)


M∠θ ≡ M.eiθ = a+bi
Ở trên số phức biểu diễn bằng độ lớn M và góc θ, quan hệ
giữa các đại lượng này và phần thực, phần ảo được biểu
diễn dưới dạng đại số:
M: dùng hàm abs để tính độ lớn, M=abs(so phuc).
θ= tan-1(b/a): dùng hàm angle tính góc, θ = angle(so phuc)
a= Mcosθ b= Msinθ
Ví dụ:
>> c=1+2i
c=
1.0000 + 2.0000i
>> M=abs(c)
M=
3.1623

6
>> goc=angle(c) % góc θ tính bằng radian
goc =
1.1071 % radian
>> goc_do=goc*180/pi % chuyển góc θ sang độ
goc_do =
63.4349 % góc tính bằng độ
7. Các hàm toán học thông thường

Kí hiệu hàm Ý nghĩa


abs(x) Tính argument (độ lơn M) của số phức x
acos(x) arccos x
angle(x) Tính góc của số phức
asin(x) arcsin x
atan(x) arctang x
atan(x,y) arctang của phần thực của x và y
ceil(x) Xấp xỉ dương vo cùng
conj(x) Số phức liên hợp
cos(x) cosin x
exp(x) ex
fix(x) Xấp xỉ không
floor(x) Xấp xỉ âm vô cùng
gcd(x,y) Ước số chung lớn nhất của 2 số nguyên x và y
imag(x) Hàm trả về phần ảo của số phức
lcm(x,y) Bội số chung nhỏ nhất của 2 số nguyên x và y
log(x) Lnx
log10(x) log10x
real(x) Hàm trả về phần thực của x
rem(x,y) Phần dư của phép chia x/y
round(x) Hàm làm tròn về số nguyên
sign(x) Hàm cho dấu của x
sin(x) sin x
sqrt(x) Căn bậc hai của x
tan(x) tang x

7
>> x=abs(-2)/2
x=
1
>> x=sqrt(2)/2
x=
0.7071
>> y= sin(x)
y=
0.7854
>>4*atan(1)
ans=
3.1416
y=rem(10,3) % phần dư
y=
1
>>gcd(18,81) % Ước số chung lơn nhất
ans=
9

>>lcm(18,81) % bội số chung lớn nhất


ans=
162
>> x=3/9+sin(3.14*17/180)
x=
0.6256
>> x=3\9+sin(3.14*17/180)
x=
3.2922
>> x=asin(3.14/4)
x=
0.9027

8
Bài tập chương 1
1. Tính tổng n số tự nhiên đầu tiên
S=1+2+3+ ... + 179
2. Giải phương trình bậc 2 : 17x2 + 125x - 69 = 0
3. Giải hệ phương trình sau:
4. Tính hàm y theo công thức sau khi x=3:
y= 3x3- 4x2 +7x +12 + 2sin 27o -
5. Tính hàm y theo công thức sau khi x=2
y= asin(x) +

Chương 2: Cửa sổ lệnh, quản lý tệp, các cấu trúc điều khiển, hàm
1. Cửa số lệnh trong Matlab
1.1 Quản lý không gian làm việc của Matlab
Các biến được tạo trong cửa sổ lệnh, được lưu trong không gian làm việc
của Matlab. Ta có thể xem lại hoặc xóa các biến đó.
* Xem tên biến dùng lệnh who
> who
Your variables are:
a ans b c y
* Để xem chi tiết hơn về các biến ta dùng lệnh whos
>> whos
Name Size Bytes Class
a 1x1 8 double array
ans 0x0 0 char array
b 1x1 8 double array
c 1x1 8 double array
y 1x1 8 double array
Grand total is 4 elements using 32 bytes

9
* Để xóa các biến ta dùng lệnh clear
Lệnh này ta đã xét ở mục 3 chương 1. Các tuỳ chọn khác nhau của lệnh clear
ta có thể xem bằng lệnh help clear.
>> help clear
CLEAR Clear variables and functions from memory.
CLEAR removes all variables from the workspace.
CLEAR VARIABLES does the same thing.
CLEAR GLOBAL removes all global variables.
CLEAR FUNCTIONS removes all compiled M- and MEX-functions.

CLEAR ALL removes all variables, globals, functions and MEX links.
CLEAR ALL at the command prompt also removes the Java packages
import list.

CLEAR IMPORT removes the Java packages import list at the command

prompt. It cannot be used in a function.


CLEAR CLASSES is the same as CLEAR ALL except that class definitions
are also cleared. If any objects exist outside the workspace (say in
userdata or persistent in a locked m-file) a warning will be issued
and the class definition will not be cleared. CLEAR CLASSES must be
used if the number or names of fields in a class are changed.

CLEAR VAR1 VAR2 ... clears the variables specified. The wildcard
character '*' can be used to clear variables that match a pattern.
For instance, CLEAR X* clears all the variables in the current
workspace that start with X.

If X is global, CLEAR X removes X from the current workspace,


but leaves it accessible to any functions declaring it global.
CLEAR GLOBAL X completely removes the global variable X.

CLEAR FUN clears the function specified. If FUN has been locked

10
by MLOCK it will remain in memory. Use a partial path (see
PARTIALPATH) to distinguish between different overloaded versions of
FUN. For instance, 'clear inline/display' clears only the INLINE
method for DISPLAY, leaving any other implementations in memory.

CLEAR ALL, CLEAR FUN, or CLEAR FUNCTIONS also have the side effect
of
removing debugging breakpoints and reinitializing persistent variables
since the breakpoints for a function and persistent variables are
cleared whenever the m-file changes or is cleared.

Use the functional form of CLEAR, such as CLEAR('name'),


when the variable name or function name is stored in a string.

See also WHO, WHOS, MLOCK, MUNLOCK, PERSISTENT

1.2. Ghi và phục hồi dữ liệu


* Ghi dữ liệu: Để ghi các dữ liệu( các biến) vào tệp kiểu nhị phân với tên do ta
đặt và đuôi tệp là MAT, ta có thể dùng lệnh sau:
>> Save Tên_tệp hoặc chọn các mục trên thanh Menu:
File / Save Workspace as
Ví dụ: >> save luu1
Các biến trong Matlab được lưu trong tệp luu1.mat
Có thể ghi một số biến vào tệp theo lệnh sau:
>> save tên_tệp biến1 biến2 ...
Ví dụ: >>save luu2 a b c
Các biến a,b,c được ghi trong tệp luu2.mat
* Phục hồi dữ liệu: Để phục hồi dữ liệu (các biến) trong các tệp đã ghi ta dùng
lệnh: >> Load tên_tệp
Ví dụ: >>Load luu1

11
1.3. Khuôn dạng hiển thị số
Matlab hiển thị kết quả dạng số mặc định: số nguyên và các dạng số khác trừ số
thực hiển thị theo đúng dạng đưa vào. Dạng số thực hiển thị với mặc định là 4 chữ
số sau dấu phẩy.
Để tạo khuôn dạng riêng ta chọn các mục trong Menu:
File / Preferences khi đó sẽ có hộp thoại Preferences như sau:

Chọn mục Command Windows, trong mục Numeric format dùng để định
dạng số có các định dạng sau:
short hiện số có 5 chữ số 20.345
long hiện số có 16 chữ số 20.123456789123456
Short e hiện số có 5 chữ số với số mũ e 2.0345e+01
long e hiện số có 16 chữ số với số mũ e
2.0123456789123456e+1
short g chính xác hơn short hoặc short e
long g chính xác hơn long hoặc long e
hex số hệ 16 12ABF
bank hai số thập phân 12.45
+ hiện dương, âm hoặc bằng không +
rational hiện ra dạng phân số nếu số thực co phần thập phân ,
ví du a=12.25 thì hiển thị kết quả trên màn hình là 48/4

12
2. Script file hay M-file
Trong Matlab ta gõ lệnh vào từ cửa sổ lệnh, các lệnh sẽ được thực hiện ngay, nếu
muôn thực hiện lại các lệnh ta lại phải gõ lại, như vậy không tiện lợi.
Đẻ thuận lợi cho việc gõ các lệnh và lưu trữ lại các lệnh Mtlab cho phép mở file dạng
văn bản để ghi các lệnh, file này gọi là Script file hay M_file, phần mở rộng ( đuôi file)
là m.
* Các lệnh về M-file:
- Mở tệp m-file mới: chọn các mục trong menu: File / new / M-file
- Mở tệp m-file cũ: chọn các mục trong menu: File / Open sau đó chọn tên tệp m-file
cần mở.
- Ghi tệp m-file : chọn các mục trong menu: File / save sau đó gõ vào tên tệp m-file.
- Để chạy các lệnh của M-file , trên cửa số của script file ta chọn các mục
Debug / Run , nhập dữ liệu từ cửa sổ lệnh (Command windows )
- Matlab cung cấp một số hàm sử dụng trong m-file:
Display(tên_biến) hiển thị kết quả không có tên biến
Echo điều khiển cửa sổ lặp lại các lệnh của script file
Input sử dụng dấu nhắc để đưa dữ liệu vào
Keyboard trao điều khiển tạm thời cho bàn phím
Pause dừng lại cho đến khi người dùng nhấn một phím bất kỳ
Pause(n) dừng lại n giây
Waitforbuttonpress dừng lại cho đến khi người dùng nhấn một phím bất kỳ.

Ví dụ 1: tạo một m-file có tên là thu1.m chứa các lệnh tính diện tich tam giác
khi biết đường cao và cạnh đáy. Chọn các mục File / new / M-file, tại cửa
sổ Script file ta nhập vào các lệnh tính như sau

Sau đó chọn File / save và gõ vào tên tệp là thu1.m


Chọn Debug / Run để chạy hàm, nhập dữ liệu cho chiều cao, cạnh đáy của
tâm giác từ cửa sổ lệnh.
Ví dụ 2: tạo một m-file có tên là tinhham.m, nội dung chứa các câu lệnh sau:

13
Sau đó chọn Debug / Run để chạy hàm, nhập dữ liệu cho a, b, c từ cửa sổ
lệnh.
* Một số lệnh quản lý tệp :
- cd hiển thị thư mục hiện thời
- cd tên_thư_mục thay đổi thư mục đưa ra
- dir danh sách các file trong thư mục hiện thời
- edit tên_tệp_m_file mở tệp để sọan thảo
- delete tên_tệp_m_file xoá tệp
- path hiển thị hoặc sửa đường dẫn
- type tên_tệp_m_file hiển thị nội dung M-file trong cửa sổ lệnh
- what hiện danh sách các m-file và MAT-file

3. Các cấu trúc điều khiển


3.1. Cấu trúc rẽ nhánh IF ... End
* Trường hợp đơn giản:
If biểu thức điều kiện
khối lệnh
end
Nếu biểu thức điều kiện là đúng thì khối lệnh được thực hiện.
Ví dụ:
>> a=10
>> if a>0
x=3*a
end
>> x
x=
30
* Trường hợp có hai điều kiện thay đổi:
if biểu thức điều kiện
khối lệnh 1
else
khối lệnh 2
end
Nếu biểu thức điều kiện đúng thì thực hiện khối lệnh 1, còn sai thì thực hiện khối lệnh 2.

14
Ví dụ: Tìm nghiệm thực của phương trình bậc 2
function giaiptbac2()
a=input('a=');
b=input('b=');
c=input('c=');
d=b*b-4*a*c
if d<0
k='phuong trinh vo nghiem'
elseif d==0
x1=-b/(2*a)
x2=x1
else
x1=(-b+sqrt(d))/(2*a)
x2=(-b-sqrt(d))/(2*a)
end

* Trường hợp có nhiều điều kiện thay đổi:


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
elseif biểu thức điều kiện 3
khối lệnh 3
....
elseif biểu thức điều kiện n
khối lệnh n
else
khối lệnh n+1
end
Nếu biểu thức điều kiện i đúng thì thực hiện khối lệnh i ( i từ 1 đến n),
ngược lại không có biểu thức điều kiện nào đúng thì thực hiện khối lệnh
n+1.

15
Ví dụ: Tính tiền điện, giả sử tính theo cách 50 số đầu 500 đồng 1 số, 50 số tiếp theo 700
đồng 1 số, 50 số tiếp theo 1000 đồng 1 số, 50 số tiếp theo 1500 đồng 1 số, các sô
tiếp theo 2000 đồng 1 số
function tinhtiendien()
csd=input('chi so dau =');
csc=input('chi so cuoi =');
sd=csc-csd
if sd<=50
tien=sd*500
elseif sd<=100
tien=50*500+(sd-50)*700
elseif sd<=150
tien=50*500+50*700+(sd-100)*1000
elseif sd<=200
tien=50*500+50*700+50*1000+(sd-150)*1500
else
tien=50*500+50*700+50*1000+50*1500+(sd-200)*2000
end

3.2. Cấu trúc switch ... case


switch biểu thức điều kiện
case giá trị 1
khối lệnh 1
case giá trị 2
khối lệnh 2
case giá trị 3
khối lệnh 3
...
case giá trị n
khối lệnh n
otherwise
khối lệnh n+1
end
Biểu thức điều kiện là dạng số hoặc dạng chuỗi. Giá trị i ( i từ 1 đến n) phải có giá trị
phù hợp với biểu thức điều kiện.
Nếu biểu thức điều kiện bằng giá trị i thì khối lệnh i ( i từ 1 đến n) được thực hiện,
ngược lại nếu biểu thức điều kiện không bằng một giá trị i nào thì khối lệnh n+1
được thực hiện.

16
Ví dụ: Hiện ra thời khoá biểu khi ta nhập vào thứ (là số)
function thoikhoabieu()
t=input('nhap vao thu =');
switch t
case 2
'Tin, Toan, Anh'
case 3
' Sinh, Su, Dia'
case 4
' Hoa, Ly, Anh'
case 5
' Toan, Tin, Ly'
case 6
' Van, Hoa, Dia'
case 7
' Toan, Su, Tin'
otherwise
' Nghi o nha'
end

3.3. Vòng lặp For


Vòng lặp For cho phép một khối lệnh thực hiện lặp lại một số lần cố định. Cú pháp
của vòng lặp For như sau;
For biến=mang
khối lệnh
end
Biến lần lượt nhận các giá trị của mảng, mỗi lần như vậy khối lệnh được thực hiện 1
lần. Số lần lặp của khối lệnh sẽ bằng số phần tử của mảng.
Ví dụ 1 : s= 1+2+3+4+ . . . +10
s=0;
for i=1:10
s=s+i;
end
s
Ví dụ 2: Tính p= n !=1*2*3* ...*n
n=input(‘ Nhap vao n: ‘)
p=1;
for i=1:n
p=p*i;
end
p

17
3.4. Vòng lặp While
Vòng lặp while thực hiện lặp lại khối lệnh với số lần lặp không biết trước. Cú
pháp của vòng lặp này như sau :
While biểu thức điều kiện
khối lệnh
end
Khi biểu thức điều kiện còn đúng thì khối lệnh được thực hiện, còn biểu
thức điều kiện sai kêt thúc vòng lặp.
Ví dụ : Tính q= 1+1/2+ 1/3 + ... + 1/n
n= input(‘nhap vao n : ‘)
q=0; i=1;
while i<=n
q=q+1/i;
i=i+1;
end
q

4. Hàm m-File
* Matlab đã xây dựng nhiều hàm, người sử dụng chỉ việc gọi ra để sử dụng, ở chương 1 ta đã
xét một số hàm toán học.
* Matlab cung cấp cấu trúc để người sử dụng có thể xây dựng các hàm của mình dưới dạng M-
file. Cấu trúc một hàm M-file như sau:
Function Tên_biến= Tên_hàm(các tham số vào)
% Các câu chú thich
khối lệnh
Tên_biến = biểu thức
[return]
Các quy định và các tính chất với hàm M-file:
- Tên_hàm và tên M-file phải là một
- Trong thân hàm có lệnh gán giá trị của biểu thức cho tên biến.
- Trong hàm có thể chứa các hàm khác nhưng các hàm con trong hàm đó chỉ được gọi chỉ
được gọi trong chính nó.
- 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. Các biến được
tạo ra trong hàm 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.
- Các dòng chú thích sẽ được hiện ra khi dùng lệnh Help.
- Các tham số vào và ra khi một hàm được gọi chỉ có tác dụng bên
trong hàm đó. Biến Nargin chứa các tham số đưa vào, nargout chứa các giá trị đưa ra.

18
- Nếu các hàm muốn dùng chung các biến thì các biến đó phải khai báo là
biến toàn cục : Global tên_biến
- Trong hàm có thể gặp dòng lệnh Return, cho phép 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 đó.
- Hàm error của Matlab cho hiển thị chuỗi kí tự trên cửa sổ lệnh và dừng
thực hiện hàm. Hàm này thường được dùng để cảnh báo việc sử dụng hàm
không đúng. Ví dụ hàm phải đưa vào 3 tham số, nếu đậ ít hơn sẽ có lỗi :
if nargin <3
error('Phai dua vao du 3 tham so')
end
* Lời gọi hàm : Trong các hàm khác hoặc tại cửa sổ lệnh sử dụng hàm phải
có lời gọi hàm. Lời gọi hàm viết như sau :
Tên_biến=Tên_hàm(các tham số thực sự)
Các tham số thực sự chứa giá trị và tương ứng với các tham số trong hàm.
Ví dụ : Xây dựng hàm tính diện tích của tam giác biết 3 cạnh a,b,c.

Ví dụ : Xây dựng hàm tính diện tích của tam giác biết 3 cạnh a,b,c.
function y=dttg(a,b,c);
%Ham tinh dien tich tam giac biet 3 canh a,b,c
%Nhap vao gia tri 3 canh tam giac ( dieu kien cac canh duong va
% 1 canh phai nho hon tong 2 canh)
if nargin <3
error('Phai dua vao du 3 tham so')
end
p=(a+b+c)/2;
y=sqrt(p*(p-a)*(p-b)*(p-c));
Lời gọi hàm như sau:
a=2;
b=2;
c=3;
t=dttg(a,b,c)
q=dttg(a,b) % loi goi sai

19
5. Các phép tính logic, quan hệ, xâu kí tự, thời gian
5.1. Các toán tử quan hệ
Toán tử quan hệ ý nghĩa

< 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ác

Kết quả của toán tử quan hệ cho giá trị 1 (đúng : true) hoặc giá trị
0 (sai :false).
Ví dụ :
>> a=4
>> b=6
>> a==b
ans = 0
>> a~=b
ans = 1

>> a<b
ans =
1
5.2. Toán tử Logic
Toán tử logic Ý nghĩa

& AND

| OR

~ NOT

Kết qủa của toán tử logic là 1 (true) hoặc 0 (false)


Ví dụ :
>> a=5
>> b=-2
>> (a>0)&(b<0)
ans =
1

20
>> (a<0) |(b>0)
ans =
0
>> ~(a>b)
ans =
0
5.3. Xâu kí tự
Xâu kí tự trong matlab là mảng các kí tự trong bảng mã ASCII.
Xâu kí tự được viết trong dấu nháy đơn ‘...’
Ví dụ : t=’ABCD’ ; q= ‘Ha noi’
* Hàm double cho mã ASCII của xâu :
>> double(t)
ans =
65 66 67 68

>> double(q)
ans =
72 97 32 110 111 105
* Hàm char chuyển lại thành xâu :
>> char(q)
ans =
Ha noi
5.4. Thời gian
* Hàm trả về ngày và giờ hiện tại : clock
* Hàm trả về ngày hiện tại : date
* Hàm trả về thứ trong tuần: weekday
* Hàm trả về ngày cuối tháng: eomday(năm, tháng)
* Hàm trả về lịch tháng: calendar(năm, tháng)

21
>> date
ans =
18-Oct-2006
>> eomday(2006,9)
ans =
30
>> calendar(2006,11)
Nov 2006
S M Tu W Th F S
0 0 0 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 0 0
0 0 0 0 0 0 0

Chương 3: Các phép toán với mảng


1. Mảng đơn giản
1.1. Biểu diễn mảng đơn trong matlab
Để biểu diễn một dãy các phần tử có tính chất giống nhau matlab dùng kiểu
mảng.
Biểu diễn mảng đơn như sau:
Tên_biến_mảng=[a1,a2,...,an] hoặc Tên_biến_mảng=[a1 a2 ... an]
Trong đó ai với i từ 1 đến n, là phần tử thứ i của mảng, như vậy giữa các
phần tử ngăn cách nhau bới dấu phẩy hoặc dấu cách. Phần tử của mảng có
thể biểu diễn bằng biểu thức.
Ví dụ 1 x biểu diễn 1 dẫy số 1, 3, 5 ,7, 9,11 trong matlab ta viết như sau
x=[1,3,5,7,9,11] hoặc x=[1 3 5 7 9 11]
Ví dụ 2:
>> a=2
>> y=[2*a,3+a,4/a]
y=
4 5 2

22
1.2. Địa chỉ của mảng
Ở ví dụ 1 mảng x có 6 phần tử, mảng x có 1 hàng 6 cột hay còn gọi là vector hàng,
mảng x có độ dài là 6.
* Để truy nhập vào phần tử thứ i của mang ta viết như sau: Tên_biến_mảng(i)
Ví dụ: x(1); x(5); y(2); y(3)
* Để truy nhập vào từ phần tử thứ i đến phần tử thứ j ta viết:
Tên_biến_mảng(i:j)
Ví dụ : x(2:4); y(1:2)
* Để truy nhập vào từ phần tử thứ i đến phần tử cuối ta viết:
Tên_biến_mảng(i:end)
Ví dụ : x(3:end); y(2:end)
* Để truy nhập vào các phần tử trong khoảng từ phần tử thứ i đến phần tử j, vị trí
của phần tử sau bằng vị trí của phần tử trước cộng với số k ta viết:
Tên_biến_mảng(i:k:j) ví dụ:
>> x(1:2:6)
ans =
1 5 9
>> x(6:-1:1)
ans =
11 9 7 5 3 1

1.3. Cấu trúc của mảng


Có nhiều cách tạo ra một mảng, sau đây là một số cấu trúc của mảng :

* Với mảng có số phần tử nhỏ ta có thể nhập vào trực tiếp.


* Ta có thể dùng các cấu trúc cơ bản sau để tạo mảng :

x=m :n Tạo vector hàng x, phần tử đầu có giá trị là m, phần tử sau bằng
phần tử trước công với 1, kết thúc tại phần tử có giá trị bằng hoặc nhỏ hơn
x=m :k :n Tạo vector hàng x, phần tử đầu có giá trị là m, phần tử sau bằng
phần tử trước công với k, kết thúc tại phần tử có giá trị bằng hoặc nhỏ hơn
x=linspace(m :n :k) Tạo vector hàng x, phần tử đầu có giá trị là m, kết thúc là
n, có k phần tử
x=logspace(m :n :k) Tạo vector hàng không gian logarithm x, phần tử đầu có
giá trị là 10m, kết thúc là 10n, có k phần tử Ví dụ :
>>a=2:10
a=
2 3 4 5 6 7 8 9 10
>> b=1:3:15
b=
1 4 7 10 13

23
>> c=linspace(1,5,8)
c=
1.0000 1.5714 2.1429 2.7143 3.2857 3.8571 4.4286 5.0000
>> d=logspace(1,2,5)
d=
10.0000 17.7828 31.6228 56.2341 100.0000
* Đối với các mảng mà các phần tử của nó không tuân theo một quy luật nhất định, ta
có thể tạo mảng bằng cách ghép các ghép các mảng thành phần lại. Ví dụ :
>> x1=1:6
x1 =
1 2 3 4 5 6
>> x2=3:2:11
x2 =
3 5 7 9 11
>> x3=[x1 x2]
x3 =
1 2 3 4 5 6 3 5 7 9 11
>> x4=[x1(1:2:6),2, 7, x3(5:9)]
x4 =
1 3 5 2 7 5 6 3 5 7

2. Vector hàng và vector cột


* Vector hàng là mảng 1 hàng và nhiều cột, cách biểu diễn đã xét ở phần trên.
a=[a1,a2, ... ,an]
* Vector cột là mảng 1 cột và nhiều hàng. Các thao tác như vector hàng. Biểu diễn dùng dấu ;
ngăn cách giữa các phần tử.
b=[b1;b2; ... ;bn]
Ví dụ: b=[1;3;5;7]
b= 1
3
5
7
* Dùng phép chuyển vị ( kí hiệu là dấu nháy đơn: ‘) để chuyển vector hàng thành vector cột.
Ví dụ:
>> a=[2,4,6,8,10]
a = 2 4 6 8 10
>> b=a'
b= 2
4
6
8
10

24
>> b(2,3)
ans =
7
>> b(2) % phần tử thứ 2
ans =
5
>> b(4) % phần tử thứ 4
ans =
2
>>b(end) % phần tử cuối cùng
ans =
12
>> b(:,2) % cột 2
ans =
2
6
10
>> b(3,:) % dòng 3
ans =
9 10 11 12

* Loại bỏ dòng hoặc cột mảng bằng cách gán cho giá trị rỗng [].
Ví dụ:
>> c=[1:2:7;8:2:14;20:-1:17]
c=
1 3 5 7
8 10 12 14
20 19 18 17
>> c(:,4)=[] % xoá cột 4
c=
1 3 5
8 10 12
20 19 18
>> c(1,:)=[] % xoá dòng 1
c=
8 10 12
20 19 18
* Tạo vector cột d từ ma trận c : d=c( :)
>> d=c(:)

25
>> d=c(:)
d=
8
20
10
19
12
18
* Ma trận chuyển vị dùng kí hiệu nháy đơn ‘
Ví dụ :
>> c1=c'
c1 =
8 20
10 19
12 18
* Ma trận có các phần tử là 1 : ones(r,c) r số hàng, c số cột
Ví dụ :
>> ones(3,4)
ans =
1 1 1 1
1 1 1 1
1 1 1 1

* Ma trận có các phần tử là 0 : zeros(r,c) r số hàng, c số cột


>> zeros(3,3)
ans =
0 0 0
0 0 0
0 0 0
4. Các phép toán với mảng
Các phép toán cơ bản với mảng được cho trong bảng sau :

Dữ liệu minh hoạ a=[a1 a2 ... an], b=[b1 b2 ... bn], c là số vô


hướng
Cộng với một số a+c=[a1 +c a2 +c... an+c]
Nhân với một số a*c=[a1 *c a2 *c... an*c]
Cộng mảng a+b=[a1 +b1 a2 +b2... an+bn]
Nhân mảng a.*b=[a1 *b1 a2 *b2... an*bn]
Chia trái mảng a.\b=[a1\b1 a2\b2... an\bn]
Chia phải mảng a./b=[a1/b1 a2/b2... an/bn]
Luỹ thừa mảng a.^c=[a1^c a2^c... an ^c]
c.^a=[c^a1 c^a2 ... c^an]
a.^b=[a1^b1 a2^b2 ... an^bn]

26
Ví dụ:
>> a=[1:3;4:6;7:9]
a=
1 2 3
4 5 6
7 8 9
>> b=[3:-1:1;6:-1:4;9:-1:7]
b=
3 2 1
6 5 4
9 8 7
>> b+2
ans =
5 4 3
8 7 6
11 10 9
>> b*2
ans =
6 4 2
12 10 8
18 16 14

>> a+b
ans =
4 4 4
10 10 10
16 16 16
>> a.*b
ans =
3 4 3
24 25 24
63 64 63
>> a.\b
ans =
3.0000 1.0000 0.3333
1.5000 1.0000 0.6667
1.2857 1.0000 0.7778
>> a./b
ans =
0.3333 1.0000 3.0000
0.6667 1.0000 1.5000
0.7778 1.0000 1.2857

27
>> a.^2
ans =
1 4 9
16 25 36
49 64 81
>> 2.^a
ans =
2 4 8
16 32 64
128 256 512
>> a.^b
ans =
1 4 3
4096 3125 1296
40353607 16777216 4782969
>> a' % ma trận chuyển vị của a
ans =
1 4 7
2 5 8
3 6 9

5. Một số hàm thông dụng với ma trận

Kí hiệu Ý nghĩa
det(A) Tính định thức ma trận A
inv(A) Ma trận nghich đảo
logm(A) Ma trận logarithm
orth(A) Tính trực giao
Poly(A) Đa thức
rank(A Hạng ma trận
Trace(A) Tổng các phần tử chéo
Ví dụ :
>> b=[1 9 4;4 0 6;3 4 1]
b=
1 9 4
4 0 6
3 4 1
>> det(b)
ans =
166

28
>> inv(b)
ans =
-0.1446 0.0422 0.3253
0.0843 -0.0663 0.0602
0.0964 0.1386 -0.2169
>> trace(b)
ans =
2
* Tìm kiếm trong mảng
Dùng hàm: Find(điều kiện tìm)
ví dụ:
>>m=[1 2 3 4;5 6 7 0]
m=
1 2 3 4
5 6 7 0
>>[i,j]=find(m<5) % tìm vị trí các phần tử của m<5
i=
1
1
1
1
2

j=
1
2
3
4
4
* Hàm rank: trả về hạng của ma trận. Ví dụ:
>> a=[2 4 6;3 5 7; 9 8 7]
a=
2 4 6
3 5 7
9 8 7
>> rank(a)
ans =
2

29
6. Giải hệ phương trình
Cho phương trình Ax = b
a.Trường hợp số biến bằng số phương trình
Có 2 phương pháp:
- Phương pháp 1 dùng ma trận nghịch đảo: x=inv(A)*b
- Phương pháp 2 dùng toán tử chia ma trận: x=A.\b
Ví dụ:
>> A=[1 2 3;4 5 6;7 8 0]
A=
1 2 3
4 5 6
7 8 0
>> b=[366;804;315]
b=
366
804
315
>> det(A)
ans =
27

+ Cách thứ nhất dùng ma trận nghịch đảo:


>> x=inv(A)*b
x=
29.0000
14.0000
103.0000
+ Cách thứ hai dùng toán tử chia ma trận:
>> x=A.\b
x=
29.0000
14.0000
103.0000

30
b. Trường hợp số phương trình và số biến khác nhau
Trong nghiên cứu số học tuyến tính, khi số phương trình và số biến khác nhau, thì
không thể có một phương pháp duy nhất để giải.
Trong MATLAB khi gặp những hệ phương trình có số phương trình lớn hơn số biến
: Dùng toán tử chia trái hoặc chia phải, tự động giảm thấp nhất những phần tử thừa
AX-b. Cách này gọi là phương pháp vuông nhỏ nhất.
Ví dụ:
A=[1 2 3;4 5 6;7 8 0;2 5 8] % Bon phuong trinh ba bien
A=
1 2 3
4 5 6
7 8 0
2 5 8
>> b=[366;804;351;514]
b=
366
804
351
514

>> x=A\b %Phuong phap vuong nho nhat


x=
247.9818
-173.1091
114.9273
Tính độ sai lệch:
>> res=A*x-b
res =
-119.4545
11.9455
0.0000
35.8364
+ Trong MATLAB khi gặp những hệ phương trình có số phương trình ít hơn số biến.
Có thể dùng 2 cách: Cách 1 dùng toán tử chia đưa ra phương pháp có số phần tử 0
của x là cực đại, phương pháp này goi là phương pháp với số phần tử 0 cực đại.
Cách thứ 2 tính x= pinv(A) / b đưa ra phương pháp chiều dài hay tiêu chuẩn của x nhỏ
hơn các phương pháp khác, phương pháp này gọi là phương pháp tiêu chuẩn cực
tiểu. Ta có thể dung cả 2 phương pháp để giải rồi so sánh để nhận nghiệm x nào
phù hợp.

31
- Phương pháp với số phần tử 0 cực đại: x=A\b
>>A
1 2 3
4 5 6
7 8 0
2 5 8
>> A=A' % Tao 3 phuong trinh 4 bien
A=
1 4 7 2
2 5 8 5
3 6 0 8
>> b=[366;804;351]
b=
366
804
351

>> x=A\b % Phuong phap voi so phan tu 0 cuc dai


x=
0
-165.9000
99.0000
168.3000
- Phương pháp tiêu chuẩn cực tiểu: xn=pinv(A)*b
Lệnh pinv . Lệnh này dùng để tính giả nghịch đảo của ma trận
A.
>> xn=pinv(A)*b % Tim gia phap tieu chuan nho nhat
xn =
30.8182
-168.9818
99.0000
159.0545

32
- Tính sai lệch theo 2 phương pháp
>> Res1=A*x-b
Res1 =
1.0e-012 *
-0.3411
0.1137
0
>> Res2=A*xn-b
Res2 =
1.0e-012 *
-0.5684
-0.7958
-0.3411

Bài tập chương 3


1. Cho dãy số sau: a1,a2,....,an . Viết chương trình tìm phần tử lớn nhất, phần tử nhỏ nhất của
dãy số đó.
2. Cho dãy số sau: a1,a2,....,an . Viết chương trình sắp xếp dãy theo thứ tự tăng dần .
3. Cho dãy số sau: a1,a2,....,an . Viết chương trình tìm các phần tử có giá trị là x nhập vào từ bàn
phím.
4. Cho ma trân A có m dòng, n cột. Tính tổng các phần tử của ma trận A.
Hãy tính: định thức của A, ma trận chuyển vị của A, ma trận nghịch đảo của A, đa thức của A, tổng
đường chéo chính của A, hạng của A.
5. Giải hệ phương trình sau bằng 2 phương pháp:
x1+ 2 x2 + 6x3 = 2
8x1+ 6x2 + 9x3 = 8
2x1+ 3x2 + x3 = 4
6. Giải hệ phương trình sau
3x1+ 4 x2+ 5x3=3
3x1+ 2x2 + x3 =4
3x1+ 3x2+ 2x3 =2
5x1+ 6x2+ 4x3=8
7. Giải hệ phương trình sau
3x1+ 3x2+ 3x3+ 5x4=3
4x1+ 2x2+ 3x3+ 6x4=4
5x1+ x2+ 2 x3+ 4x4=2

33
Chương 4: Đồ hoạ trong hệ toạ độ phẳng
1. Lênh Plot
Lệnh này dùng vẽ đồ thị của một mảng dữ liệu trên hệ trục
thích hợp. Trong đó x là mảng dữ liệu cho trục x, y là mảng
dữ liệu cho trục y, nối các điểm (x,y) bằng đường thẳng.
Cú pháp: Plot(x,y)
Ví dụ 1:
>> x=linspace(0,2*pi,30) % mảng góc x bằng radian
>> y=sin(x)
>> plot(x,y) % vẽ đồ thị hàm sin(x)
Sẽ có đồ thị sau :

Ví dụ 2 : Vẽ đồ thị sin x và cosin x trên cùng một hệ trục


>> z=cos(x)
>> plot(x,y,x,z)
Kết quả có đồ thị sau :

34
Ví dụ 3 : Vẽ đồ thị hàm y=2x2 - 4x -10 trong đoạn x : [-5,5]
>> x=[-5:5]
x=
-5 -4 -3 -2 -1 0 1 2 3 4 5
>> y=2*x.^2-4*x-10
y=
60 38 20 6 -4 -10 -12 -10 -4 6 20
>> plot(x,y)
Ta nhận được đồ thị sau :

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


Nếu khi vẽ không khai báo, MatLab sẽ để màu mặc định là
blue, kiểu đường là solid và không có các điểm đánh dấu
trên đồ thị. Tuy nhiên, ta cũng có thể khai báo màu, kiểu
đường bằng cách đưa thêm vào lệnh plot các đối số thứ 3
sau mỗi cặp dữ liệu của mảng. Các đối số tuỳ chọn là 1
xâu kí tự, có thể chứa 1 hoặc nhiều kí tự theo bảng dưới
đây.
Plot(x,y,’ các biểu tượng màu - dấu - nét’

35
Biểu Màu Biểu Dấu Biểu Dấu Biểu Kiểu nét vẽ
tượng tượng tượng tượng
màu dấu dấu nét vẽ

b Xanh da trời . Điểm ^ triangle(up) - nét liền


g Xanh lá cây 0 Tròn < triangle(left) : đường chấm
r Đỏ x nhân > triangle(right) -. đường gạch
c Xanh xám + cộng p pentagram -- chấm
m Đỏ tím * sao h hexagram đường gạch
y Vàng s vuông gạch
k Đen d diamond
w Trắng ^ triangle(down)

Ví dụ : >> plot(x,y,'r+-') % vẽ với màu đỏ, dấu +, nét liền.


Kết quả như sau :

3. Kiểu hiển thị đồ 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
là màu trắng, tiêu đề trục màu đen nên hình vẽ màu xám sáng.
Nếu thích nền màu đen ta có thể đổi lại bằng lệnh colordef black.
Kiểu này sẽ cho nền trục toạ độ đen, nền hình vẽ màu tối xám và
tiêu đề trục màu trắng.

36
4. Trục, nhãn, lời chú giải, lưới, hộp chứa trục
* Trục: Việc phân chia thang bậc của trục thường được MatLab tự động
làm, tuy nhiên người sử dụng cũng có thể chia lại bằng lệnh
- axis ([x_min, x_max, y_min, y_max]): Chia trục 2D (2 chiều)
- axis ([x_min, x_max, y_min, y_max, z_min, z_max]):Chia trục 3D
- axis (‘auto’): Trao quyền chia trục lại cho MatLab
* Nhãn:
- xlabel(string): Điền nhãn trục x
- ylabel(string): Điền nhãn trục y
- zlabel(string):Điền nhãn trục z
- title(string): Điền tiêu đề của đồ thị
- text (x_value, y_value, string): Điền đoạn văng bản vào đồ thị tại toạ độ
(x_value, y_value)
- gtext(string) thêm xâu kí tự vào vị trí kích chuột
* Lời chú giải:
- Legend (string_1, string_2, …, [position]) Điền lời ghi chú
* Lưới: grid on hiện lưới, grid off không hiện lưới (mặc nhận)
* Hộp chứa đồ thị: box off tắt đi, box on khôi phục lại (mặc nhận)

Ví dụ 1:
>> x=[-5:5]
x=
-5 -4 -3 -2 -1 0 1 2 3 4 5
>> y=2*x.^2+1
y=
51 33 19 9 3 1 3 9 19 33 51
>> xlabel(' Bien x')
>> ylabel(' Ham y')
>> title(' Do thi ham y=2*x^2+1')
>> plot(x,y,'r*-')

37
* Chú ý: Nếu lệnh Plot được gọi mà chỉ có một đối số (vd: Plot(y))
thì hàm Plot sẽ đưa ra kết quả khác nhau phụ thuộc vào dữ liệu
chứa trong y:
+ Nếu y là số phức thì 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.
+ Nếu y là số thực thì plot(y) tương ứng với plot(1:
length(y), y)

Ví dụ 2:
>> x=[-5:5]
x=
-5 -4 -3 -2 -1 0 1 2 3 4 5
>> y=5*x.^3+1
y=
-624 -319 -134 -39 -4 1 6 41 136 321 626
>> plot(x,y)
>> box off
>> z=5*x.^2+1
z=
126 81 46 21 6 1 6 21 46 81 126
>> plot(x,y,'r.-',x,z,'b+-')
>> gtext('y=5*x^2+1')
>> gtext('z=5*x^3+1')
>> title(' Do thi 2 ham y=5*x^2+1, z=5*x.^2+1')
>> xlabel(' bien x')
>> ylabel(' Ham y')

38
5. Hệ trục toạ độ
Matlab cung cấp công cụ kiểm soát hình dáng và
thang chia của hai trục tọa độ bằng lệnh axis. Các
thông tin đầy đủ về lệnh này có thể xem bằng lệnh
help axis . Các trường hợp cơ bản của lệnh này
được trình bày theo bảng dưới đây:

39
Lệnh Mô tả

axis([xmin xmax ymin ymax]) Thiết lập các giá trị min, max của 2 trục theo giá trị trong vector
hàng

v=axis v là vector có chứa thang chia cho đồ thị theo dạng [xmin xmax ymin
ymax]
axis auto Thang chia mặc định

axis(‘auto’) xmin=min(x), xmax=max(x),...

axis manual Giới hạn thang chia như thang chia hiện tại

axis xy Sử dụng hệ toạ độ decac (mặc định), gốc ở góc trái thấp

axis ij Sử dụng hệ toạ độ ma trận, gốc ở góc trái cao.

axis square Thiết lập đồ thị hiện tại là hình vuông, mặc định hình chữ nhật.

axis equal Thiết lập thang giống nhau cho cả hai hệ trục

axis tightequare Tương tự như axis equal nhưng hộp đồ thị vừa đủ đối với dữ liệu

axis normal Tắt các chế độ khác, ở chế độ bình thường

axis off Tắt bỏ các chế độ nền, trục , nhãn,..

axis on ngược lại với axis off

* Một đồ thị chứa nhiều hệ trục


subplot(m,n,p) trong đó cửa sổ hiện chia thành ma trận
mxn khoảng để vẽ đồ thị, p là cửa sổ hoạt động. Các cửa
sổ được đánh số từ trái qua phải, từ trên xuống dưới.
>> x=[-1:0.2:6]
>> y=cos(x)
>> z=sin(x)./cos(x)
>> t=sin(x)
>> p=cox(x)./sin(x)
>> subplot(2,2,1), plot(x,y)
>> subplot(2,2,2), plot(x,z)
>> subplot(2,2,3), plot(x,t)
>> subplot(2,2,4), plot(x,p)

40
* Vẽ hai hàm trên cùng một hệ trục, thang chia khác nhau
plotyy(x,y,x,z)
>> x=[-1:0.2:6];
>> y=sin(x);
>> z=tan(x);
>> plotyy(x,y,x,z)
>> gtext('sin(x)')
>> gtext('tan(x)')

41
6. Một số dạng đồ thị khác và các lệnh khác
* area(x,y) dạng diện tích
>> x=[-1:0.5:6];
>> y=cos(x);
>> area(x,y)
* pie(a,b) dạng bánh tròn, a là vector gía trị, b là vector logic tuỳ
chọn.
>> pie(x,x==max(x))
>> box off
>> pie(x,x==max(x))

* pareto(x) dạng cột


>> x=[1:0.5:5];
>> pareto(x)

42
* bar(x,y)
* bar3(x,y)
* barh(x,y)
* stairs(x,y)
>> x=-2.9:0.2:2.9;
>> y=exp(-x.*x);
>> subplot(2,2,1), bar(x,y)
>> subplot(2,2,2), bar3(x,y)
>> subplot(2,2,3), barh(x,y)
>> subplot(2,2,4), stairs(x,y)

* rose(V) vẽ một biểu đồ toạ độc cực cho các góc trong
vector v, tương tự ta cũng có các lệnh rose (v, n) và rose
(v, x) trong đó x là một vector.
VD: >>v=randn(100, 1)*pi;
>>rose(v)
>>title(‘Đồ thị toạ độ cực của các góc với giá trị ngẫu
nhiên’)

43
* loglog(x,y) : tương tự như lệnh plot nhưng thang chia là
thang logarithm cho cả 2 trục
* semilogx(x,y): thang chia của trục x là logarithm, còn thang
chia của y là tuyến tính
* semilogy(x,y): thang chia của trục y là logarithm, còn thang
chia của x là tuyến tính
* Các lệnh khác:
- clf: Xoá nội dung của Figure hiện tại
- delete Figure (Number): Xoá Figure
- Close (number)/ Close all: Đóng Figure

Chương 5: Đồ hoạ trong không gian 3 chiều


1. Đồ thị đường thẳng
* Lệnh plot từ trong không gian 2 chiều có thể mở rộng
cho không gian 3 chiều bằng lệnh Plot3 như sau:
plot3 (x1, y1, z1, S1, x2, y2, z2, S2,….)
Trong đó xn, yn và zn là các vetor hoặc ma trận, và sn là xâu
kí tự tuỳ chọn dùng cho việc khai báo màu và kiểu đường
VD:>> t = linspace (0,10*pi);
>> plot3( sin(t), cos(t), t)
>> title (‘Helix’), xlabel(‘sin(t)’)
>> ylabel(‘cos(t)’)

44
2. Đồ thị lưới đồ thị 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 xy. Nó
tạo lên một mẫu đồ 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ị
loại này thường dùng để quan sát những ma trận lớn hoặc
vẽ những hàm có 2 biến.
Bước đầu tiên là đưa ra đồ thị lưới của hàm 2 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 2 biến sử dụng đặc tính toán học
về mảng của MatLab.

VD: >> x = -7.5: 0.5: 7.5;


>> y = 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.
VD: >> R = sqrt(X.^2 + Y.^2)+eps;
>> Z = sin(R)./R;
VD: x1=1:0.2:10
y1=x1
[X1,Y1]=meshgrid(x1,y1)
%r1= sqrt(X1.^2+Y1.^2)
r1=X1+Y1
Z1=2*cos(r1)+3
mesh(X1,Y1,Z1)

45
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 0. Ma trận Z chứa sin của
bán kính chia cho bán kính mỗi điểm trong sơ đồ.
* Câu lệnh vẽ đồ thị lưới:
>> mesh (X, Y, Z)

Đồ thị là đơn sắc, tuy nhiên ta có thể thay đổi màu sắc theo
yêu cầu
* Đồ thị bề mặt:
>>surf(X,Y,Z)

46
* Đồ thị hàm peaks
Trong matlab có hàm đặc biệt là hàm peaks
>>peaks
z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ...
- 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...
- 1/3*exp(-(x+1).^2 - y.^2)
Muốn vẽ đồ thị hàm này ta chỉ việc ra lệnh
>>peaks

3. Thao tác với đồ thị


MatLab cho phép khai báo góc để từ đó có thể quan sát được
đồ thị trong không gian 3 chiều.
* Hàm 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, 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.50 từ
phía người quan sát, “Elevation” là góc mà tại đó mắt
người quan sát thấy được mặt phẳng x-y. Sử dụng hàm
view cho phép người quan sát có thể quan sát hình vẽ từ
các góc độ khác nhau.

47
Ví dụ: >>view(-50,0)
* 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 bạn quan sát trên một vector
chứa hệ trục toạ độ decac. Khoảng cách từ vị trí bạn 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ả
giống nhau.
Một công cụ khác cũng rất hữu dụng với việc quan sát đồ thị
không gian 3 chiều là hàm rotate3d. Các thông số Azimtuh
và elevation có thể được tác động bởi chuột, lệnh rotate3d
on cho phép chuột can thiệp, còn rotate3d off không cho
phép.
Lệnh Hidden dấu các nét khuất. Khi ta vẽ đồ thị, một số phần
của nó bị che khuất bởi các phần khác nên chỉ có thể nhìn
thấy phần ở trong tầm nhìn. Nếu chuyển đến hidden off, ta
có thể thấy phần khuất đó qua mạng lưới. Mặc nhận là
hidden on.

VD1: >>mesh(peaks(20)+7)
>>title (‘Mesh with hiden on’) % có che khuất
VD2: >>mesh(peaks(20)+7)
>>hidden off % khong che khuất
>>title(‘Mesh with Hidden Off’)
VD3: >>mesh(peaks(20)+7)
>>view(-40,0)
4. Các đặc điểm khác và các hàm vẽ đồ thị khác trong không
gian 3 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 3
chiều.
t=[-3:0.2:2]
s=sin(t)
ribbon(t,s)

48
* Hàm clabel tăng thêm độ cao cho đồ thị đường viền. Có
ba mẫu clabel(cs), clabel(cs, V), clabel(cs, ‘manual’). trong
đó cs là cấu trúc đường viền được trả về từ lệnh contour,
cs = contour(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ị phần nhãn đường viền ở vị trí
kích chuột tương tự như lệnh ginput. 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 lấp đầy bằng màu
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;
contourf(X,Y,Z)

* Hai hàm meshc, meshz : 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.
meshc(X,Y,Z)
meshz(X,Y,Z)
* 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.
waterfall(X,Y,Z)
* Hai hàm surfc và surfvex: surfc vẽ một đồ thị dạng surf và thêm
đường bao bên dưới; surfvex vẽ một đồ thị surf nhưng thêm vào sự
chiếu sáng bề mặt từ nguồn sáng.
Cấu trúc tổng quát là surflvex(X, Y, Z, S, K) trong đó X, Y, Z tương tự
như surf, S là một vector tuỳ chọn trong hệ toạ độ decac (S = [Sx Sy
Sz]) hoặc trong toạ độ cầu (S=[az,el]) chỉ ra hướng của nguồn sáng.
Nếu không khai báo, giá trị mặc định của S là 450 theo chiều kim đồng
hồ từ vị trí người quan sát, S là một vector tuỳ chọn chỉ ra phần đóng
góp tuỳ theo nguồn sáng bao quanh, sự phản chiếu ánh sáng và hệ số
phản chiếu (K=[ka, kd, ks, spread])

49
VD: >>colormap (gary)
>>surfc (peaks)
* Hàm fill3, phiên bản 3 chiều của fill, vẽ một đa giác đều
trong không gian 3 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 đa giác được chỉ
bởi 3 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ó 3 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ụ 1:
>>fill3(rand(3, 4), rand(3, 4), rand(3, 4))
Ví dụ 2:
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;
fill3(X,Y,Z,'y')
* Các hàm bar3 và bar3h là phiên bản 3 chiều của bar và barh.
bar3(x,y) ; bar3h(x,y) ;
* Hàm pie3 là phiên bản 3 chiều của pie
pie3(x)
Ví dụ : x1=1:5;
y1=x1;
bar3(x1,y1)
bar3h(x1,y1)
pie3(x1)

50
5. Bảng màu
Bảng màu Function Mô tả bảng màu
Đ xanh lá cây Xanh da trời Màu hsv Giá trị màu bão hoà

0 0 0 Đen hot đen - đỏ – vàng – trắng


1 1 1 Trắng gray xám cân bằng tuyến tính
1 0 0 Đỏ bone xám có pha nhẹ với màu xanh
0 1 0 Xanh lá cây copper sắc thái của màu đồng
0 0 1 Xanh da trời pink màu hồng nhạt nhẹ
1 1 0 vàng white trắng hoàn toàn
1 0 1 Tím đỏ flag xen kẽ đỏ, trắng, xanh da trời và đen
0 1 1 lam xám jet sự thay đổi màu bão hoà
-5 -5 -5 Xám trung bình prism có màu sắc lắng kính
-5 0 0 Đỏ tối cool màu xanh tím
1 -62 -40 Đỏ đồng lines màu của nét vẽ
- 1 -83 Ngọc xanh biển summe Bóng của xanh lá cây và vàng
4
9
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 Sử dụng bảng màu


*Câ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.
VD: colormap (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.
VD: >>[x, y, z] = peak(30);
>>surf(x, y, z, atan2(x,y))
>>colormap(hsv), shading flat
>>axis([-3 3 –3 3 –6.5 8.1]), axis off
>>title (‘using a color Argument to surf’)

51
7. Sử dụng màu để thêm thông tin
Màu có thể được sử dụng để thêm thông tin vào đồ thị 3 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 surf(x, 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.
Dưới đây là một số cách sử dụng đối số màu để thông tin hoặc
nhấn mạnh thuộc tính đã tồn tại trong đồ thị.

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;
mesh(X,Y,Z)
mesh(X,Y,Z,R)
mesh(X,Y,Z,DEL2(Z))
8. Hiển thị bảng màu
* 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
>> hot(8)
* Hàm pcolor có thể được sử dụng để biểu diễn một bảng màu
vd: >>colormap(cool)
>>n=8;
>>pcolor([1:n+1;1:n+1]’)
>>title(‘Sử dụng hàm pcolor để hiển thị một bản đồ màu’)

52
* Hàm colorbar thêm một thanh màu đứng hoặc thanh màu
ngang 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 này chưa tồn tại hoặc cập nhật nếu nó tồn tại.
VD: >>[X, Y, Z] = peaks;
>>mesh(X, Y, Z);
>>colormap(hsv)
>>axis([-3 3 –3 3 –6 8])
>>colorbar

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


Thực tế colormap là các ma trận. Hàm brighten nhờ vào đặc
điểm này thay đổi colormap độ tăng hoặc giảm độ nhạy của
các màu đậm. brighten(n) cùng với brighten(-n) phục hồi
colormap ban đầu. Lệnh newmap = brighten(n) tạo một thanh
màu sáng hơn hoặc tối hơn của colormap hiện tại mà không
làm thay đổi biểu đồ màu hiện tại. Lệnh
newmap=brighten(cmap, c) đ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.
VD: >>pcolor([1:17;1:17]’)
>>title(‘Default color range’)
>>colormap(hsv(8))
>>axis(‘auto’)
>>colorbar
>>caxis

53
Chương 6: Symbolic MatLab
I. Giới thiệu
Symbolic Matlab là thư viện các phép toán kiểu kí tự được đưa
vào môi trường tính số học của MatLab. Thư viện này làm
phong phú và tiện ích thêm với nhiều kiểu tính toán toán học
khác cho phần tính số và đồ hoạ trước đây đã có trong thư
viện MatLab. Thư viện Symbolic MatLab được phát triển dựa
trên Symbolic Maple, đó là phần mềm được thiết kế ở trường
đại học Waterloo Canada.
II. Lệnh và hàm trong Symbolic MatLab
1. Lệnh sym, syms
♦ Mục đích: Biến đổi các số, biến, đối tượng thành symbolics
♦ Cú pháp: S = sym (A) x = sym (x)
x = sym (‘x’, ‘real’) x = sym (‘x’, ‘unreal’)
Hay: syms arg1 arg2 …
syms arg1 arg2 …real
syms arg1 arg2 unreal

2. Các hàm tính toán trong Symbolic MatLab


* diff: Tính đạo hàm
Cú pháp: diff (S, ‘v’) diff(S)
diff(S, n)
diff(S, ‘v’, n) ~ diff (S, n, ‘v’)
Giải thích:
- diff (S): Đạo hàm biểu thức symbolic S với biến của đạo hàm tự
do
- diff (S,’v’) hay diff (S, sym (‘v’)): Đạo hàm biểu thức symbolic S
với biến lấy đạo hàm là biến symbolic v.
- diff (S, n): Đạo hàm biểu thức symbolic S với n lần, n là số
nguyên dương hay còn gọi là đạo hàm cấp n.

54
Ví dụ 1: syms x y Ví dụ 2: syms u v
y = sin (x^2); y = u^2*v-u*v^3;
z = 2* cos (x^2)*x y1u=diff(y,u)
Pretty (z) %Hiển thị z ở dạng quen thuộc y1v=diff(y,v)
diff(y,x) y2u = diff (y,u,2)
diff(z,x) y3v = diff (y,v,3)

* Tính tích phân


Cú pháp: R = int (S) R = int (S, ‘v’)
R = int (S, a, b) R = int (S, ‘v’, a, b)
Giải thích:
- int (S): Tích phân không xác định của biểu thức symbolic S với
biến tự do mặc định. Muốn biết biến mặc định ta dùng lệnh
findsym.
- int (S, ‘v’): Tích phân không xác định của biểu thức với biến tích
phân v
- int (S, a, b): Tích phân xác định của biểu thức symbolic S với
biến mặc định và cận lấy tích phân từ [a, b].
- int (S, v, a, b) Tích phân xác định của biểu thức symbolic S với
biến tích phân v và cận lấy tích phân từ [a, b].

Ví dụ 1: syms x;
p=2*x+1
tp1=int(p)
tp2=int(p,0,1)
syms x y;
z=2*x^3+5*y^2;
tpx=int(z,x)
tpy=int(z,y)
tpy1_5=int(z,y,1,5)
Ví dụ 2: Tính tích phân: I = Ta viết: syms x s
f = exp (-(s*x)^2);
I = int (f, x, -inf, inf)
Kết quả: Một thông báo lỗi xuất hiện. Để khắc phục điều này s
phải là một biến symbolic thực

55
syms s real
f = exp (-(s*x)^2);
I = int (f, x, -inf, inf)
Kết quả: I = signum (s)/s*pi^1/2)

⎧ sign ( s ) = 1 → 0 < s

Ở đây hàm signum chính là hàm dấu: ⎨ sign ( s ) = 0 → s = 0 Với s là số thực
⎪ sign ( s ) = −1 → s < 0

x
Nếu s là số phức thì sign (s) =
abs (x )

* Tính ma trận jacobian (Tính jacobian một biểu thức, một ma


trận hay vectơ)
Cú pháp: R = jacobian (w, v)
Giải thích: Tính ma trận jacobian của w theo v, trong đó w là
biểu thức symbolic vô hướng hay một vectơ cột vô hướng, v
là vectơ hàng symbolic.
Ví dụ: syms x y z w v
w = [x*y*z; y; x+z];
v = [x, y, z];
R = jacobian (w, v)
b = jacobian (x+z, v) Kết quả như sau:
R= [y*z, x*z, x*y]
[0, 1, 0]
[1, 0, 1]
b= [1, 0, 1]

56
Ví dụ: syms x y
a = [2*x; x*y; x; 2*y];
v = [x, y];
yy =jacobian(a, v)
⎡2 0⎤
⎢y x⎥
yy = ⎢1 0⎥
⎢ ⎥
⎢⎣ 0 2 ⎥⎦

* limit: Tính giới hạn


Cú pháp: limit(F, x, a) limit(F, a)
limit(F) limit(F, x, a, ‘right’)
limit(F, x, a, ‘left’)
Giải thích: limit(F, x, a): Tìm giới hạn của biểu thức symbolic F
khi x
limit (F, a) dùng findsym (F) như là biến độc lập
limit (F) xem như a=0 là điểm giới hạn
limit(F, x, a, ‘right’) hoặc limit(F, x, a, ‘left’): giới hạn bên

Ví dụ: syms x a t h
limit (sin(x)/x)
limit (1/x, x, 0, ‘right’)
limit (1/x, x, 0, ‘left’)
limit ((sin(x+h) – sin(x))/h, h, 0)
v = [(1+a/x)^x, exp(-x)];
limit (v, x, inf, ‘left’)

57
* symsum: Tính tổng của dãy số là các biến symbolic
Cú pháp: r = symsum(S) r = symsum(S, v)
r = symsum(S, a, b) r = symsum(S, v, a, b)
Giải thích:
- symsum(S): Tổng của biểu thức symbolic S theo biến symbolic
k được xác định bằng lệnh findsym từ 0→ k –1.
- symsum(S, v): Tổng của biểu thức symbolic S theo biến
symbolic v được xác định từ 0→ v –1.
- symsum(S, a, b): Tổng của biểu thức symbolic S theo biến
symbolic k được xác định bằng lệnh findsym từ a→ b.
- symsum(S, v, a, b): Tổng của biểu thức symbolic S theo biến
symbolic v được xác định từ v = a tới
v = b.

Ví dụ: cho tổng của 2 dãy số sau:


s1 = 1+1/22 +1/32 + ….
s2 = 1 +x +x2 + …
syms x k
s1 = symsum (1/k^2, 1, inf)
s2 = symsum (x^k, k, 0, inf)
Kết quả: s1 = 1/6*pi^2
s2 = -1/(x –1)
*taylor: Khai triển taylor
Cú pháp: r = taylor (f)
r = taylor (f, n, v)
r = taylor (f, n, v, a)

58
Giải thích
taylor (f, n, v): cho ta xấp xỉ đa thức theo Maclaurin bậc n-1 của
biểu thức, hàm khai triển symbolic f và v là biến độc lập trong
biểu thức, v có thể là một xâu hay biến symbolic.
taylor (f, n, v, a): Khai triển Taylor của biểu thức hay hàm
symbolic f quanh điểm a. Đối số có thể là giá trị số, một
symbolic hay một xâu… Nếu không cho giá trị n thì mặc nhiên
trong MatLab n = 6.
Chuỗi Taylor của hàm giải tích f(x) khai triển quanh x = a cho
bởi:
∞ (n)
f (a )
f(x) = ∑n=0
(x − a) n

n!

Công thức Lệnh MatLab


5
f (n) (0) syms x
f(x) = ∑xn taylor(f)
n=0 n!
m
f (n) (0) taylor (f, m)
f(x) = ∑xn ; M thực, >0
n=0 n!
m
f (n) (a) taylor (f, a)
f(x) = ∑(x −a)n
n=0 n!
m1
f (n) (m2 ) taylor(f, m1, m2)
f(x) = ∑(x −m2 )n ; m1, m2 nguyên dương
n=0 n!
m
f (n) (a) taylor(f, m, a)
f(x) = ∑(x −a)n ; a thực và m nguyên dương
n=0 n!

59
Ví dụ: Khai triển Taylor của hàm: f =ex sin(x) quanh điểm x0 = 2 (nếu x0 = 0 ta
có khai triển MacLaurin)
Ta viết:
syms x
f = exp (x*sin(x));
t = taylor (f, 4, 2) %4 số hạng đầu tiên khác 0 và khai triển quanh điểm
x0 = 2.
Bây giờ ta có thể vẽ hàm đã cho và hàm khai triển bằng chuỗi taylor quanh
điểm x0 = 2 và cho nhận xét
syms x
f = exp (x*sin(x));
t = taylor (f, 4, 2);
xd = 1:0.05:3
yd = subs (f, x, xd); %thay thế biến x của f thành xd để vẽ
ezplot(t, [1, 3])
hold on;
plot(xd, yd, ‘r-.’)
title (‘Xap xi laylor cua ham’)
legend(‘Taylor’,‘f’)

3. Đại số tuyến tính


⎡k 2k 0⎤
♦ Ma trận: Cho ma trận cấp 3 như sau: A = ⎢⎢1 k 0⎥⎥
⎢⎣1 k 1⎥⎦
Ta viết: syms k
A = [k 2*k 0;1 k 0;1 k 1]
Kết quả A = [k, 2*k, 0]
[1, k , 0]
[1, k , 1]

60
♦ det: Tính định thức ma trận
Cú pháp: r = det (A)
Giải thích: det (A) tính định thức của ma trận A là ma trận symbolic hay số. det (A) cho ta biểu thức symbolic
nếu A là ma trận symbolic hay cho ta một số nếu A là ma trận các số.
⎡k 2k 0⎤
Ví dụ: Cho ma trận symbolic như sau:A = ⎢⎢1 k 0⎥⎥ Tính det(A).
⎢⎣1 k 1⎥⎦
Ta viết: syms k
A = [k 2*k 0;1 k 0;1 k 1];
r = det(A)
Kết quả: r = k^2 – 2*k

* diag: Ma trận chéo hoá


Cú pháp: diag(A, k)
diag(A)
Giải thích:
- diag (A, k): A là một vectơ hàng hay cột có n thành phần,
diag (A,k) cho ta ma trận vuông symbolic có bậc n+abs(k), mà
các phần tử của A ở trên đường chéo thứ k (k=0 là đường
chéo chính; k> 0 đường chéo thứ k ở phía trên đường chéo
chính, k<0 ở dưới đường chéo chính.
- diag(A) coi như k = 0

61
Ví dụ: v = [‘a’ ‘b’ ‘c’]
diag (v) ≈diag (v, 0) → [a, 0, 0]
[0, b, 0]
[0, 0, c]

[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
diag (v, -2) → [a, 0, 0, 0, 0]
[0, b, 0, 0, 0]
[0, 0, c, 0, 0]

* eig: Tính giá trị riêng và vectơ riêng


Cú pháp: lamda = eig (A)
[V, D] = eig (A)
Giải thích:
- lamda = eig(A): Cho ta một vectơ symbolic chứa các giá trị riêng
của ma trận vuông symbolic A
- [V, D] = eig(A): cho ta các vectơ riêng V theo cột và các giá trị
riêng là vectơ D theo các phần tử trên đường chéo chính.
Ví dụ: syms a b c
A = [a*b c+b; a-c b*c];
[V, D] = eig(A)

62
* expm: Cơ số e của ma trận
Cú pháp: expm (A)
Giải thích: Cơ số e của ma trận symbolic A
Ví dụ: syms t
A = [0 1;-1 0]
expm (t*A)→ [cos(t), sin (t)]
[- sin(t), cos(t)]
*inv: Nghịch đảo ma trận
Cú pháp: R = inv (A)
Giải thích: inv (A): Cho ma trận nghịch đảo ma trận symbolic A

Ví dụ: cho ma trận symbolic:

⎡ 2 −1 0 ⎤
⎢ − 1 ⎥⎥
A = ⎢− 1 2
⎢⎣ 0 −1 2 ⎥⎦
Ta viết: A = sym([2, -1, 0;-1, 2, -1; 0, -1, 2]);
inv(A)
[3/4, 1/2, 1/4]
[1/2, 1, 1/2]
[1/4, 1/2, 3/4]

63
* jordan: Tìm dạng chính tắc ma trận
Cho ma trận A, tìm ma trận V không suy biến sao cho inv(V)*A*V
hay J =V\A*V là chéo hoá. Hầu hết tất cả các ma trận, dạng
chính tắc jordan cho ta ma trận chéo có các phần tử trên
đường chéo chính là các giá trị riêng và các cột của ma trận đã
biến đổi là các vectơ riêng. Điều này luôn xảy ra nếu ma trận
đã cho là ma trận đối xứng hoặc nếu nó có các giá trị riêng
phân biệt
Cú pháp: J = jordan(A)
[V, J] = jordan(A)
Giải thích:
- jordan(A): Tính dạng chính tắc ma trận jordan A với A là ma trận
symbolic hay số. Ma trận phải được biết một cách chính xác.
Như vậy, các phần tử của nó phải là các số nguyên hay tỉ số
của các số nguyên bé.

- [V, J] = jordan(A): Tính cả ma trận jordan J và vectơ riêng V của nó, sao cho V\A*V = J

Ví dụ: A = [1-3 –2; -1 1 –1; 2 4 5]


[V, J] = jordan(A) cho ta kết quả:
⎡ 1 − 3 − 2⎤ ⎡−1 − 2 2⎤ ⎡3 0 0⎤
A = ⎢⎢−1 1 −1⎥⎥ , V = ⎢⎢ 0 − 2 0⎥⎥ , J = ⎢⎢0 2 1⎥⎥
⎣⎢ 2 4 5 ⎦⎥ ⎣⎢ 0 4 0⎥⎦ ⎣⎢0 0 2⎦⎥
⎧⎫3 ⎧1⎫ ⎧− 2⎫ ⎧2⎫
⎪⎪ ⎪⎪ ⎪ ⎪ ⎪⎪
Các giá trị riêng của ma trận A là: ⎨2⎬ và các vectơ riêng là ⎨0⎬ ; ⎨− 2⎬ ; ⎨0⎬
⎪2⎪ ⎪0⎪ ⎪4 ⎪ ⎪0⎪
⎩⎭ ⎩⎭ ⎩ ⎭ ⎩⎭

64
* null: Cho giá trị rỗng của ma trận hay phần tử ma trận
Cú pháp: z = null(A)
Giải thích: null: cho ma trận rỗng A
Ví dụ: syms a b c
A = [a* b b+c; a*c c*b-1];
A(:, 1) = [ ]
* poly: Biến đổi ma trận thành dạng đa thức
Cú pháp: p = poly(A)
p = poly(A,v)
Giải thích: poly(A): Nếu A là mảng số thì poly(A) cho ta các hệ
số đặc trưng của đa thức của ma trận A, nếu A là symbolic,
poly(A) cho ta đa thức đặc trưng của A theo cấp luỹ thừa giảm
của biến mặc định x. Biến v được xác định là biến thứ 2 thay
thế biến mặc định x.

Ví dụ: syms z
A = [1 -1 2;1 3 4;2 -1 1]
p = poly(A)
q = poly(sym(A))
s = poly(sym(A),z)
*rank: Hạng của ma trận
Cú pháp: rank(A)
Giải thích: rank(A): hạng của ma trận symbolic A
Ví dụ: syms a b c
A = [1 -1 2;1 3 4;2 -1 1]
rank(A)
B = [1 2;1 2]
rank (B)
C = [a -a b;a c b;a a a]

65
* svd: tách các phần tử suy biến của ma trận
Cú pháp: sigma = svd(A)
[U, S, V] = svd (A)
Giải thích: sigma = svd(A): vectơ symbolic chứa các giá trị suy
biến của một ma trận symbolic A
[U, S, V]=svd(A): Cho ta các ma trận U và V là các cột là
các vectơ suy biến và một ma trận chéo S chứa các giá trị suy
biến. Sao cho A = U*S*V. Như vậy vectơ suy biến symbolic
không có giá trị.
Ví dụ: A = [1 -1 2;1 3 4;2 -1 1]
sdv(A)
[U, S, V] = sdv(A)
* tril, triu: Ma trận tam giác dưới và ma trận tam giác trên
Cú pháp: tril(X) triu (X)
tril(X, k) triu (X,k)

Giải thích: tril(X): Cho ma trận tam giác dưới của ma trận X
tril(X,k): Cho ma trận tam giác dưới (k=0 là đường chéo
chính; k>0 đường chéo lớn hơn đường chéo thứ k là 0, k<0 ở
trên đường chéo thứ k thì bằng 0)
triu(X) và triu(X,k) cho ma trận tam giác trên
Ví dụ: syms a b c
A = [a –a b;1 3 4;a+1 b-1 c+1]
tril (A)
tril (A,1)
tril (A,-1)
triu (A)
triu (A,1)
triu (A,-1)

66
4. Các hàm làm đơn giản hoá các biểu thức
* collect: gom số hạng, biến
Cú pháp: R = collect(S)
R = collect (S,v)
Giải thích: collect(S) là đa thức, gom các số hạng chứa biến x
hay collect(S,v) gồm các biến v trong đa thức S
Ví dụ: syms x y
R1 = colect((exp(x)+x)*(x+2))
R2 = collect((x+y)*(x^2+y^2+1),y)
R3 = collect([(x+1)*(y+1),x+y])

* expand: khai triển biểu thức


Cú pháp: R = expand (S)
Giải thích: expand(S): khai triển biểu thức symbolic
Ví dụ: expand((x-2)*(x-4)) kết quả x^2 – 6*x +8
expand(cos(x+y)) kết quả cos(x) * cos(y) –
sin(x) * sin(y)
* factor: Phân tích biểu thức thành thừa số
Cú pháp: factor(X)
Giảit thích: factor(X) phân tích biểu thức mảng symbolic X thành
thừa số
Ví dụ: factor(x^3- y^3) → (x-y)*(x^2 + x*y + y^2)
* horner: biến đổi đa thức dưới dạng thừa số
Cú pháp: R = horner (P)

67
Giải thích: Giả sử P là ma trận của các đa thức symbolic.
horner(P) biến đổi mỗi phần tử của P vào đa thức Horner của
nó hay lồng vào nó dưới dạng thừa số.
Ví dụ: horner(x^3-6*x^2+11*x-6) → -6 + (11+(-6+x)*x)*x
* numden: Lấy tử và mẫu số
Cú pháp: [N, D] = numden(A)
Giải thích: [N, D] = numden(A); chuyển mỗi phần tử của A có
dạng phân số. A có thể là ma trận, đa thức, con số…, thành tử
số N và mẫu số D
Ví dụ: sym n d
[n, d] = numden(4/5) → n = 4, d = 5
sym x y
[n, d] = numden(x/y + y/x) → n = x^2 + y^2; d = y*x

*simple, simplify: Tìm dạng tối giản của đa thức


Cú pháp: r = simple (S) r = simplify (S)
Giải thích: simple (S), simplify (S): Tối giản hoá biểu thức
symbolic S
Ví dụ: simple (cos(x)^2 + sin(x)^2) → 1
simplify (2*cos(x)^2 – sin (x)^2) → 3* cos(x)^2 – 1
* subs: thay thế tất cả các biến thành biến mới hay giá trị
Cú pháp: R =subs (S) R = subs(S, old, new)
Giải thích: subs(S): thay thế tất cả các biến trong biểu thức hay
ma trận symbolic S
subs(S, old, new): thay thế tất cả các biến old trong biểu
thức S thành biến new

68
Ví dụ: a = 980;
Cl =3;
y = dsolve (‘Dy = -a *y’) → y = exp (-at)*Cl
subs(y) → 3*exp (-980*t)
subs (a+b, a, 4) → 4+b % b phải là biến số
subs(cos(a) + sin(b),{a, b},{sym(1,2}→ cos(1) + sin (2)

5. Giải phương trình


* compose: Hợp của hàm
Cú pháp: compose(f,g) compose(f, g, z)
compose(f, g, x, z) compose(f, g, x, y, z)
Giải thích:
- compose(f,g): f(g(y)) với f=f(x), g=g(y), ở đây x là biến symbolic
của f và y là biến symbolic của g, dùng findsym để tìm các biến
này
- compose(f, g, z): f(g(z) với f = f(x), g = g(y), ở đây x là biến
symbolic của f và y là biến symbolic của y.dùng findsym để tìm
các biến này
- compose(f, g, x, z): f(g(z)), x là biến độc lập đối với f. Nếu f =
cos(x/t) thì compose(f, g, x, z) → cos(g(z)/t) và compose(f, g, t,
z) → cos(x/g(z)).

69
- compose(f, g, x, y, z): x là biến độc lập của f và y là biến độc
lập của g.
- Nếu: f = cos(x/t) và g = sin (y/u) thì
- compose(f, g, x, y, z) → cos(sin(x/u)/t),
- mặt khác compose (f, g, x, u, z) → cos (sin(y/z)/t)
Ví dụ: syms x y z t u
f = 1/(1+x^2); g = sin(y); h = x^t; p = exp(-y/u);
Thì: compose(f, g) → 1/(1+sin(x)^2
compose(f, g, t) → 1/(1+sin(t)^2
compose(h, g, x, z) → sin(z)^t

* dsolve: giải hệ phương trình vi phân thường


Cú pháp: r = dsolve(‘eq1, eq2,…,’,’cond1, cond2, …,’v’)
Giải thích: Giải hệ phương trình vi phân thường xác định bởi
eq1, eq2, .., biến độc lập v và các điều kiện biến hay điều kiện
ban đầu xác định bởi cond1, cond2,…Biến độc lập mặc nhiên
là t. Nếu như không giải được bằng giải tích như trên ta dùng
phương pháp số như phương pháp Runge – Kutta chẳng hạn.
Ví dụ: dsolve(‘Dy=a*y’) → exp(a*t)*C1
dsolve (‘Df = f + sin(t)’) → -1/2 * cos(t) – ½* sin(t) + exp(t) * C1

70
* finverse: Tìm hàm ngược
Cú pháp: g = finverse (f) g = finverse(f,u)
Giải thích:
- g = finverse (f): hàm ngược của hàm f, f là hàm symbolic với
biến x, kết quả tính f-1 g(f(x)) = x
- g = finverse(f,u): hàm ngược của hàm f, f là hàm symbolic với
biến u, kết quả tính f-1 g(f(u)) = u. Dạng này hàm f có thể chứa
nhiều biến symbolic

Ví dụ: sym x
finverse(1/tan(x)) → atan(1/x)
sym u v
finverse(exp(u-2)*v,u) → 2*v +log(u)
* solve: Giải hệ phương trình
Cú pháp: g = solve(eq) g = solve(eq1, eq2, …,eqn)
g = solve(eq, var) g = solve(eq1, eq2, …,eqn, var1, var2, …,
varn)
Giải thích: solve(eq): giải phương trình eq=0 với nghiệm lấy ra
là biến mặc nhiên.
solve(eq, var): giải phương trình eq=0 với nghiệm lấy ra có
tên tương ứng với biến var

71
solve(eq1, eq2,…): giải phương trình eq1=0, eq2=0,… với
nghiệm lấy ra là biến mặc nhiên. (dùng lệnh findsym để tìm các
biến này)
solve(eq1,eq2,… ,var1, var2,…): giải phương trình eq1=0,
eq2=0,… với nghiệm lấy ra có tên tương ứng với biến var1,
var2,…
Ví dụ: solve(‘2*x+y) → -1/2 *y
solve(‘a*x^2+b*x+c’,’b’) → -(a*x^2+c)/x
L=solve(‘x+y = 1’, ‘x-11*y = 5’) → L.y = -1/3, L.x= 4/3

6. Biến đổi tích phân


* fourier: Biến đổi Fourier
Cú pháp: F = fourier(f)
F = fourier(f, v)
F = fourier(f, u, v)
Giải thích:
- F = fourier(f): Biến đổi Fourier của hàm vô hướng symbolic f với
biến độc lập mặc nhiên f và cho ta hàm mặc nhiên qua phép
biến đổi này là w. Nghĩa là: f = f(x) → F =F(w). Nếu f = f(w) thì
Fourie của nó cho ta một hàm

72

∫ f (x)e
−iwx
của t là F = F(t) bởi định nghĩa sau: F(w) = dx với x là biến symbolic của f
−∞

∫ f (x)e
−ivx
- F = fourier (f,v): F là hàm của biến symbolic v thay thế biến mặc nhiên w. F(v) = dx
−∞
- F = fourier (f,u,v): f là hàm của u và F là hàm của biến symbolic v chúng thay thế các biến mặc nhiên x và w

∫ f (u)e
−ivx
tương ứng. F(v) = du
−∞

Fourier Lệnh MatLab


f(x) = e−x
2
f = exp(-x^2)

w2 / 4
→fourier(f)→pi^(12)*exp(-1/4*w^2)
∫ f (u)e du = πe
−ivx
→ F[f](w) =
−∞

* laplace: biến đổi Laplace


Cú pháp: laplace(F)
laplace(F,t)
laplace(F, w, z)
Giải thích:
- L = laplace(F): biến đổi Laplace của hàm symbolic F với biến mặc nhiên độc lập t. Nó cho ta một hàm
của s. F = F(t) → L = L(s). Nếu F = F(s) biến đổi Laplace cho ta một hàm theo t. F = F(s) → L = L(t). Theo

định nghĩa L(s) = ∫F(t)e−stdt
0

73

- L = laplace(F,t): L là một hàm của t thay thế biến mặc nhiên s L(t) = ∫F(x)e−txdx
0
- L = laplace(F,w, z): L là một hàm của z và F là hàm của w, nó thay thế các biến symbolic mặc nhiên s

và t tương ứng L(z) = ∫F(w)e−zwdw
0

* ilaplace: Biến đổi Laplace ngược


Cú pháp: F = ilaplace(L)
F = ilaplace(L, y)

F = ilaplace(L, y, x)
Giải thích:
- F = ilaplace(L): Biến đổi Laplace ngược của hàm symbolic với biến mặc nhiên độc lập s. Nó cho ta
một hàm của t, L = L(s) → F = F(t) biến đổi ilaplace cho ta một hàm theo x.L = L(f) → F = F(x). Theo định
nghĩa:
c+i∞
F(t) = ∫ L(s)e
st
ds
c−i∞
c+i∞
- F = ilaplace(L,y): F là một hàm của y thay thế biến mặc nhiên t. F(y) = ∫ L( y)e
sy
ds
c−i∞

74

You might also like