[r]
Trang 1
§1. KHÁI NIỆM CHUNG
Symbolic Math Toolboxes kết hợp tính toán bằng chữ vào môi trường
MATLAB. Các toolbox này bổ sung các tiện ích số và đồ thị với các kiểu tính toán toán học khác nhau.
Calculus đạo hàm, tích phân, giới hạn, tổng và chuỗi
Taylor Linear Algebra nghịch đảo, định thức,giá trị riêng, phân tích và
dạng chính tắc của ma trận.
Simplification phương pháp rút gọn các biểu thức đại số
Solution of Equations giải bằng chữ và bằng số các phương trình đại số
và vi phân Variable‐Precision
Arithmetic
đánh giá độ chính xác của các biểu thức đại số
Special Mathematical
Function
các hàm toán học đặc biệt của các ứng dụng toán học kinh điển
Động lực tính toán nằm dưới các toolbox là nhân Maple, một hệ thống tính toán được phát triển đầu tiên ở trường đại học Waterloo, Canada và sau
đó tại Eidgenroessiche Technische Hochschule Zurich, Thuỵ sĩ. Maple được thương mại hoá và hỗ trợ của công ty Waterloo Maple.
§2. KHỞI ĐỘNG TOOLBOX
1. Các đối tượng chữ: Trong phần này chúng ta sẽ xem xét cách tạo và dùng
các đối tượng chữ. Chúng ta cũng sẽ xem xét các biến chữ mặc định. Symbolic Math Toolbox định nghĩa một kiểu dữ liệu MATLAB mới gọi là đối tượng chữ
hay sym. Bên trong, một đối tượng chữ là một cấu trúc số liệu mà nó lưu biểu
diễn chuỗi các kí tự. Symbolic Math Toolbox dùng các đối tượng chữ để biểu
diễn các biến chữ, các biểu thức chữ, các ma trận chữ.
2. Tạo các biến và các biểu thức chữ: Lệnh sym cho phép ta xây dựng các biến
và các biểu thức chữ. Ví dụ lệnh:
Trang 2a = sym(ʹalphaʹ)
tạo ra các biến chữ là x và a với x là x và a là alpha.
Giả sử ta muốn ta muốn dùng biến chữ để biểu diễn tỉ lệ vàng
2
5
1 +
=
rho = sym(ʹ(1 + sqrt(5))/2ʹ)
Bây giờ ta có thể thực hiên các phép toán khác nhau với rho. Ví dụ :
f = rho^2 ‐ rho ‐ 1
f =
(1/2+1/2*5^(1/2))^2‐3/2‐1/2*5^(1/2)
Ta rút gọn biểu thức:
simplify(f)
ans =
0
Bây giờ giả sử ta muốn giải phương trình bậc 2 f = ax2 + bx+c. Phát biểu:
f = sym(ʹa*x^2 + b*x + cʹ)
gán biểu thức chữ ax2 + bx + c cho biến f. Tuy nhiên trong trường hợp này
Symbolic Math Toolbox không tạo ra các biến tương ứng với các số hạng a, b,
c và x trong biểu thức. Để thực hiện các phép toán bằng chữ(ví dụ tích phân, đạo hàm, thay thế v.v) trên f ta phải tạo các biến một cách rõ ràng, nghĩa là cần viết:
a = sym(ʹaʹ)
b = sym(ʹbʹ)
c = sym(ʹcʹ)
x = sym(ʹxʹ) hay đơn giản là :
syms a b c x
Nói chung là ta có thể dùng sym hay syms để tạo các biến chữ nhưng nên dùng syms để tiết kiệm thời gian.
2. Biến đổi giữa số và chữ:
a. Tạo các biến thực và phức: Lệnh sym cho phép ta mô tả các thuộc tính toán học của các biến chữ bằng cách dùng tuỳ chọn real. Phát biểu:
x = sym(ʹxʹ,ʹrealʹ);
y = sym(ʹyʹ,ʹrealʹ);
hay hiệu quả hơn:
Trang 3z = x + i*y
tạo ra biến chữ x và y có thuộc tính là số thực. Đặc biệt:
f = x^2 + y^2
thực sự là số không âm. Như vậy z là biến phức và các lệnh:
conj(x) conj(z) expand(z*conj(z))
cho kết quả:
return the complex conjugates of the variables
x
x ‐ i*y x^2 + y^2
Lệnh conj là toán tử tạo số phức liên hợp.
Để xóa thuộc tính real của x ta dùng lệnh:
syms x unreal
hay:
x = sym(ʹxʹ,ʹunrealʹ)
Lệnh clear x không xoá thuộc tính số real của x.
b. Tạo các hàm trừu tượng: Nếu ta muốn tạo một hàm trừ tượng(nghĩa là
một hàm không xác định) f(x) cần dùng lệnh:
f = sym(ʹf(x)ʹ)
Khi này f hoạt động như là f(x) và có thể xử lí bằng các lệnh toolbox. Ví dụ để tính vi phân bậc 1 ta viết:
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
ứng dụng này của hàm sym sẽ rất hữu ích trong biến đổi Fourrier, Laplace và
z.
c. Dùng sym để truy cập các hàm của Maple: Ta có thể truy cập hàm giai thừa k! của Maple khi dùng sym.
kfac = sym(ʹk!ʹ)
Để tính 6! hay k! ta viết (lưu trong ct5_1.m):
Trang 4syms k n subs(kfac,k,6) ans =
720 subs(kfac,k,n) ans =
n!
hay nếu tính 12! ta cũng có thể viết:
prod(1:12)
d. Ví dụ tạo ma trận chữ: Một ma trận vòng là ma trận mà hàng sau có
được bằng cách dịch các phần tử của hàng trước đi 1 lần.Ta tạo một ma trận vòng A bằng các phần tử a, b và c:
syms a b c
A = [a b c; b c a; c a b]
kết quả:
A =
[ a, b, c ] [ b, c, a ] [ c, a, b ]
Do A là ma trận vòng tổng mỗi hàng và cột như nhau:
sum(A(1,:)) ans =
a+b+c sum(A(1,:)) = = sum(A(:,2)) ans =
1
Bây giờ ta thay A(2,3) bằng beta và b bằng alpha:
syms alpha beta
A(2,3) = beta;
A = subs(A,b,alpha)
A =
[ a, alpha, c]
[ alpha, c, beta]
[ c, a, alpha]
Từ ví dụ này ta thấy dùng các đối tượng chữ cũng tượng tự như dùng số trong MATLAB.
Trang 5lập thường rất rõ ràng. Ví dụ xem bảng sau:
g = sin(at+b) g = sin(a*t+b)
Nếu ta tìm đạo hàm của các hàm này nhưng không mô tả biến độc lập (nghĩa là đạo hàm theo biến nào) thì kết quả là:
f’ = nxn‐1
gʹ = acos(at + b)
hʹ =J v (z)(v/z)‐Jv+1(z).
Như vậy các biến độc lập là x, t và z. MATLAB hiểu các biến độc lập là các chữ thường và nằm ở cuối bảng chữ cái như x, y, z. Khi không thấy các chữ cái này, MATLAB sẽ tìm chữ gần nhất và coi đó là biến độc lập. Các biến khác như n, a, b và v được coi là hằng hay thông số. Tuy nhiên ta có thể lấy đạo hàm của f theo n bằng cách viết rõ biến độc lập ra. Ta dùng các lệnh sau để tạo
ra các hàm( lưu trong ct5_2.m):
syms a b n nu t x z
f = x^n;
g = sin(a*t + b);
h = besselj(nu,z);
Để đạo hàm hàm f ta viết:
diff(f);
ans =
x^n*n/x
Trong ví dụ trên x là biến độc lập. Nếu muốn tính đạo hàm của f theo n ta cần viết:
diff(f,n) ans =
x^n*log(x)
4. Tạo các hàm toán học bằng chữ:
a. Dùng các biểu thức chữ: Các lệnh:
syms x y z
Trang 6t = atan(y/x)
f = sin(x*y)/(x*y)
tạo ra các biểu thức chữ r, t và f. Ta có thể dùng các lệnh diff, int, subs hay các
lệnh Symbolic Math Toolbox khác để xử lí các biểu thức như vậy.
b. Tạo các M‐file: M‐file cho phép ta dùng các hàm tổng quát hơn. Ví dụ
ta muốn tạo ra hàm sinc = sin(x)/x ta sẽ viết một M‐file (sinc.m) có nội dung
như sau:
function z = sinc(x)
if isequal(x,sym(0))
z = 1;
else
z = sin(x)/x;
end
Ta có thể mở rộng các ví dụ như vậy cho các hàm và biến khác nhau.
§3. TÍNH TOÁN
1. Đạo hàm: Ta tạo biểu thức chữ:
syms a x
f = sin(a*x) Vậy thì:
df = diff(f)
tính đạo hàm của hàm f(x) theo x. Kết quả là:
df =
cos(a*x)*a
Để tính đạo hàm của f theo a ta viết:
dfa = diff(f,a)
kết quả:
dfa=
cos(a*x)*x
f = xn f’ = nxn‐1
f = x^n diff(f) hay diff(f,x)
g = sin(at+b) g’ = acos(at+b)
g = sin(a*t+b) diff(g) hay diff(g,t)
Trang 7h = Jv(z) h’ = Jv(z)(v/z) ‐
Jv+1(z)
h = besselj(nu,z) diff(h) hay diff(h,z)
Để tính đạo hàm bậc 2 của f theo x và a ta viết:
diff(f,2) ans =
‐ sin(a*x)*a^2 diff(f,x,2)
ans =
‐ sin(a*x)*x^2
Hàm diff có thể dùng đối số là ma trận. Trong trường hợp này đạo hàm được thực hiện trên từng phần tử. Ví dụ:
syms a x
A = [cos(a*x),sin(a*x);‐sin(a*x),cos(a*x)]
kết quả:
A =
[ cos(a*x), sin(a*x)]
[‐sin(a*x), cos(a*x)]
lệnh :
dy = diff(A)
cho kết quả:
dy =
[ ‐sin(a*x)*a, cos(a*x)*a]
[ ‐cos(a*x)*a, ‐sin(a*x)*a]
Ta khảo sát biến đổi từ toạ độ Euclid(x,y,z) sang tạo độ cầu (r, λ, ϕ) thực hiện bằng các công thức:
x = rcosλcosϕ
y = rcosλsinϕ z= rsinλ
Để tính ma trận Jacobi J của phép biến đổi này ta dùng hàm jacobian. Định
nghĩa toán học của J là:
) , , r (
) z , y , x ( J
ϕ λ
∂
∂
Để dễ viết ta dùng kí tự l thay cho λ và f thay cho ϕ. Các lệnh (lưu trong
ct5_5.m):
syms r l f
Trang 8y = r*cos(l)*sin(f);
z = r*sin(l);
J = jacobian([x; y; z], [r l f])
cho ta kết quả:
J =
[ cos(l)*cos(f), –r*sin(l)*cos(f), –r*cos(l)*sin(f) ]
[ cos(l)*sin(f), –r*sin(l)*sin(f), r*cos(l)*cos(f)]
[ sin(l), r*cos(l), 0]
và lệnh :
detJ = simple(det(J))
cho:
detJ =
–cos(l)*r^2
Chú ý là đối số thứ nhất của hàm jacobian phải là vec tơ cột và đối số thứ hai
là vec tơ hàng. Hơn nữa do định thức của ma trận Jacobian là biểu thức lượng
giác khá phức tạp nên ta dùng lệnh simple để thay thế và rút gọn.
Bảng sau tổng hợp hàm diff và hàm jacobian
f = exp(ax + b) syms a b x
f = exp(a*x + b)
dx
df
diff(f,x)
da
df
a d
f d 2
2
r = u2 + v2
t = arctan(v/u)
syms r t u v
r = u^2 + v^2
t = atan(v/u) )
v , u (
) , r ( J
∂
∂
2. Giới hạn: Đạo hàm của một hàm là giới hạn sau đây nếu nó tồn tại :
h
) x ( ) h x ( lim )
x ( f
0 h
− +
=
′
Trang 9Symbolic Math Toolbox cho phép giới hạn của một hàm một cách trực tiếp hơn. Lệnh:
syms h n x
dc = limit( (cos(x+h) – cos(x))/h,h,0 )
cho kết quả:
dc =
–sin(x)
và :
limit( (1 + x/n)^n,n,inf )
cho:
ans = exp(x)
minh hoạ 2 trong số các giới hạn quan trọng của toán học:đạo hàm(trong trường hợp cosx) và hàm mũ. Trong khi nhiều giới hạn :
) x ( lim
a
là “hai phía”(nghĩa là kết quả như nhau cho dù x tiến tới bên phải hay bên trái của a) lại có những hàm giới hạn phải và trái khác nhau. Do đó 3 giới hạn:
x
1 lim , x
1 lim , x
1 lim
0 x 0 x 0
cho 3 kết quả khác nhau: không xác định , ‐∞ và +∞
Trong trường hợp không tồn tại gới hạn Symbolic Math Toolbox trả về kết quả NaN. Ví dụ:
limit(1/x,x,0)
cho:
ans =
NaN
Lệnh:
limit(1/x,x,0,ʹleftʹ)
cho:
ans =
–inf Lệnh:
limit(1/x,x,0,ʹrightʹ)
cho:
ans =
inf
Như vậy limit(f) tương đương với limit(f,x,0). Bảng sau cho các giới hạn:
Trang 10Hàm toán học Lệnh MATLAB
) x ( lim
0
) x ( lim
a
limit(f,a) )
x ( lim
a
) x ( lim
a
3. Tích phân:
a. Các vấn đề chung: Nếu f là một biểu thức chữ thì int(f) tìm một biểu
sau:
1 n
x dx
x
1 n n
+
int(x^n,x)
∫
π
= 2
0
1 dx ) x 2
int(sin(2*x),0,pi/2) hay int(sin(2*x),x,0,pi/2)
g = cos(at+b)
a
1 dt )
(
g = cos(a*t + b) int(g) hay int(g,t)
) z ( J dz ) z
(
int(besselj((1,z),z)
Khi MATLAB không tìm được tích phân nó viết lại lệnh đã nhập vào.
b. Tích phân với hằng số thực: Một trong các vấn đề khi tính tích phân là
giá trị của các thông số. Ta xét hàm Hàm này rõ ràng là có giá trị dương với mọi k và x và có dạng hình chuông. Giá trị của hàm tiến đến 0 khi x→±∞ với mọi số thực k. Ta lấy ví dụ
2
) kx (
e−
2
1
k = và vẽ đồ thị của hàm bằng các lệnh (
lưu trong ct5_6.m):
syms x
k = sym(1/sqrt(2));
f = exp(–(k*x)^2);
ezplot(f)
Trang 11Tuy nhiên nhân Maple không coi k2 và x2 là những số dương mà chỉ là các biến hình thức, không có thuộc tính toán học. Do vậy khi tính bằng các lệnh:
dx
e (kx)2
∫
∞
∞
−
−
syms x k;
f = exp(–(k*x)^2);
int(f,x,–inf,inf)
kết quả sẽ là:
Definite integration: Canʹt determine if the integral is convergent.
Need to know the sign of ‐‐> k^2 Will now try indefinite integration and then take limits.
Warning: Explicit integral could not be found.
ans = int(exp(–k^2*x^2),x= –inf inf)
Trong phần sau chúng ta sẽ xét cách làm cho MATLAB hiểu rằng k là số thực
và do đó coi k2 là số dương.
c. Các biến thực theo sym: Chú ý là Maple không thể xác định được dấu
của k2. Vậy chúng ta giải quyết khó khăn này như thế nào? Câu trả lời là làm
cho k trở thành số thực bằng dùng lệnh sym. Một đặc điểm có ích của sym gọi
là tuỳ chọn real cho phép ta khai báo k là biến thực. Do vậy tích phân trên
hoàn toàn tính được trong toolbox nhờ các lệnh:
syms k real int(f,x,–inf,inf)
kết quả là:
ans = signum(k)/k*pi^(1/2)
Chú ý là k bây giờ là đối tượng chữ trong vùng làm việc của MATLAB và là biến thực trong vùng làm việc của Maple. Khi nhập lệnh:
clear k
ta chỉ xoá được k trong vùng làm việc của MATLAB. Muốn là cho k không còn
là số thực trong vùng làm việc của Maple ta phải dùng lệnh:
syms k unreal.
Ta có bảng sau:
Trang 12
Hàm toán học Lệnh MATLAB kx
e ) x
f = exp(‐k*x)
∫ (x)dx int(f) hay int(f,x)
∫
1
0 dx ) x
int(f,x,0,1)
2
) kx ( e ) x (
g=exp(‐(k*x)^2)
∫
∞
∞
−
dx ) x (
int(g,x,‐inf,inf)
4. Tính tổng: Ta có thể tính tổng biểu thức chữ khi chúng tồn tại bằng cách
dùng lệnh symcum.V í dụ chuỗi :
⋅
⋅ + +
3
1 2
1
cho tổng là π2/6 còn chuỗi :
1 + x2 + x3 +. . .
cho tổng là 1/(1‐x). Các tổng được tính như sau (lưu trong ct5_7.m):
syms x k s1 = symsum(1/k^2,1,inf) s2 = symsum(x^k,k,0,inf) s1 =
1/6*pi^2 s2 =
‐1/(x‐1)
5. Chuỗi Taylor: Cho hàm f(x). Phát biểu:
T = taylor(f,8)
cho kết quả:
T = 1/9+2/81*x^2+5/1458*x^4+49/131220*x^6
là khai triển Taylor của f(x) lân cận x = 0(khai triển MacLaurin) có chứa 8 số hạng khác 0. Phát biểu:
syms x
g = exp(x*sin(x))
Trang 13tạo ra khai triển Taylor của f(x) tại x = 2 và chứa đến 12 số hạng khác 0. Ta vẽ các hàm này lên cùng một đồ thị để thấy được khả năng xấp xỉ của chuỗi
Taylor với hàm thực g (lưu trong ct5_8.m):
xd = 1:0.05:3;
yd = subs(g,x,xd);
ezplot(t, [1,3]);
hold on;
plot(xd, yd, ʹr‐.ʹ) title(ʹXap xi Taylor ʹ);
legend(ʹHamʹ,ʹTaylorʹ)
Tiếp đó ta dùng lệnh:
1 2 3 4 5 6
x
Xap xi Taylor
Ham Taylor
pretty(T)
để in kết quả dưới dạng các biểu thức toán học dễ đọc.
6. Tính toán mở rộng: Ta xét hàm:
x cos 4 5
1 )
x (
+
Các lệnh:
syms x
f = 1/(5+4*cos(x))
lưu biểu thức chữ định nghĩa hàm f(x).
Symbolic Math Toolbox cung cấp một bộ các lệnh dễ dùng để vẽ đồ thị
các biểu chữ, bao gồm các đường cong trong mặt phẳng(ezplot), các đường đẳng mức(ezcontour và ezcontourf), các mặt cong(ezsurf, ezsurfc, ezmesh và ezmeshc), đồ thị trong toạ độ cực(ezpolar) và đường cong dưới dạng thông số
Trang 14ta xem cách dùng hàm ezplot vẽ đồ thị hàm f(x). Đồ thị của hàm như sau:
Phạm vi mặc định khi vẽ đồ thị của hàm là [‐2π ÷ 2π ]. Để chỉ cụ thể phạm vi
vẽ đồ thị ta dùng lệnh:
ezplot(f,[a b])
Lúc này đồ thị của hàm được vẽ trong đoạn [a, b]
Bây giờ ta tìm đạo hàm bậc 2 của f(x):
f2 = diff(f,2) f2 =
32/(5+4*cos(x))^3*sin(x)^2+4/(5+4*cos(x))^2*cos(x)
Ta có thể nhập lệnh:
f2 = diff(f,x,2).
Ta vẽ đồ thị của f2:
ezplot(f2) axis([–2*pi 2*pi –5 2])
Từ đồ thị ta thấy rằng giá trị của f”(x) nằm trong khoảng [‐4 , 1]. Giá trị max và min của f”(x) xuất hiện tại f”’(x)=0. Phát biểu:
f3 = diff(f2);
cho
32/(5+4*cos(x))^3*sin(x)^2+4/(5+4*cos(x))^2*cos(x)
và :
pretty(f3)
cho:
2 3
4
3
)) x cos(
4 5 (
) x sin(
4 )) x cos(
4 5 (
) x cos(
) x sin(
96 ))
x cos(
4 5 (
) x sin(
384
+
− +
+
Ta rút gọn f3 và viết lại dưới dạng dễ đọc:
f3 = simple(f3);
pretty(f3)
Kết quả là:
4
2 2
)) x cos(
4 5 (
) 25 ) x cos(
80 ) x cos(
80 ) x sin(
96 )(
x sin(
4
+
− +
+
Bây giờ ta tìm các giá trị zero cuả f3 bằng lệnh:
z = solve(f3)
kết quả cho ta ma trận:
Trang 15[ 0]
[ atan((–255–60*19^(1/2))^(1/2) , 10+3*19^(1/2))]
[ atan(–(–255–60*19^(1/2))^(1/2), 10+3*19^(1/2))]
[ atan((–255+60*19^(1/2))^(1/2)/(10–3*19^(1/2)))+pi]
[ –atan((–255+60*19^(1/2))^(1/2)/(10–3*19^(1/2)))–pi]
Mỗi hàng là một nghiệm của f”’(x). Lệnh:
format;
zr = double(z)
converts the zeros to double form.
zr =
0
0
0 2.4483 –2.4483
Như vậy ta đã tìm được 5 nghiệm. Tuy nhiên đồ thị của f3 cho thấy ta chưa
ezplot(f3) hold on;
plot(zr,0*zr,ʹroʹ) plot([–2*pi,2*pi], [0,0],ʹg‐.ʹ);
title(ʹZeros of f3ʹ)
Điều này xảy ra do f”’(x) chứa số hạng sinx, bằng 0 tại các giá trị nguyên lần π
được tất cả các nghiệm bằng cách biến đổi zr = [0 zr(4) pi 2*pi ‐zr(4)] bằng cách nhân 2π và có zr = [zr‐2*pi zr zr+2*pi]
Bây giờ ta vẽ zr đã biến đổi lên đồ thị của f3:
plot(zr,0*zr,ʹkxʹ)
biến chữ trong f2:
f20 = subs(f2,x,0)
để tìm giá trị tương ứng của f”(0). Kết quả là:
f20 =
0.0494
Trên đồ thị của f”(x) giá trị này chỉ là cực tiểu địa phương. Ta thể hiểu điều này trên đồ thị bằng các lệnh: