Học MatLab bằng thí dụ Tài liệu này được viết với mục đích hướng dẫn các bạn 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ố ví dụ được lấy từ nhiều nguồn khác nhau....
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)] [...]... đò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. ..9 Học MATLAB bằng thí dụ [ 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... un 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 17 Học MATLAB bằng thí dụ 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 un gợi ý cho ta, un là tổng... 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 dx + 2 y x +1 > clear all > > syms x y > 19 Học MATLAB bằng thí dụ 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)... 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 = x2 cos x Phương trình có thể viết lại dưới dạng chuẩn, y − y = x cos x x 21 Học MATLAB bằng thí dụ Đây là phương trình vi phân tuyến tính cấp một Nghiệm tổng quát:... với mỗi giá trò cụ thể của x, F=fun(x) 5 Viết chương trình bằng Matlab Chương trình viết bằng ngôn ngữ Matlab gần giống các ngôn ngữ cấp cao quen thuộc như Pascal, C Dưới đây ta sẽ học cách viết chương trình thông qua các thí dụ cụ thể Nhưng trước hết ta cần biết các cấu trúc thường dùng trong ngôn ngữ Matlab 5.1 Các cấu trúc trong ngôn ngữ Matlab IF - thực hiện các lệnh có điều kiện Dạng chung của... , trong đó ωn = 1 2 4λn c2 − γ 2 Bạn hãy tự tìm kết quả này bằng Matlab Nghiệm tổng quát của phương trình, bằng phép chồng chập nghiệm √ √ e−γt/2 (An cos(ωn t) + Bn sin(ωn t)) 2 sin( λn x) u(x, t) = X n Tn = √ cos2 ( λn ) + 1 n=1 n=1 ∞ ∞ trong đó các hằng số An , Bn được xác đònh nhờ điều kiện đầu của bài toán 31 Học MATLAB bằng thí dụ Bây giờ ta xét cách đưa điều kiện đầu vào nghiệm tổng quát... 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’);... 2 dx dx +2 d u(x) dx d2 u(x) y1(x) dx2 d d y1(x) + a(x) u(x) y1(x) dx dx 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) > d2 d u(x) y1(x) + 2 u(x) 2 dx dx d y1(x) + a(x) dx d u(x) y1(x) dx 23 Học MATLAB bằng thí dụ Để > > > > > > 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)’);... [1/2-1/2*a+1/2*(1-2*a+a∧2-4*b)∧(1/2)] [ 1/2-1/2*a-1/2*(1-2*a+a∧2-4*b)∧(1/2)] Như vậy, nói chung, có hai giá trò m m12 = (1 − a)2 − 4b 2 1−a± Các nghiệm cơ sở: √ 1−a± y1,2 = x (1−a)2 −4b 2 25 Học MATLAB bằng thí dụ Thí dụ 9 Bài toán giá trò riêng Sturm-Liouville chính quy bởi: • Toán tử vi phân L, tác động lên các hàm y(x) xác đònh trên I = [a, b], đònh Ly = d dy p(x) + q(x)y dx dx được gọi là toán tử vi . 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. (double click) vào biểu tượng của Học MATLAB bằng thí dụ 3 nó, hoặc vào menu startAll 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. 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