Bai6_Buoi5,6

Màu nền
Font chữ
Font size
Chiều cao dòng

BÀI 6. TOÁN KÝ TƯỢNG

6.1. Giới thiệu:

Từ trước tới nay, chúng ta mới làm việc với Matlab thông qua việc xử lý bằng số, giả sử khi ta muốn tính giá trị của một hàm tại một điểm nào đấy thì trước hết ta phải cho (khai báo) giá trị của biến (đối số). Ví dụ: để tính y = sin(x) tại điểm x = 1 thì ta phải có:

>> x = 1;

>> y = sin(x);

Một trong những thế mạnh của Matlab là xử lý các hàm mà không cần gán giá trị của các biến. Thế mạnh này dựa vào một công cụ rất mạnh, đó là công cụ toán ký tượng. Chẳng hạn ta có thể tính đạo hàm của một hàm số mà không cấn phải cho giá trị của biến. Điều đó được thể hiện qua ví dụ sau:

Ví dụ 1: Tính đạo hàm của hàm số: y = x2 + 3x - 5 (mà không cho giá trị cụ thể của x). Trong Matlab, việc này được thực hiện như sau:

>> y='x^2+3*x-5'

y =

x^2+3*x-5

>> y1=diff(y)

y1 =

2*x+3

Ví dụ 2: Tính đạo hàm của hàm số: y = sinx (mà không cho giá trị cụ thể của x).

>> y='sin(x)'

y =

sin(x)

>> y1=diff(y)

y1 =

cos(x)

Vậy thì các bước để thao tác với biểu thức ký tượng như thế nào, sau đây chúng ta sẽ nghiên cứu lần lượt các bước đó.

6.2. Cách khai báo biểu thức ký tượng:

Việc khai báo biểu thức ký tượng có thể theo nhiều cách khác nhau. Sau đây ta sẽ lầm lượt xem xét từng cách khác nhau:

a. Khai báo các biến ký tượng trước, sau đó định nghĩa các hàm:

* Cú pháp: syms t

Ở đây t là tên biến ký tượng. Biến ký tượng phải tuân theo các quy tắc đặt tên biến đã giới thiệu ở bài trước (bài 1).

* Ý nghĩa: Cho biết t là biến ký tượng.

Ví dụ:

>> syms t

>> y=3*t^2+2

y =

3*t^2+2

>> y1=diff(y)

y1 =

6*t

b. Khai báo trực tiếp biểu thức ký tượng:

* Cú pháp: Pheptoan('f(x)')

Ở đây, f(x) là hàm biểu thức ký tượng ta cần định nghĩa, Pheptoan là các phép toán cần tác động vào biểu thức ký tượng 'f(x)'.

* Ý nghĩa: Cho biết hàm cần đinh nghĩa là biểu thức ký tượng.

Ví dụ:

>> y='sin(x)'

y =

sin(x)

>> y1=diff(y)

y1 =

cos(x)

Hoặc

>> y1=diff('sin(x)')

y1 = cos(x)

Đối với các ma trận, ta cũng có các cách khai báo tương tự.

>> syms a b c d %(khai báo trước các biến)

>> M=[a b ; c d]

M =

[ a, b]

[ c, d]

>> t = determ(M)

t =

a*d-b*c

Hoặc

>> M='[a b; c d]' %(khai báo trực tiếp)

M =

[a b; c d]

>> n=determ(M)

n =

a*d-b*c

Trong hai cách trên, để thuận tiện, người ta thường dùng cách khai báo biến, sau đó mới khai báo biểu thức ký tượng. Sau này ta sẽ nghiên cứu các phép toán tác động lên biểu thức ký tượng.

6.3. Hằng ký tượng:

Trong một biểu thức, có thể có thành phần hằng số. Vậy, hằng số trong toán ký tượng được biểu diễn như thế nào?

Giả sử ta có biểu thức ký tượng là y = '4'. Khi đó phải hiểu y biểu diễn hằng ký tượng 4 chứ không phải giá trị của nó là số 4. Matlab lưu các chuỗi ký tự theo cách biểu diễn ký tự của bảng ASCII (Hệ thống tiêu chuẩn để biểu thị các ký tự bằng con số - số hoá các ký tự nhằm đạt được sự đồng nhất của các thiết bị máy tính khác nhau). Do đó nếu dùng các phép toán số học với biến ký tượng thì nó sẽ dùng giá trị số hoá ASCII của ký tự để tính toán.

Ví dụ: Ký tự '4' có biểu diến số của ASCII là 52 nên nếu ta lấy '4' + 1 thì kết quả sẽ là 53 hoặc 'a' + 1 = 98,...

6.4. Biến độc lập:

Khi thực hiện các phép toán, rõ ràng phải có ít nhất một biến độc lập. Để hiểu rõ vấn đề này, ta nghiên cứu ví dụ sau:

Ví dụ: Cho hàm số: f = 3x2 + y3 - z4 . Bây giờ ta sẽ lấy đạo hàm của hàm f. Vậy thì đạo hàm của hàm số này sẽ được lấy theo biến nào? Để giải quyết vấn đề này, Matlab cung cấp quy tắc sau:

- Nếu chỉ có một biến duy nhất thì biến đó chính là biến độc lập.

- Nếu trong biểu thức ký tượng không có biến nào thì biến mặc định là x.

- Nếu trong biểu thức ký tượng có nhiều biến thì Matlab sẽ chọn biến gần x nhất theo alphabet.

- Nếu trong biểu thức ký tượng có hai biến gần x như nhau (ví dụ w và y) thì biến độc lập sẽ là ký tự đứng sau x được ưu tiên.

Ví dụ: y = 'a^2 + 5' thì biến độc lập là a. Do đó khi ta lấy đạo hàm thì sẽ được kết quả là y1 = diff(y) = 2*a.

y = '6' thì biến độc lập là x. Do đó y1 = diff(y) = 0.

y = a + b + c^2 thì c là biến độc lập. Do đó y1 = diff(y) = 2*c.

y = 'w-y' thì biến độc lập là y. Do đó y1 = diff(y) = -1.

y = 'v - 2*z' thì biến độc lập là z. Do đó y1 = diff(y) = -2.

Vậy thì có một câu hỏi tự nhiên là: Khi ta muốn thao tác với một biến bất kỳ nào đó (không theo các quy ước trên), ta phải làm gì? Nghiên cứu ví dụ sau

Ví dụ: syms a b c d

y = a^2 - b^2 +c - d.

Bây giờ ta sẽ lấy đạo hàm của hàm số này. Như ta biết, nếu theo mặc định thì đạo hàm của hàm số sẽ được lấy theo biến gần x nhất, tức là biến d. Tuy nhiên, nếu ta muốn lấy đạo hàm theo a thì ta dùng cú pháp sau: y1 = diff(y,a). Khi đó kết quả sẽ là: y1 = 2*a. Muốn lấy đạo hàm theo b thì ta có; y1 = diff(y,b). Kết quả là: y1 = -2*b,...Tóm lại muốn biến nào là độc lập thì ta có cú pháp chung Ham(Bieuthuc,biendoclap)

6.5. Các phép toán đối với biểu thức ký tượng:

Mục đích cuối cùng của việc sử dụng công cụ ký tượng là thao tác các phép toán trên các biểu thức ký tượng để được kết quả mong muốn. Sau đây là một số phép toán đó.

a. Rút tử và mẫu số của một biểu thức

* Cú pháp: [tuso, mauso] = numden(f).

Ví dụ: f = x^2/3 thì tuso = x^2; mauso = 3.

f = x^2 thì tuso = x^2; mauso = 1.

f = (x^2 + 3)/(2*x-1) + 3*x/(x-1) thì tuso = x^3 + 5*x^2 - 3;

mauso = (2*x - 1)*(x - 1). (Tức là biểu thức được quy đồng mẫu số trước khi thực hiện phép toán tìm tử số và mẫu số)

Đối với ma trận thì kết quả sẽ cho hai ma trận tương ứng là tử và mẫu của các biểu thức thành phần.

b. Chuyển đổi đa thức thành véc tơ dòng và ngược lại

¬ - SYM2POLY Chuyển đa thức ký tượng thành véc tơ hệ số

+ Cú pháp: SYM2POLY(P) sẽ trả về một véc tơ dòng bao gồm các phần tử là các hệ số của biểu thức ký tượng P.

Ví dụ: sym2poly(x^3 - 2*x - 5) trả về [1 0 -2 -5].

- POLY2SYM Chuyển véc tơ hệ số thành đa thức ký tượng.

POLY2SYM(C) chuyển véc tơ C thành đa thức ký tượng có biến mặc định x.

POLY2SYM(C,'V') tương tự như trên nhưng biến ký tượng lúc này là V

Ví dụ: poly2sym([1 0 -2 -5]) trả về x^3-2*x-5

poly2sym([1 0 -2 -5],'t') trả về t^3-2*t-5

c. Các phép toán thông thường

Giả sử cho hai đa thức (hàm số): y1 = 2x2 + 3x - 5; y2 = x2 - x + 7.

- Phép cộng:

+ y = symadd(y1,y2), hoặc y = y1 + y2

+ Kết quả: y = 3*x^2 + 2*x +2

- Phép trừ:

+ y = symsub(y1,y2), hoặc y = y1 - y2

+ Kết quả y = x^2 +4*x -12

- Phép nhân:

+ y = symmul(y1,y2), hoặc y = y1*y2

+ Kết quả y = (2*x^2+3*x-5)*(x^2-x+7)

- Phép chia:

+ y = symdiv(y1,y2), hoặc y = y1/y2

+ Kết quả y = (2*x^2+3*x-5)/(x^2-x+7)

- Phép luỹ thừa:

+ y = sympow(y1, '3'), hoặc y = y1^'3'

+ Kết quả y = (2*x^2+3*x-5)^3

- Phép toán tổng hợp (tổng quát):

+ y = symop(y1,'/',y2,'+','6'), hoặc y = 2*y2(y1 + y2 )

+ Kết quả y = (2*x^2+3*x-5)/(x^2-x+7)+6

- Hàm hợp:

+ Cú pháp: compose(f,g) - Tạo hàm hợp f(g(y)) trong đó f = f(x) và g = g(y). x là biến ký tượng của hàm f, y là biến ký tượng của g.

Ví dụ: f=sin(x); g=3*y; F=compose(f,g); F = sin(3*y)

+ Cú pháp: compose(f,g,z) - Tạo hàm hợp f(g(z)), tức biến mới lúc này là z

- Hàm ngược: Hàm ngược của hàm f(x) là hàm g(x) thoả điều kiện g(f(x)) = x. Ví dụ: hàm ngược của ex là ln(x) vì ln(ex) = x; hàm ngược của sin(x) là arcsin(x) vì arcsin(sin(x)) = x,...Matlab cung cấp hàm finverse nhằm thực hiện phép toán trên.

+ Cú pháp: finverse(f). Với f là hàm f(x).

Ví dụ: >> f = tan(x); >> f1 = finverse(f) → f1 = atan(x); >> f=1/tan(x);>> f1 = finverse(f) → f1 = atan(1/x)

d. Tính giá trị của biểu thức ký tượng:

* Thông thường, sau khi thực hiện các phép toán, ta phải tính giá trị của biểu thức ký tượng tại một số điểm của đối số.

Giả sử ta có y = x2 là một hàm ký tượng, a là một giá trị của x. Khi đó muốn tính giá trị của hàm y tại x = a ta dùng cú pháp sau:

Cú pháp: Y = subs(y,a)

Ví dụ:

>> syms x

>> y=x^2;

>> x0 = 3;

>> y0 = subs(y,x0)

y0 = 9

Nếu a là một mảng thì kết quả của Y cũng là một mảng.

>> X0 = [0:1:5];

>> Y0 = subs(y,X0)

Y0 =

Columns 1 through 5

0 1.00 4.00 9.00 16.00

Column 6

25.00

Lệnh này cũng có thể được dùng để thay một biến ký tượng cũ bằng một biến ký tượng mới. Muốn vậy, ta dùng cú pháp sau

subs(f, old, new) - trong đó f là hàm ký tượng, old là biến ký tượng cũ, new là biến ký tượng mới.

Ví dụ: y=x^2; subs(y,x,t) trả về t^2

Nếu new là một ma trận thì kết quả cũng sẽ cho ta một ma trận, xem xét ví dụ sau:

y=x^2 + 3*x -1;

subs(y,x,[t,u]) → ans = [ t^2+3*t-1, u^2+3*u-1]

subs(y,x,[t;u]) → [ t^2+3*t-1]

[ u^2+3*u-1]

* Nhìn lại ví dụ tính giá trị của biểu thức ở trên, rõ ràng kết qủa là bằng 9. Tuy nhiên về mặt nguyên tắc, các giá trị của hàm số vừa tính được không phải là kết quả ở dạng số (mặc dù nó trông giống như số), mà đó chỉ là các giá trị ở dạng hằng ký tượng. Chỉ trong một số ít trường hợp thì Matlab mới tự động trả về dạng kết quả số. Còn lại nhìn chung, các kết quả này là ký tượng.

Để biết các kết quả vừa tìm được là dạng số hay dạng ký tượng, ta dùng hàm class.

+ Cú pháp: class(y) - với y là giá trị của biến. Nếu y là số thì cho kết quả là doule còn nếu y là ký tượng thì cho kết qua là sym

Sau khi có kết quả của phép toán ký tượng ta thường phải biến đổi kết quả ký tượng đó thành số để thuận tiện cho những bước tính toán tiếp theo (dĩ nhiên là giá trị của biến đó vẫn như giá trị mà ký tượng hiển thị). Để thoả mãn yêu cầu này, Matlab cung cấp hàm numeric.

Cú pháp: Y1 = numeric(Y)

Trong đó: Y là giá trị ký tượng của biến ký tượng

Y1 là giá trị số của biến ký tượng

Rõ ràng là về mặt hiển thị thì giá trị của Y và Y1 là như nhau.

Ví dụ: y = x2; h = subs(y,x,'2') → h = 4; class(h) = sym; h = numeric(h) → h = 4 thì lúc này class(h) = double

6.6. Vẽ đồ thị cho biểu thức ký tượng:

Vì sau khi có biểu thức ký tượng, ta vẫn chưa thể có các bộ số liệu về đối số và hàm số, do đó ta không thể vẽ đồ thị của biểu thức ký tượng bằng lệnh plot thông thường. Để khắc phục nhược điểm này, Matlab cung cấp lệnh EZPLOT.

* Cú pháp: ezplot(y) sẽ vẽ đồ thị của hàm ký tượng y từ - 2π đến 2π.

ezplot(y, [xmin xmax ymin ymax]) sẽ vẽ đồ thị của hàm ký tượng y trên đoạn xmin đến xmax, ymin đến ymax.

6.7. Giải phương trình đại số:

Hàm solve có nhiều kiểu cú pháp khác nhau, ta lần lượt nghiên cứu các kiểu cú pháp đó thông qua các ví dụ sau

Ví dụ:

- solve(bieuthucKT) hoặc solve('bieuthucKT') cho kết quả là nghiệm của phương trình bieuthucKT = 0

+ syms x; solve(x^2-3*x+2) cho kết quả ans =[ 1]

[ 2]

+ syms x; solve('x^2-3*x+2') cũng cho kết quả ans =[ 1]

[ 2]

- Nhằm mục đích giải phương trình bieutucKT1 = bieuthucKT2 thì ta nhất định phải dùng dấu '', tức là dùng cú pháp solve('bieutucKT1 = bieuthucKT2') vì khi có dấu bằng thì Matlab hiểu đó là một xâu ký tự.

+ solve('p*sin(x) = r') chọn x là biến số và giải ra giá trị của x: ans = asin(r/p)

- [x,y] = solve('x^2 + x*y + y = 3','x^2 - 4*x + 3 = 0') giải hệ phương trình có ẩn x và y

x =

[ 1]

[ 3]

y =

[ 1]

[ -3/2]

- [u,v] = solve('a*u^2 + v^2 = 0','u - v = 1') coi a là tham số và giải phương trình theo các biến u và v

- [a,u,v] = solve('a*u^2 + v^2','u - v = 1','a^2 - 5*a + 6') giải hệ 3 phương trình với 3 ẩn là a, u, v

- [x,y] = solve('sin(x+y)-exp(x)*y = 0','x^2-y = 2') không tìm được kết quả giải tích, do vậy nó trả về kết quả số.

6.8. Vi phân, tích phân:

a. Vi phân;

* diff(y) vi phân theo biến độc lập theo quy tắc về biến độc lập đã nêu.

* diff(y,a) vi phân theo biến a.

* diff(y,2) vi phân 2 lần theo biến độc lập theo quy tắc đã nêu.

* diff(y,a,2) vi phân 2 lần theo biến a.

b. Tích phân:

Chú ý rằng, đối với tích phân thì có thể tồn tại hoặc không tồn tại. Ngoài ra, đôi khi tích phân vẫn tồn tại nhưng phần mềm không tìm được hoặc tìm được nhưng không đủ bộ nhớ và thời gian để chạy. Trong trường hợp đó, Matlab sẽ đưa ra cảnh báo và cho một kết quả tượng trưng. Nói chung với những kết quả tượng trưng này thì không nên dùng.

* int(y) tích phân theo biến độc lập theo quy tắc về biến đôc lập đã nêu

* int(y,s) tích phân theo biến độc lập s

* int(y,s,a,b) tích phân theo s từ a đến b.

Bài tập:

Một vật được ném thẳng đứng từ độ cao y0 = 50 m với vận tốc v0 = 30 m/s. Gia tốc trọng trường lấy g = 9,8 m/s2. Hỏi khi nào thì vật đó đạt độ cao cực đại và độ cao đó bằng bao nhiêu? khi nào vật đó chạm đất?

6.9. Một số hàm chuyển đổi các dạng hiển thị của biểu thức ký tượng

a. Hàm pretty - hiển thị biểu thức theo kiểu toán học

+ Cú pháp: pretty(f)

+ Ví dụ: >>syms x

>> f = (x^2+1)/(x-2)+(x)/((x+1)*(x+2))-1/(1-x)+3*x/(x^3-1);

>> pretty(f)

2

x + 1 x 1 x

------ + --------------- - ----- + 3 ------

x - 2 (x + 1) (x + 2) 1 - x 3

x - 1

b. Hàm collect - Gom các số hạng giống nhau

+ Cú pháp: collect(f)

+ Ví dụ: f=(x^2-1)*(x-2)*(x-3);

>> collect(f) → ans = x^4-5*x^3+5*x^2+5*x-6

c. Hàm horner - Nhóm đa thức

+ Cú pháp: horner(f)

+ Ví dụ: f = x^4-5*x^3+5*x^2+5*x-6

>> horner(f) → ans = -6+(5+(5+(-5+x)*x)*x)*x

d. Hàm factor - Biểu diễn dưới dạng thừa số

+ Cú pháp: factor(f)

+ Ví dụ: f = x^4-5*x^3+5*x^2+5*x-6

>> factor(f) → ans = (x-1)*(x-2)*(x-3)*(x+1)

e. Hàm expand - Khai triển biểu thức

+ Cú pháp: expand(f)

+ Ví dụ: >> f=(x^2-1)*(x-2)*(x-3);

>> expand(f) → ans = x^4-5*x^3+5*x^2+5*x-6

f. Hàm simplify - Rút gọn (đơn giản) biểu thức

+ Cú pháp: simplify(f)

+ Ví dụ: f=(x^2-1)*(x-2)*(x-3)+3*x;

>> f=simplify(f) → f = x^4-5*x^3+5*x^2+8*x-6

6.10. Giải phương trình vi phân:

+ Cú pháp: dsolve('pt1', 'pt2', 'pt3',...)

Trong đó, pt1, pt2, pt3,...là các phương trình vi phân. Biến mặc định của hàm số là t. Khi muốn thay đổi biến mặc định thì ta thêm tên biến vào thành phần cuối cùng của hàm solve: dsolve('pt1','pt2',...,'s'). Các điều kiện bao đầu cũng cần phải được đưa vào hàm: dsolve('pt1','pt2',..,'đk1','đk2',...,'s')

Khi sử dụng hàm dsolve để giải phương trình vi phân, bao giờ ta cũng phải khai báo pt1, pt2,..trong dấu '' - tức là coi các phương trình như xâu ký tự.

Ví dụ:

* dsolve('Dx = -a*x') cho

ans = exp(-a*t)*C1

* x = dsolve('Dx = -a*x','x(0) = 1','s') cho

x = exp(-a*s)

* y = dsolve('(Dy)^2 + y^2 = 1','y(0) = 0') cho

y = [ sin(t)]

[ -sin(t)]

* S = dsolve('Df = f + g','Dg = -f + g','f(0) = 1','g(0) = 2') cho

S.f = exp(t)*cos(t)+2*exp(t)*sin(t)

S.g = -exp(t)*sin(t)+2*exp(t)*cos(t)

* Y = dsolve('Dy = y^2*(1-y)')

Cảnh báo: Không tìm được lời giải tường minh, cho một lời giải không tường minh

Y = t+1/y-log(y)+log(-1+y)+C1=0

* dsolve('Df = f + sin(t)', 'f(pi/2) = 0')

ans = -1/2*cos(t)-1/2*sin(t)+1/2*exp(t)/(cosh(1/2*pi)+sinh(1/2*pi))

* dsolve('D2y = -a^2*y', 'y(0) = 1, Dy(pi/a) = 0')

ans = cos(a*t)

* w = dsolve('D3w = -w','w(0)=1, Dw(0)=0, D2w(0)=0')

w = 1/3*exp(-t)+2/3*exp(1/2*t)*cos(1/2*t*3^(1/2))

Chú ý: Không phải lúc nào cũng có thể giải được hệ phương trình vi phân. Do đó nếu Matlab không tìm ra kết qua thì phải tìm cách giải theo phương pháp khác

6.11. Biến đổi laplace và biến đổi Fourier

a. Biến đổi Laplace và laplace ngược

* Biến đổi Laplace: Laplace

Định nghĩa biến đổi Laplace: L(s) = int(F(t)*exp(-s*t),0,inf)

- L = LAPLACE(F): Biến đổi Laplace hàm F biến mặc định t thành hàm L biến mặc định s

- Nếu hàm F có biến s thì hàm L lại có biến mặc định là t

- L = LAPLACE(F,t) cho hàm L(t) - biến t thay cho biến s mặc định

- L = LAPLACE(F,w,z) lấy tích phân theo biến w (thay cho biến t) và trả hàm L về với biến z

Ví dụ:

syms a s t w x

laplace(t^5) cho 120/s^6, lấy tích phân theo t

laplace(exp(a*s)) cho 1/(t-a), lấy tích phân theo s

laplace(sin(w*x),t) cho w/(t^2+w^2), lấy tích phân theo biến gần x

laplace(cos(x*w),w,t) cho t/(t^2+x^2) lấy tích phân theo w

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

b. Biến đổi Fourier và Fourier ngược

* Biến đổi Fourier (tương tự Laplace)

* Biến đổi ngược Fourier (tương tự ilaplace)

Bạn đang đọc truyện trên: Truyen2U.Pro

#matlab