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

HỌC MATLAB BẰNG THÍ DỤ

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




HỌC MATLAB BẰNG
THÍ DỤ
HOẽC MATLAB BAẩNG TH DUẽ
Trũnh Anh Ngoùc
8/5/2009
Học MATLAB bằng thí dụ 1
Tài liệu này được viết với mục đích hướng dẫn các sinh viên học nhanh về Matlab.
Phần đầu tài liệu là nội dung bài giảng của tác giả về Matlab trong học phần "Giải
phương trình bằng máy tính". Một số thí dụ, chương trình tính toán số được lấy từ bài
giảng "Giải tích số 1" cho lớp cử nhân tài năng, "Cơ học chất lỏng" cũng của tác giả.
Matlab là phần mềm trợ giúp tính toán số và ký hiệu, do đó tài liệu gồm hai phần: (1)
tính toán ký hiệu, và (2) tính toán số. Sau khi đọc xong tài liệu này, sinh viên có thể:
- Dùng Matlab giải các bài toán giải tích, đại số và đại số tuyến tính;
- Dùng Matlab để viết chương trình tính toán cho các môn như Phương pháp phần
tử hữu hạn, Giải tích số, Cơ học vật rắn biến dạng, Cơ học chất lỏng . . .
1 Vai trò của máy tính trong nghiên cứu và ứng
dụng toán học
• Công cụ trợ giúp tính toán số và ký hiệu.
Về tính toán số: giúp mô phỏng các bài toán thuộc lãnh vực khoa học và kỹ
thuật, phân tích dữ liệu.
Về tính toán ký hiệu: cho phép thực hiện, kiểm tra các phép biến đổi toán
học; dự đoán, thử nghiệm các dự đoán toán học; đánh giá thực hành các kết quả lý
thuyết.
• Hiển thò các kết quả bằng đồ họa.
2 Matlab - phần mềm toán học
Matlab là một ngôn ngữ thực hiện dành cho tính toán, đặc biệt là các tính toán kỹ
thuật. Với Matlab ta có thể tính toán, hình dung, và lập trình cho các đối tượng
toán học.


Matlab là một hệ thống tương tác mà phần tử dữ liệu cơ bản của nó là mảng
(array). Điều này, thể hiện trong tên gọi của nó (Matlab là viết tắt của Matrix
laboratory), cho phép ta thực hiện dễ dàng các tính toán ma trận và vectơ thường
gặp trong các bài toán kỹ thuật.
Hệ thống Matlab gồm năm phần chính:
1) Ngôn ngữ Matlab
2) Môi trường làm việc Matlab
3) Quản lý đồ họa
4) Thư viện các hàm toán học Matlab
5) Giao diện chương trình ứng dụng Matlab
Trong tài liệu này ta sẽ làm quen với các phần 1) - 4). Bạn đọc nên tìm các
2 Trònh Anh Ngọc
tài liệu:
Getting Started with MATLAB, MathWorks, Inc., 1998.
Symbolic Math Toolbox User's Guide, MathWorks, Inc., 1998.
trong tủ sách của MathWorks để đọc thêm về Matlab khi cần.
3 Lướt qua Matlab - cái nhìn đầu
Trong mục này ta sẽ lướt qua một vòng Matlab để có một cái nhìn khái quát về tính
năng và những đặc điểm đáng lưu ý của nó. Để học nhanh Matlab bạn phải đọc tài
liệu này với máy tính trước mặt. Hãy thử thực hiện các thí dụ được đưa ra trong tài
liệu. Quan sát "phản ứng" của Matlab khi xử lý các lệnh đưa vào. Tự đặt ra các thí
dụ để thử nghiệm, đọc kỹ các dòng cảnh báo, thông báo lỗi nếu có.
Hình 1: Cửa sổ Matlab.
◦ Để khởi động Matlab ta chỉ cần nhắp kép (double click) vào biểu tượng của
Học MATLAB bằng thí dụ 3
nó, hoặc vào menu start\All programs\Matlab 7.1 rồi chọn Matlab 7.1
1
.
Một cửa sổ có tên
Matlab (hay Matlab command) xuất hiện cùng với dấu nhắc

lệnh >>(hình 1). Các lệnh của Matlab được nhập vào từ đây.
◦ Để thoát (quit) chỉ cần nhắp chuột vào dấu X ở góc trên bên phải cửa sổ
Matlab.
◦ Tất cả các đối tượng đưa vào Matlab phải được "khai báo" bằng cách xác
đònh "nội dung" của nó.
Vectơ
◦ Để tạo một vectơ, thí dụ
a, trong cửa sổ Matlab command ta nhập vào
>>
a=[12345698765]
sau khi nhấn enter Matlab trả về:
a=
12345698765
Chú ý: các thành phần của vectơ nằm giữa hai dấu ngoặc vuông, cách nhau một
khoảng trắng. Diễn ngữ "Matlab trả về" sẽ được hiểu ngầm trong các thí dụ sau.
Tạo vectơ
b với các thành phần lấy giá trò nguyên từ 0 đến 10
>>
b = 0:10
b=
012345678910
Nếu muốn các thành phần liên tiếp cách nhau 2 thì nhập vào
>>
c = 0:2:10
c=
0246810
Kích thước (chiều dài) của vectơ được cho nhờ hàm length,
>>
dai=length(c)
dai=

6
◦ Tính toán trên vectơ cũng rất đơn giản. Cộng các thành phần của vectơ a
với 3
>> a+3
ans =
456789121110
Chú ý: các lệnh, các biến đưa vào được Matlab lưu giữ trong workspace (vùng làm
việc). Có thể hình dung
workspace như là tờ giấy nháp ta dùng khi làm tính, các
phép tính được viết tuần tự từ trên xuống dưới, ta có thể xem lại những kết quả đã
thực hiện, xóa những biến hoặc biểu thức được đưa vào (dùng lệnh
clear tenbien
hoặc clear all - xóa tất cả). Nội dung của workspace được hiển thò trên cửa
sổ Matlab ta có thể dùng thanh trượt bên phải cửa sổ Matlab để xem các nội dung
cũ(hình 2).
Trong tính toán trên, do ta không chỉ đònh phép gán, Matlab lưu trữ kết quả
1
Tên Matlab 7.1 có thể khác tùy thuộc phiên bản Matlab mà bạn dùng.
4 Trònh Anh Ngọc
Hình 2: Nội dung workspace được hiển thò trên cửa sổ Matlab.
tính toán trong một biến tạm thời gọi là "ans".
Về mặt toán học ta không thể cộng vectơ với một số! Trong thí dụ trên Matlab
đã mở rộng
3 ra thành ma trận [333333333]có cùng độ dài như vectơ
a rồi thực hiện phép cộng.
◦ Nếu cần thực hiện lại một lệnh đã được đưa vào trước đó ta có thể tái hiện
lại lệnh này bằng cách nhấn phím ↑ một số lần thích hợp mà không cần phải gõ lại
lệnh.
Tính vectơ
d là tổng của hai vectơ a và b

>> d=a+b
d=
13579111515151515
Chú ý: muốn cộng hai vectơ thì chúng phải có cùng độ dài. Phép trừ trên vectơ
cũng được thực hiện tương tự.
Ma trận
◦ Nhập ma trận vào Matlab giống như nhập một vectơ, ngoại trừ mỗi dòng
cách nhau bởi dấu chấm phẩy hoặc enter (return):
Học MATLAB bằng thí dụ 5
>> B=[1234;5678;9101112]
hay
>>
B=[1234
5678
9 10 11 12]
B=
1234
5678
9 10 11 12
Kích thước ma trận được cho bằng hàm size,
>>
size(B)
ans=
34
◦ Matlab có thể thực hiệu nhiều phép tính ma trận, dưới đây là một số phép
tính thường dùng (bạn đọc tự đưa ra thí dụ để thử nghiệm), danh sách các lệnh được
hiển thò khi dùng lệnh
help. Từ danh sách này ta có thể tra cứu cú pháp lệnh và
các thông tin liên quan.
Phép cộng (trừ) hai ma trận tương tự như trường hợp vectơ. Đặc biệt, nhân ma

trận với một số có thể viết theo thứ tự nào cũng được. Thí dụ, nếu
A là ma trận s
là một số thì hai lệnh s*A và A*s cho cùng một kết quả.
Chuyển vò:
>>
C=B’
Nếu B là ma trận phức thì B’cho chuyển vò của liên hợp phức của B. Trong
trường hợp muốn lấy chuyển vò của
B ta phải dùng ".'"
>>
D=B.’
Nhân hai ma trận:
>>
D=A*B
Nếu muốn nhân các phần tử tương ứng của hai ma trận có cùng kích thước ta
dùng ".*"
>>
G=E.*F
Nếu E là ma trận vuông thì phép nhân ma trận E với chính nó n lần có thể
thực hiện bằng phép lấy lũy thừa. Thí dụ:
>>
E

3
Nếu muốn lũy thừa từng phần tử của ma trận ta dùng ".

". Thí dụ:
>>
E.


3
Nghòch đảo ma trận vuông:
>>
inv(E)
Các giá trò riêng:
>>
eig(E)
Đa thức đặc trưng:
>>
poly(E)
6 Trònh Anh Ngọc
Hàm số
◦ Matlab có một thư viện các hàm toán học rất phong phú như :
sin, cos,
log, exp, sqrt,
. . . Các số thường dùng như : π, i (hay j) =

−1 cũng được đònh
nghóa sẵn trong Matlab.
>>
sin(pi/4)
ans =
0.7071
◦ Đối số của hàm có thể là một ma trận. Thí dụ, x=[1 2; 3 4], lệnh exp(x)
trả về
ans =
2.7183 7.3891
20.0855 54.5982
đó chính là ma trận


exp(1) exp(2)
exp(3) exp(4)

.
◦ Để tìm hiểu cách dùng một hàm Matlab bất kỳ chỉ cần gõ
>>
help [ten ham]
◦ Matlab cũng cho phép người sử dụng tạo các hàm riêng cho mình bằng lệnh
function (sẽ được giới thiệu dưới đây).
Đồ thò
Trong Matlab để vẽ đồ thò một hàm số ta dùng hàm
plot. Thí dụ để vẽ đồ
thò hàm
sin(t), trước hết ta tạo vectơ thời gian t và rồi tính giá trò hàm sin tại
mỗi thời điểm
>>
t = 0:0.25:7;
y =sin(t);
>> plot(t,y)
Chú ý: tên hàm (plot) viết bằng chữ thường, dấu chấm phẩy cuối mỗi câu lệnh chỉ
thò Matlab không thể hiện kết quả tính toán ra màn hình.
M-file
M-file là các file văn bản (text) chứa mã Matlab. Tên M-file có phần mở rộng
".m". Có hai loại M-file:
◦ Script, không có đối số nhập/xuất, giống như một "kòch bản" ghi các lệnh
tính toán tuần tự mà người sử dụng yêu cầu. Khi gõ tên file ở dấu nhắc lệnh rồi
nhấn phím enter, Matlab sẽ thực hiện các lệnh ghi trong file, trên dữ liệu hiện hành
trong vùng làm việc (workspace). Trong thực hành, để kiểm soát dữ liệu tính toán,
script file thường bắt đầu bằng lệnh
clear all xóa tất cả các biến lưu trữ trong

workspace, và khởi tạo lại các biến mà script file cần dùng.
◦ Function, có đối số nhập/xuất. Loại file này thường được dùng để đònh nghóa
hàm (giống như chương trình con). Thí dụ M-file rank.m
Học MATLAB bằng thí dụ 7
Hình 3: Đồ thò hàm y = sin( t ) với 0 ≤ t ≤ 7.
function r = rank(A,tol)
% RANK Matrix rank.
% RANK(A) provides an estimate of the number of linearly
% independent rows or columns of a matrix A.
% RANK(A,tol) is the number of singular values of A
% that are larger than tol.
% RANK(A) uses the default tol = max(size(A)) * norm(A) * eps.
s = svd(A);
if nargin = =1
tol = max(size(A)) * max(s) * eps;
end
r = sum(s
> tol);
Chú ý: function trong dòng thứ nhất là từ khóa. Dòng này cho tên function và
thứ tự các đối số. Tiếp theo dòng đầu là các dòng bình luận, bắt đầu bằng %, dòng
đầu tiên trong chúng sẽ được Matlab hiển thò khi ta gõ lệnh
help rank. Phần còn
lại của file là các dòng khả thi.
4 Giới thiệu về Symbolic Math Toolbox
Mục này giới thiệu các nét chính của Symbolic Math Toolbox, một thành phần của
Matlab đảm trách việc tính toán ký hiệu.
8 Trònh Anh Ngọc
4.1 Đối tượng ký hiệu
Đối
tượng ký hiệu (symbolic object) hay sym là một cấu trúc dữ liệu lưu trữ một chuỗi

(string) biểu diễn của ký hiệu. Đối tượng ký hiệu được dùng để biểu diễn các biến,
các biểu thức và các ma trận ký hiệu. Để tạo các biến và biểu thức ký hiệu ta dùng
hàm
sym. Thí dụ,
>>
x = sym(’x’)
tạo một biến ký hiệu x lưu trữ ký tự x và
>>
a = sym(’alpha’)
tạo một biến ký hiệu a lưu trữ chuỗi các ký tự alpha. Thí dụ khác,
>>
rho = sym(’(1 + sqrt(5))/2’)
tạo một biến ký hiệu biểu diễn tỉ lệ vàng (golden ratio).
4.2 Các phép tính ký hiệu thường dùng
Ta có thể thực hiện nhiều phép tính trên các biến ký hiệu. Dưới đây là một vài
phép tính thường dùng.
SUBS - thay thế ký hiệu.

subs(s) thay thế tất cả các biến trong biểu thức ký hiệu s bằng các giá trò
nhận được từ hàm gọi, hay vùng làm việc. Thí dụ, giả sử
a=980, C1=3 đã tồn tại
trong vùng làm việc.
>>
y=exp(-a*t)*C1;
>> subs(y)
trả về ans=3*exp(-980*t)
◦ subs(s,new) thay thế các biến ký hiệu tự do trong s bằng new. Thí dụ, s
là biểu thức f=x

2

>> subs(s,2)
trả về ans=4 (x được thay bằng 2 trong biểu thức s).

subs(s,old,new) thay thế old bằng new trong biểu thức s. Ở đây old
là biến ký hiệu, chuỗi biểu diễn một tên biến hay chuỗi diễn tả một biểu thức; new
là một biến ký hiệu hoặc biến số hoặc biểu thức. Thí dụ, subs(a+b,a,4) trả về
4+b (a được thay thế bằng 4).
Lệnh
subs cũng cho phép thay thế nhiều biến cùng một lúc. Thí dụ,
subs(cos(a)+sin(b),{a,b},{sym(’alpha’),2})
trả về cos(alpha)+sin(2) (a được thay thế bằng chuỗi alpha, b được thay thế
bằng
2).
Nếu
old và new là các vectơ hay mảng có cùng kích thước, thì mỗi phần tử
của
old được thay bởi phần tử tương ứng của new. Nếu s và old là các vô hướng
còn
new là mảng hay mảng ma trận (cell array), thì các vô hướng được mở rộng ra
để cho kết quả mảng. Thí dụ,
subs(exp(a*t),’a’,-[1 3; 4 2]) trả về
[
exp(-t), exp(-3*t)]
Học MATLAB bằng thí dụ 9
[ exp(-4*t), exp(-2*t)]
Trong thí dụ này
a được mở rộng ra thành mảng rồi thay thế các phần tử tương ứng
của nó bằng các phần tử tương ứng của mảng
-[1 3; 4 2]. Về mặt toán học, các
phép tính được thực hiện như sau

exp

−1 −3
−4 −2

∗ t

= exp

−t −3 ∗t
−4 ∗t −2 ∗t

=

exp(−t) exp(−3 ∗ t)
exp(−4 ∗t) exp(−2 ∗t)

Nếu new là các ma trận mảng hay ma trận số, thì sự thay thế được thực hiện
từng phần tử; nghóa là
subs(x*y,{x,y},{A,B}) trả về A.*B khi A, B là ma trận
các số). Thí dụ,
subs(x*y,{x,y},{[0 1;-1 0],[1 -1;-2 1] }) trả về
[
0, -1]
[
2, 0]
EXPAND - khai triển biểu thức ký hiệu.
expand(s) viết mỗi phần tử của biểu thức ký hiệu s như là tích các thừa số
của nó.
expand hay được dùng với đa thức, ngoài ra nó cũng được dùng để khai

triển các biểu thức lượng giác, hàm mũ và hàm logarit.
Thí dụ:
1)
((x-2)*(x-4)) trả về x

2-6*x+8.
2)
expand(cos(x+y)) trả về cos(x)*cos(y)-sin(x)*sin(y).
3)
expand(exp((a+b)

2)) trả về exp(a

2)*exp(a*b)

2*exp(b

2).
4)
expand([sin(2*t), cos(2*t)]) trả về [2*sin(t)*cos(t), 2*cos(t)

2-
1].
SIMPLIFY - đơn giản biểu thức ký hiệu.
simplify(s) đơn giản mỗi phần tử của ma trận ký hiệu s.
Thí dụ:
1)
simplify(sin(x)

2 + cos(x)


2) trả về 1.
2) Với
rho là biến biểu diễn tỉ lệ vàng (thí dụ ở trên).
>>
f = rho

2-rho-1
f=
(1/2+1/2*5

(1/2))

2-3/2-1/2*5

(1/2)
>> simplify(f)
f=
0
3) simplify(exp(c*log(sqrt(alpha+beta)))) trả về (alpha+beta)

(1/2*c).
Chú ý, lệnh gán biểu thức dưới đây
>>
f = sym(’a*x

2 + b*x + c’)
không tạo các biến tương ứng với các từ a, b, c, và x của biểu thức. Để thiết lập
các phép toán ký hiệu (e.g., tích phân, vi phân, thay thế, etc.) trên
f, ta cần phải tạo

10 Trònh Anh Ngọc
các biến một cách tường minh
>>
a = sym(’a’)
>> b = sym(’b’)
>> c = sym(’c’)
>> x = sym(’x’)
hay đơn giản
>>
syms a b c x
SIMPLE - tìm dạng đơn giản nhất của biểu thức ký hiệu hay ma trận.
simple(s) cố gắng thử nhiều biến đổi đại số khác nhau để đơn giản s, rồi
trả về biểu thức ngắn nhất.
Dưới đây là kết quả trả về của
simple(s) kèm theo chỉ đònh phép biến đổi
được dùng.
s kết quả phương pháp
cos(x)

2+sin(x)

2 1 simplify
2*cos(x)

2-sin(x)

2 3*cos(x)

2-1 simplify
cos(x)


2-sin(x)

2 cos(2*x) combine(trig)
cos(x)+(-sin(x)

2)

(1/2) cos(x)+i*sin(x) radsimp
cos(x)+i*sin(x) exp(i*x) convert(exp)
(x+1)*x*(x-1) x

3-x combine(trig)
x

3+3*x

2+3*x+1 (x+1)

3 factor
cos(3*acos(x)) 4*x

3-3*x expand
log(x) + log(y) log(x*y) combine
4.3 Một số cách dùng khác của hàm sym
a) Chuyển đổi một ma trận từ dạng số sang dạng ký hiệu. Lệnh A = hilb(3)
sinh ra ma trận Hilbert 3x3
A=
1.0000 0.5000 0.3333
0.5000 0.3333 0.2500

0.3333 0.2500 0.2000
Áp dụng sym cho A
>>
A = sym(A)
ta được (chính xác vô cùng) dạng ký hiệu của ma trận Hilbert 3x3
A=
[ 1, 1/2, 1/3 ]
[ 1/2, 1/3, 1/4 ]
[ 1/3, 1/4, 1/5 ]
b) Xây dựng các biến thực và phức. Lệnh sym cho phép chỉ đònh các tính chất
toán học của biến ký hiệu bằng cách dùng tùy chọn
’real’. Nghóa là, các lệnh
Học MATLAB bằng thí dụ 11
>> x = sym(’x’,’real’);
>> y = sym(’y’,’real’);
hay hiệu quả hơn
>>
syms x y real
tạo các biến ký hiệu x và y có tính chất toán học thêm vào là các biến thực. Điều
này có nghóa là biểu thức
f=x

2+y

2
là không âm. Suy ra,
z=x+I*y
là một (hình thức) biến phức và có thể tính toán như số phức. Các lệnh conj(x),
conj(z), expand(z*conj(z))
trả lại x, x - i*y, x


2+y

2 (lệnh conj là
toán tử liên hợp phức). Nếu
conj(x) == x trả lại 1, thì x là một biến thực. Để
xóa tính chất "thực" của
x, ta dùng lệnh
>>
syms x unreal
hay
>>
x = sym(’x’,’unreal’)
>> clear x
không làm x trở thành biến không thực!
c) Dùng
sym để truy xuất các hàm Maple. Ta có thể truy xuất hàm giai thừa
k! của Maple, bằng cách dùng sym,
>>
kfac = sym(’k!’).
Để tính
6! hay n!, gõ
>>
syms k n
>> subs(kfac,k,6)
ans =
720
>> subs(kfac,k,n)
ans =
n!

d) Tạo các hàm trừu tượng. Lệnh
>>
f = sym(’f(x)’)
tạo biến ký hiệu f tác động giống như f(x) và có thể được tính toán bằng các lệnh
của Symbolic Math Toolbox. Thí dụ, xây dựng tỉ sai phân cấp 1, lệnh
>>
df = (subs(f,’x’,’x+h’) - f)/’h’
hay
>>
syms x h
>> df = (subs(f,x,x+h)-f)/h
trả về
df =
(f(x+h)-f(x))/h
e) Tạo các hàm toán học ký hiệu
Cách 1 - dùng các biểu thức ký hiệu. Dãy các lệnh
>>
syms x y z
12 Trònh Anh Ngọc
>> r = sqrt(x

2+y

2+z

2)
>> t = atan(y/x)
>> f = sin(x*y)/(x*y)
sinh ra các biểu thức ký hiệu r, t, và f. Ta có thể dùng diff (đạo hàm), int (tích
phân),

subs, và các hàm Symbolic Math Toolbox khác để tính toán những biểu thức
như vậy.
Cách 2 - tạo một M-File. Muốn tạo hàm
sinc (=sin(x)/x), ta tạo một M-
file trong thư mục @sym.
function z = sinc(x)
% SINC The symbolic sinc function
% sin(x)/x. This function
% accepts a sym as the input argumen.
if is equal(x,sym(0))
z=1;
else
z = sin(x)/x;
end
Hàm plot được dùng để vẽ đồ thò của các hàm được cho dưới dạng "số", trong
thí dụ vẽ đồ thò ở trên, hàm
y=sin(t) hàm được cho dưới dạng "số" như là dãy các
điểm hình học
(t(i),y(i)) (i=1,2, ,29) được xác đònh bởi hai vectơ t và y.
Hàm
plot vẽ đồ thò này bằng cách nối các điểm bởi các đoạn thẳng. Với các hàm
toán học được đònh nghóa bằng ký hiệu Matlab cung cấp hàm
ezplot để vẽ đồ thò
của chúng,
>>
syms x real
>> ezplot(sin(x))
cho ta đồ thò của hàm sin trong khoảng mặc nhiên [−2π, 2π]. Nếu muốn vẽ đồ thò
Hình 4: Đồ thò hàm sin(x) dùng lệnh ezplot(sin(x)).
trong khoảng [0, 7] thì ta phải chỉ đònh rõ

Học MATLAB bằng thí dụ 13
>> ezplot(sin(x),[0 7])
Hình 5: Đồ thò hàm sin(x) dùng lệnh ezplot(sin(x),[0 7]).
4.4 Biến ký hiệu mặc nhiên
Khi ta đưa vào một hàm toán học bằng biểu thức của nó, thí dụ
>>
clear all
>> syms x n a t b
>> f=x

n
>> g = sin(a*t+b)
Matlab sẽ tự động nhận dạng đâu là biến ký hiệu. Và khi được yêu cầu tính đạo
hàm của các hàm này, không chỉ đònh biến độc lập, thì Matlab sẽ tính theo các biến
ký hiệu mặc nhiên. Với các hàm trên chúng ta nhận được
n*x

(n-1)
a*cos(a*t+b)
Làm thế nào để biết biến mà Symbolic Math Toolbox lấy đạo hàm? Câu trả
lời là lệnh
findsym.
>>
findsym(f,1)
trả về
ans =
x
Nếu trong findsym vắng mặt đối số thứ hai thì Matlab trả về một danh sách tất cả
các biến
>>

findsym(g)
ans =
a, b, t
14 Trònh Anh Ngọc
Quy tắc: Biến ký hiệu mặc nhiên trong một biểu thức ký hiệu là chữ cái gần x nhất.
Nếu có hai chữ cái gần x như nhau, chữ cái đứng sau trong bảng chữ cái được chọn.
4.5 Các thí dụ tính toán ký hiệu
Bây giờ chúng ta bắt đầu học cách dùng Matlab, cụ thể là Symbolic Math Toolbox,
để tính toán ký hiệu thông qua các thí dụ.
Thí dụ 1. Dùng phương pháp khử Gauss giải hệ phương trình đại số tuyến tính
x +2y +4z =31
5x + y +2z =29
3x −y + z =10
Đưa vào ma trận các hệ số nới rộng
>>
clear all >> a=[1 2 4 31; 5 1 2 29; 3 -1 1 10]
a=
12431
51229
3-1110
Dùng dòng 1 khử các số hạng bên dưới a
11
>> a(2,:)=a(2,:)-5*a(1,:)
a=
12431
0 -9 -18 -126
3-1110
>> a(3,:)=a(3,:)-3*a(1,:)
a=
12431

0 -9 -18 -126
0 -7 -11 -83
Dùng dòng 2 khử các số hạng bên dưới a
22
>> a(2,:)=a(2,:)/(-9)
a=
12431
01214
0 -7 -11 -83
>> a(3,:)=a(3,:)+7*a(2,:)
a=
12431
Học MATLAB bằng thí dụ 15
01214
00315
Bạn đọc thực hiện nốt phần còn lại (phép thế ngược).
Thí dụ 2. Giải và biện luận hệ phương trình đại số tuyến tính
x +2y +2z =0
−2x +(m − 2)y +(m − 5)z =2
mx + y +(m +1)z = −2
Dùng quy tắc Cramer
>>
clear all
>> syms m
>> a=[1 2 2; -2 m-2 m-5; m 1 m+1];
>> b=[0; 2; -2];
Tính các đònh thức cơ bản
>>
d1=det(a)
d=

m

2-4*m+3
d=factor(d1)
d=
(m-1)*(m-3)
Thay cột 1 của a bằng b. Để tránh thay đổi ta đưa vào ma trận ad=a
>> ad=a;
>> ad(:,1)=b;
>> d1=det(ad)
d1 =
-4*m+12
Làm tương tự
>>
ad=a;
>> ad(:,2)=b;
>> d2=det(ad)
d2 =
0
>> ad=a;
>> ad(:,3)=b;
>> d3=det(ad)
d3 =
2*m-6
Khi m =1và m =3hệ có nghiệm duy nhất
>>
x=d1/d
x=
(-4*m+12)/(m


2-4*m+3)
>> x=simplify(x)
16 Trònh Anh Ngọc
x=
-4/(m-1)
>> y=d2/d
y=
0
>> z=d3/d
z=
(2*m-6)/(m

2-4*m+3)
>> z=simplify(z)
z=
2/(m-1)
Trường hợp m =1
>>
subs(d1)
ans =
8
hệ vô nghiệm. Trường hợp m =3ta có d1=d2=d3=0trường hợp này phải xét
cụ thể và dùng phương pháp Gauss, dành cho bạn đọc.
Chú thích 1. Lệnh
factor(s) trả về vectơ chứa các thừa số nguyên tố của s. Trong
thí dụ này ta thấy
factor có thể phân tích đa thức thành tích.
Thí dụ 3. Cho dãy
u
n

=
1
n +1
+
1
n +2
+
1
n +3
+ +
1
n + n
.
Chứng minh dãy {u
n
} hội tụ và tìm giới hạn của nó.
Thông thường, để tìm giới hạn của các dãy số mà số hạng tổng quát của dãy là
một tổng, trước hết ta tính tổng để xác đònh u
n
dưới dạng công thức đóng
2
. Trong
Matlab lệnh
symsum cho ta công cụ tính tổng rất tiện lợi
3
.
>>
clear all
>> syms n,i
>> un=symsum(1/(i+n),i,1,n)

un =
Psi(2*n+1)-Psi(n+1)
Đến đây ta gặp một hàm đặc biệt, hàm digamma (bạn có thể dùng help Psi để
biết thêm về hàm này). Tuy nhiên, nếu tiếp tục dùng lệnh
limit ta sẽ được giới
2
Công thức đóng của một biểu thức là công thức mà số phép tính cần thực hiện là xác
đònh. Ở đây công thức của u
n
có số phép tính tăng theo chỉ số n (không xác đònh).
3
Từ đây, ngoài một vài trường hợp, cú pháp của các lệnh Matlab sẽ không được phát biểu
tường minh, bạn nên học (đoán) cú pháp của nó thông qua thí dụ hiện hành, và chỉ nên
dùng đến help khi thấy thật cần thiết.
Học MATLAB bằng thí dụ 17
hạn của dãy
>>
limit(un,n,inf)
ans =
log(2)
Kết quả trả về cùng biểu thức xác đònh u
n
gợi ý cho ta, u
n
là tổng tích phân của
hàm f(x)=1/(1 + x) trên đoạn [0, 1] với phân hoạch đều ∆x
i
=1/n và các điểm
ξ
i

là điểm cuối của các đoạn con. Ta có
u
n
=
1
1+1/n
1
n
+
1
1+2/n
1
n
+
1
1+3/n
1
n
+ +
1
1+1
1
n
suy ra
lim
n→∞
u
n
=


1
0
dx
1+x
= ln(1 + x)|
1
0
= ln(2).
Chú thích 2. Ở đây ta gặp lệnh
limit - lấy giới hạn một biểu thức. Lệnh này xuất
hiện dưới nhiều dạng thức:
limit(F,x,a) lấy giới hạn của biểu thức ký hiệu F khi x → a.
limit(F,a) dùng findsym(F) như là biến độc lập.
limit(F) dùng a=0như là điểm giới hạn.
limit(F,x,a,’right’) hay limit(F,x,a,’left’) lấy giới hạn một phía.
Thí dụ:
>>
syms x a t h
Khi đó:
limit(sin(x)/x) trả về 1
limit((x-2)/(x

2-4),2) trả về 1/4
limit((1+2*t/x)

(3*x),x,inf) trả về exp(6*t)
limit(1/x,x,0,’right’)
trả về inf
limit(1/x,x,0,’left’) trả về -inf
limit((sin(x+h)-sin(x))/h,h,0)

trả về cos(x)
v = [(1 + a/x)

x, exp(-x)];
limit(v,x,inf,’left’)
trả về [exp(a), 0]
Thí dụ 4. Khảo sát sự hội tụ của dãy {x
n
} xác đònh bởi công thức truy hồi
x
1
=

2,x
n
=

2 −x
n−1
(n ≥ 2).
Ý tưởng đầu tiên đến với ta là áp dụng đònh lý hội tụ cho dãy đơn điệu. Tuy
nhiên, dùng Matlab tính 20 số hạng đầu của dãy
18 Trònh Anh Ngọc
>> clear all
>> x(1)=sqrt(2);
>> for i=2:20, x(i)=sqrt(2-x(i-1)); end
>> x
x=
Columns 1 through 15
1.4142 0.7654 1.1111 0.9428 1.0282 0.9858 1.0071 0.9965 1.0018 0.9991

1.0004 0.9998 1.0001 0.9999 1.0000
Columns 16 through 20
1.0000 1.0000 1.0000 1.0000 1.0000 1.4142 0.7654 1.1111 0.9428 1.0282
0.9858 1.0071 0.9965 1.0018
Kết quả trả về cho thấy dãy không đơn điệu. Nhưng "hình như" dãy hội tụ về
1 (dao động quanh giá trò 1). Điều này dẫn ta đến ý tưởng dùng nguyên lý ánh xạ co.
Dễ thấy, với mọi n
0 ≤ x
n


2 < 1.5.
Ký hiệu f (t)=

2 −t, ta có x
n
= f(x
n−1
). Hơn nữa,
x
n
− x
n−1
= f

(x

)(x
n−1
− x

n−2
) x
n−2
<x

<x
n−1
hay x
n−1
<x

<x
n−2
.
Dùng Matlab khảo sát hàm số f

(t) trên đoạn [0, 1.5]
>>
syms t
>> f=sqrt(2-t);
>> df=diff(f)
df =
-1/2/(2-t)

(1/2)
>> ezplot(df,[0 1.5])
Đồ thò (hình 6) cho thấy max
[0,1.5]
|f


(t)| < 1, f là ánh xạ co trên [0, 1.5]. Chứng
minh chi tiết dành cho bạn đọc.
Thí dụ 5. Giải phương trình vi phân (x
2
+1)dy +ydx =0với điều kiện đầu y(1) = 1.
Ta có thể giải ngay phương trình trên bằng cách gọi hàm
dsolve. Mục đích
và cú pháp của hàm này được thể hiện nếu ta gọi
help dsolve từ dấu nhắc Matlab.
>>
y=dsolve(’(1+x

2)*Dy+y’,’y(1)=1’,’x’)
y=
1/exp(-1/4*pi)*exp(-atan(x))
Ở đây ta chỉ dùng Matlab trợ giúp khi tính toán. Đây là phương trình vi phân có
biến phân ly, tách biến ta được:
dy
y
+
dx
x
2
+1
.
>>
clear all
>> syms x y
Học MATLAB bằng thí dụ 19
Hình 6: Đồ thò hàm f


(t), thí dụ 4.
>> tp1=int(1/y,y)
tp1 =
log(y)
>> tp2=int(1/(x

2+1),x)
tp2 =
atan(x)
Nghiệm tổng quát của phương trình là
ln y + arctgx = C.
Để tìm nghiệm riêng ta dùng Matlab trợ giúp việc xác đònh hằng số tích phân C.
>>
syms c
>> pt=subs(tp1+tp2+c,{x,y},{1,1})
pt =
1/4*pi+c
>> c=solve(pt,c)
c=
-1/4*pi
Vậy nghiệm cần tìm là
ln y + arctgx =
π
4
.
Chú thích 3. Trong thí dụ ta gặp hai lệnh mới của Matlab:
int và solve.
INT - tích phân hàm số. Cú pháp:
int(s) là tích phân bất đònh của s đối với biến ký hiệu như được xác đònh

bởi
findsym. Nếu s là hằng thì tích phân được lấy với x.
20 Trònh Anh Ngọc
int(s,v)
là tích phân bất đònh của s lấy đối với v. v là biến ký hiệu vô
hướng.
int(s,a,b) là tích phân xác đònh của s đối với biến ký hiệu của nó từ a
đến b. a, b là các số hay biến ký hiệu vô hướng.
int(s,v,a,b) là tích phân xác đònh của s đối với v từ a đến b.
SOLVE - giải phương trình đại số. Cú pháp:
solve(’eqn 1’,’eqn 2’, ,’eqn N’)
solve(’eqn
1’,’eqn 2’, ,’eqn N’,’var 1,var 2, ,var N’)
solve(’eqn
1’,’eqn 2’, ,’eqn N’,’var 1’,’var 2’, ’var N’)
Các eqn i là các biểu thức ký hiệu hay chuỗi các phương trình chỉ đònh. Các
var j là các biến ký hiệu hay chuỗi chỉ đònh các biến chưa biết. Nếu các var j
không được chỉ đònh thì các ẩn được xác đònh bởi findsym.
Nếu không có nghiệm giải tích được tìm thấy và số phương trình bằng số ẩn
thì nghiệm số được tìm.
Để biết cách xuất kết quả của
solve xem các thí dụ sau.
1)
solve(’p*sin(x) = r’) chọn 'x' như là ẩn, trả về ans = asin(r/p).
Chú ý, thay vì viết
’p*sin(x) = r’ ta có thể viết ’p*sin(x) - r’; Matlab mặc
nhiên hiểu vế hai là 0.
2)
[x,y] = solve(’x


2 + x*y + y = 3’,’x

2-4*x+3=0’)trả về
x=
[ 1]
[
3]
y=
[ 1]
[
-3/2]
3)
s = solve(’x

2*y

2 - 2*x - 1 = 0’,’x

2-y

2-1=0’)trả về
nghiệm dạng cấu trúc
s=
x: [8x1 sym]
y: [8x1 sym]
4) [u,v] = solve(’a*u

2+v

2 = 0’,’u - v = 1’) xem a như là tham

số và giải hai phương trình tìm
u,v. So sánh với thí dụ bên dưới 5).
5)
s = solve(’a*u

2+v

2’,’u - v = 1’,’a,u’) xem v như là tham
số, giải hai phương trình, và trả về
s.a, s.u.
Thí dụ 6. Giải phương trình vi phân xy

− y = x
2
cos x.
Phương trình có thể viết lại dưới dạng chuẩn,
y


y
x
= x cos x.
Học MATLAB bằng thí dụ 21
Đây là phương trình vi phân tuyến tính cấp một. Nghiệm tổng quát:
y

+ p(x)y = q(x).
Nhắc lại, nghiệm tổng quát của phương trình vi phân tuyến tính cấp một có dạng:
y = y
p

+ Cy
1
với Cy
1
là nghiệm tổng quát của phương trình thuần nhất tương ứng (y
1
là nghiệm
cơ sở); y
p
là một nghiệm riêng của phương trình xác đònh bởi:
y
p
=

G
1
(x, s)q(s)ds
trong đó
G
1
(x, s)=
y
1
(x)
y
1
(s)
là hàm Green cấp một, và s được thay bằng x sau khi lấy tích phân.
Bây giờ ta giải phương trình. Phương trình thuần nhất tương ứng (phương trình
có biến phân ly)

y


y
x
=0 hay
dy
y
=
dx
x
.
Dùng Matlab trợ giúp lấy tích phân
>>
clear all
>> syms x
>> int(1/x,x)
ans =
log(x)
Vì ln y =lnx nên nghiệm cơ sở: y
1
= x.
Hàm Green cấp một: G
1
(x, s)=x/s. Dùng Matlab trợ giúp tìm nghiệm riêng
>>
y1=x;
>> syms s
>> yp=subs(int(y1/subs(y1,x,s)*s*cos(s),s),s,x)
yp =

x*sin(x)
Vậy nghiệm tổng quát của phương trình: y =(C + sin x)x.
Thí dụ 7. Cho phương trình vi phân tuyến tính cấp hai thuần nhất
y

+ a(x)y

+ b(x)y =0.
22 Trònh Anh Ngọc
Giả sử phương trình có nghiệm cơ sở y
1
, tìm nghiệm cơ sở còn lại.
Nghiệm cơ sở thứ hai được tìm dưới dạng:
y
2
(x)=u(x)y
1
(x).
Dùng Matlab để xác đònh u(x)
>>
syms x
Đưa vào các hàm trừu tượng
>>
a=sym(’a(x)’);
>> b=sym(’b(x)’);
>> y1=sym(’y1(x)’);
>> u=sym(’u(x)’);
>> y2=u*y1;
Thay y2 vào phương trình vi phân
>>

p=simple(diff(y,2)+a*diff(y)+b*y)
p=
diff(u(x),‘
$‘(x,2))*y1(x)+2*diff(u(x),x)*diff(y1(x),x)+
u(x)* diff(y1(x),‘
$‘(x,2))+a(x)*(diff(u(x),x)*y1(x)+
u(x)*diff(y1(x),x))+b(x)*u(x)*y1(x)
Nhóm các số hạng có chứa u
>>
p=collect(p,u)
p=
(diff(y1(x),‘
$‘(x,2))+diff(y1(x),x)*a(x)+b(x)*y1(x))*
u(x)+diff(u(x),‘
$‘(x,2))*y1(x)+2*diff(u(x),x)*
diff(y1(x),x)+a(x)*diff(u(x),x)*y1(x)
Để thấy rõ kết quả nhóm ta dùng lệnh pretty
>> pretty(pp)

d
2
dx
2
y1(x)

+ a(x)

d
dx
y1(x)


+ b(x)y1(x)

u(x)+

d
2
dx
2
u(x)

y1(x)
+2

d
dx
u(x)

d
dx
y1(x)

+ a(x)

d
dx
u(x)

y1(x)
Hệ số của u bằng không do y1 là nghiệm cơ sở. Matlab không phát hiện được điều

này. Ta phải giúp!
>>
p=subs(p,diff(y1,2)+diff(y1)*a+b*y1,0);
>> pretty(p)

d
2
dx
2
u(x)

y1(x)+2

d
dx
u(x)

d
dx
y1(x)

+ a(x)

d
dx
u(x)

y1(x)
Học MATLAB bằng thí dụ 23
Để hạ bậc đặt v = u


hay u =

vdx. Trước hết đưa vào hàm trừu tượng v
>>
v=sym(’v(x)’);
>> p=subs(p,u,int(v));
>> pretty(p)

d
dx
v(x)

y1(x)+2v(x)

d
dx
y1(x)

+ a(x)v (x)y1(x)
Phương trình nhận được là phương trình vi phân cấp một có biến phân ly. Tách
biến. Ta thực hiện liên tiếp hai lần lệnh
collect; xem chú thích bên dưới về lệnh
collect và giải thích lý do phải thực hiện hai lần.
>>
p=collect(collect(p/v/y1,v),y1)
p=
diff(v(x),x)/v(x)+2*diff(y1(x),x)/y1(x)+a(x)
Lấy tích phân. Ta cần tính tích phân từng số hạng của p. Để chỉ đònh số hạng
trong một biểu thức ta gọi lệnh

op của Maple. Cú pháp của lệnh này trong Maple

op(i,s) - lấy số hạng thứ i trong biểu thức s. Để gọi một lệnh của Maple. Nếu
trong Maple lệnh đó được viết là
function(arg1, arg2, )
thì trong Matlab để thực hiện lệnh đó ta viết
maple(’function’,arg1,arg2, ,) .
>>
p=int(maple(’op’,1,pp))+int(maple(’op’,2,pp))+ int(maple(’op’,3,pp))
Warning: Explicit integral could not be found.
In D:
\MATLABR11\toolbox\symbolic\@sym\ int.m at line 58
p=
log(v(x))+2*log(y1(x))+int(a(x),x)
Xác đònh v ta làm như sau
>>
p1=subs(p,v,’m’);
>> v=solve(p1,’m’)
v=
1/exp(int(a(x),x))/y1(x)

2
Tại sao ta không giải trực tiếp ra v?Vìm chưa được khai báo biến sym nên ta phải
đặt nó giữa hai dấu nháy, chỉ đònh chuỗi
.
>> u=int(v)
Warning: Explicit integral could not be found.
In D:
\MATLABR11\toolbox\symbolic\@sym\ int.m at line 58
u=

int(1/exp(int(a(x),x))/y1(x)

2,x)
Tóm lại,
y
2
= y
1

dx
y
2
1
exp(

adx)
. (1)

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

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