Giáo trình Matlab - Simulink

Tài liệu Giáo trình Matlab - Simulink: Giáo trình MATLAB - SIMULINK tỔng quan vỀ MATLAB Cấu trúc chung và các lĩnh vực ứng dụng của MATLAB: MATLAB (viết tắt từ matrix laboratory) được phát triển từ dự án LINPACK & EISPACK nhằm tạo ra thư viện ma trận phục vụ cho tính toán. Qua quá trình phát triển lâu dài, MATLAB được phát triển thành một công cụ rất mạnh, được ứng dụng khá phổ biến trong các trường đại học ở khắp thế giới, đặc biệt là các nước như Mỹ, Bỉ, Canada, ... như là công cụ không thể thiếu trong các giáo trình từ cơ bản đến nâng cao trong các lĩnh vực: toán học cao cấp, khoa học và kỹ thuật. Trong công nghiệp, MATLAB công cụ lựa chọn cho nghiên cứu nâng cao hiệu quả sản xuất, phân tích đánh giá và ứng dụng. Với MATLAB, bài toán tính toán, phân tích, thiết kế và mô phỏng trở nên dễ dàng hơn trong nhiều lĩnh vực chuyên ngành như: Điện, Điện tử, Cơ khí, Cơ điện tử, Vật lý, ... MATLAB là công cụ tính toán rất mạnh dễ dùng, trực quan dễ mở rộng và phát triển. MATLAB có khả năng liên kết đa môi trường, liên kết dễ ...

doc98 trang | Chia sẻ: hunglv | Lượt xem: 3413 | Lượt tải: 1download
Bạn đang xem trước 20 trang mẫu tài liệu Giáo trình Matlab - Simulink, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Giáo trình MATLAB - SIMULINK tỔng quan vỀ MATLAB Cấu trúc chung và các lĩnh vực ứng dụng của MATLAB: MATLAB (viết tắt từ matrix laboratory) được phát triển từ dự án LINPACK & EISPACK nhằm tạo ra thư viện ma trận phục vụ cho tính toán. Qua quá trình phát triển lâu dài, MATLAB được phát triển thành một công cụ rất mạnh, được ứng dụng khá phổ biến trong các trường đại học ở khắp thế giới, đặc biệt là các nước như Mỹ, Bỉ, Canada, ... như là công cụ không thể thiếu trong các giáo trình từ cơ bản đến nâng cao trong các lĩnh vực: toán học cao cấp, khoa học và kỹ thuật. Trong công nghiệp, MATLAB công cụ lựa chọn cho nghiên cứu nâng cao hiệu quả sản xuất, phân tích đánh giá và ứng dụng. Với MATLAB, bài toán tính toán, phân tích, thiết kế và mô phỏng trở nên dễ dàng hơn trong nhiều lĩnh vực chuyên ngành như: Điện, Điện tử, Cơ khí, Cơ điện tử, Vật lý, ... MATLAB là công cụ tính toán rất mạnh dễ dùng, trực quan dễ mở rộng và phát triển. MATLAB có khả năng liên kết đa môi trường, liên kết dễ dàng với ngôn ngữ lập trình C++, Visual C, FORTRAN, JAVA, ... MATLAB có khả năng xử lý đồ hoạ mạnh trong không gian hai chiều và ba chiều. Các TOOLBOX trong MATLAB rất phong phú, đa năng là công cụ nghiên cứu, thiết kế cực kỳ hiệu quả trong các lĩnh vực chuyên ngành. Công cụ mô phỏng trực quan SIMULINK chạy trong môi trường MATLAB giúp cho bài toán phân tích thiết kế dễ dàng, sinh động hơn. MATLAB có kiến trúc mở, dễ dàng trong việc xây dựng thêm các module tính toán kỹ thuật theo tiêu chuẩn công nghiệp và truyền thông. MATLAB xây dựng sẵn các phép tính xử lý ma trận, các hàm toán học, các phép xử lý đồ hoạ với thư viện phong phú. Từ đó cho phép người dùng viết các chương trình (m-files), xây dựng các hàm chuyên tính toán cho mỗi lĩnh vực (gọi là các TOOLBOXS) như: Điều khiển tự động, Kỹ thuật điện, Điện tử, truyền thông, xử lý ảnh, xử lý tín hiệu số, tối ưu hoá, mô phỏng các quá trình thực tế ... Trên cơ sở các thư viện có sẵn, người dùng lập nên các chương trình ứng dụng riêng theo nhu cầu riêng với cấu trúc chương trình dễ hiểu, rõ ràng và tận dụng sức mạnh các công cụ có sẵn, đặc biệt công cụ xử lý ma trận để viết nên các ứng dụng mà thời gian lập trình tiết kiệm rất nhiều. Ngoài ra MATLAB cho phép viết ngôn ngữ C/C++, FORTRAN trong cửa sổ MATLAB và biên dịch chương trình viết bằng MATLAB sang C/C++, FORTRAN. Từ đó ta có thể biên dịch sang chương trình ứng dụng (*.exe) chạy độc lập (stand-alone application). Đặc biệt, ta có thể viết chương trình C/C++, Fortran, LabView, ... gọi MATLAB chạy ngầm để tính toán sau đó trả kết quả về chương trình. Ngoài ra MATLAB có thể chạy trên các máy tính khác nhau, với các hệ điều hành khác nhau như: MS Windows, X Windows (Unix/Linux) và Macintosh mà vẫn giữ nguyên các chương trình và dữ liệu, không cần một sự biến đổi nào. Giới thiệu SIMULINK và TOOLBOXS trong MATLAB SIMULINK là công cụ mô phỏng trực quan trong môi trường MATLAB, kết hợp với thư viện TOOLBOXS rất phong phú cho các ngành, các lĩnh vực kỹ thuật, giúp cho bài toán phân tích thiết kế dễ dàng, sinh động hơn. Do đó rất thích hợp cho sinh viên nghiên cứu khoa học, làm báo cáo đồ án môn học, đặc biệt đồ án tốt nghiệp, Các kỹ sư làm việc trong các lĩnh vực nghiên cứu, điều khiển các hệ thống kỹ thuật, phân tích hệ thống, ... Các Toolboxs: Control System Toolbox cho lĩnh vực điều khiển - Tự động hoá, Điện tử, Cơ khí. Power System Toolbox cho chuyên ngành Hệ thống điện, Thiết bị điện, Tự động hoá, Cơ khí. Nonlinear control Design blocksets để mô phỏng, phân tích, thiết kế tối ưu hệ thống điều khiển phi tuyến. Signal Processing Toolbox và Image procesing Toolbox dành cho ngành ngành Điện tử viễn thông, Công nghệ thông tin và Cơ điện tử. Communication Toolbox dành cho ngành điện tử viễn thông- TĐH Đo lường Data acquisition Toolbox thu thập dữ liệu, xây dựng hệ thu thập dữ liệu vào/ra với thiết bị bên ngoài. Fuzzy logic và Neural Network Toolbox phân tích thiết kế hệ thống trên cơ sở logic mờ và mạng nơ ron nhân tạo. Aerospace Toolbox và Math Toolbox cho ngành Cơ khí - Cơ điện tử. Các thao tác lẬp trình trên MATLAB Các lệnh cơ bản quản lý MATLAB Quản lý lệnh và các hàm - Cửa sổ MATLAB: bao gồm các phần sau: dòng lệnh(commandline) New (mở cửa sổ soạn thảo mới chương trình) open(mở cửa sổ soạn thảo với chương trình cũ) workspace browser (mở cửa sổ quan sát và sửa chữa các biến trong không gian workspace) path browser (mở cửa sổ quan sát các đường dẫn tìm kiến của MATLAB và có thể xoá hoặc bổ sung đường dẫn tìm kiếm) Simulink (mở cửa sổ soạn thảo chương trình mô phỏng simulink) Hình 2.1 Cửa sổ dòng lệnh MATLAB Từ cửa sổ dòng lệnh, ta có thể gọi lệnh thi hành: »path cho đường dẫn các thư mục trong danh mục tìm kiếm (search path) »addpath Bổ sung các thư mục vào search path của MATLAB »rmpath xoá thư mục khỏi search path của MATLAB »pathtool mở cửa sổ giao diện cho phép xem và sửa đổi đường dẫn tìm kiếm search path giống như editpath (hình 1.2) Hình 2.2 Cửa sổ path Browser soạn đường dẫn tìm kiếm tệp M-file. »ver hiển thị version của MATLAB, Simulink và Toolboxes »help hướng dẫn sử dụng sau help »helpwin danh sách các lệnh và hướng dẫn sử dụng »helpdesk cửa sổ trợ giúp trong môi trường Internet Explorer »demo chạy các chương trình demo cho nhiều lĩnh vực Hình 2.3 Cửa sổ HelpDesk Hình 2.4 Cửa sổ Helpwin Quản lý biến, không gian workspace trên cửa sổ lệnh (Command window) who hiển thị danh sách các biến whos hiển thị danh sách các biến và kích thước của nó workspace hiển thị cửa sổ workspace cho phép xem và chỉnh sửa các giá trị biến clc xoá các dòng text trên màn hình clear xoá tất cả các biến trong workspace Làm việc với Files môi trường làm việc dir thumuc liệt kê các file trong thumuc chỉ ra edit tenfile soạn thảo mới một M-file open tenfile mở file tenfile để sửa chữa save lưu các biến trong workspace lên đĩa Các cú pháp: save fname lưu các biến vào tệp nhị phân "MAT-file" fname.mat. Nếu không có fname thì mặc nhiên là file matlab.mat. save fname X Chỉ lưu biến X. save fname X Y Z chỉ lưu các biến X, Y, Z. (có thể sử dụng ký tự đại diện '*'). save fname X Y Z -ASCII lưu các biến ASCII 8 bit nhị phân. save fname X Y Z -ASCII -DOUBLE lưu dạng ASCII 16 bit nhị phân. save fname X Y Z -APPEND bổ sung các biến vào tệp MAT-file đã có. Hàm save('fname','var1','var2') khi 'fname','var1','var2' là xâu ký tự. load tải giá trị các biến được lưu ở Files trên đĩa vào workspace. Các cú pháp: load FNAME tải các biến từ MAT-file 'fname.mat' đã có. Nếu không có fname thì mặc nhiên là file matlab.mat. load FNAME X Y Z ... chỉ tải các biến đá chỉ ra (có thể sử dụng ký tự đại diện '*'). load FNAME.EXT tải file ASCII, trong file có thể có chú thích (bắt đầu bởi %). Kết quả gán cho biến có tên FNAME (không có phần mở rộng) load FNAME -ASCII hoặc load FNAME -MAT. Hàm load('fname') sử dụng khi fname được gán dạng xâu ký tự. pwd hiển thị thư mục hiện hành quit hoặc exit thoát khỏi MATLAB Các phím thao tác trên cửa số dòng lệnh Home đưa con trỏ về đầu dòng End đưa con trỏ về cuối dòng ­ hiển thị lại các lệnh đã xoá trước đó ¯ hiển thị lại các lệnh đã nhập trước đó ¬, ® di chuyển con trỏ Ctrl+k xoá từ vị trí con trỏ đến cuối dòng Dữ liệu, hàm và cấu trúc lệnh trong MATLAB Khái niệm dữ liệu và biến Trong Matlab có các kiểu dữ liệu: (kiểu số, kiểu xâu, kiểu cấu trúc và kiểu files) Dữ liệu kiểu số: dưới dạng mảng hoặc vectơ các số phức (dạng đại số: a + jb) Dữ liệu kiểu xâu: dưới dạng các xâu (char) và mảng các xâu ký tự Dữ liệu kiểu đối tượng: dạng đối tượng hình ảnh, đồ hoạ, ... Dữ liệu kiểu cấu trúc: dạng các thành phần (bản ghi và mảng cấu trúc) Dữ liệu kiểu tệp (files): là các tệp lưu thông tin trên đĩa Với mỗi kiễu dữ liệu, cần chú ý khi làm việc: Khái niệm kiểu dữ liệu Làm việc trực tiếp với dữ liệu Các phép toán khi làm việc (đại số, quan hệ, logic) Các hàm, lệnh có sẵn trong thư viện Chuyển đổi kiễu dữ liệu Vào, ra với dữ liệu Tên (biến, hằng, hàm, ...) nói chung theo quy ước giống ngôn ngữ C++ Cụ thể: Bao gồm: Các chữ cái hoa ‘A’ ‘B’ ... ‘Z’, chữ cái thường ‘a’ ‘b’ ... ‘z’ Các chữ số ‘0’ ‘1’ ... ‘9’ Dấu gạch dưới ‘_’ Ký tự đầu của tên phải bằng chữ cái Có sự phân biệt chữ cái thường và chữ cái HOA Độ dài tối đa của tên 31 ký tự (19 ký tự đối với ver. 5.3) Tên các hàm (kể cả m-files) đã được đặt cũng có thể được sử dụng làm tên của biến, như vậy hàm này sẽ không được sử dụng trong quá trình tồn tại của biến, cho đến khi có lệnh xoá các biến đó trong bộ nhớ: lệnh clear hoặc clear . Các hàm, lệnh trong Matlab sử dụng chữ cái thường. Các ký hiệu và các toán tử Các ký hiệu , phân cách giữa các tham số của hàm, cột của ma trận hoặc ngăn cách các chỉ số hàng, cột khi truy cập phần tử của ma trận ; đặt sau câu lệnh không cho hiển thị kết quả của lệnh lên cửa sổ hay khai báo thêm 1 hàng mới của ma trận [ ] Dùng để tạo véc tơ, ma trận hoặc khai báo tham số ra của hàm. Cú pháp: Tên ma trận = [a11 a12…a1n ; a21 a22… a2n ;…;…] Trong đó: a11, a12, ..., a1n, ... là các giá trị tại hàng 1 cột 1 đến các giá trị tại hàng 1 cột n, ..., có m-1 dấu chấm phẩy ‘;’ sẽ có m hàng. Ví dụ: Tạo ma trận gồm 3 hàng và 3 cột với giá trị là 1 2 3 4 5 6 7 8 9 »a = [1 2 3; 4 5 6; 7 8 9] a = 1 2 3 4 5 6 7 8 9 ( ) khai báo tham số vào của hàm hoặc truy cập phần tử ma trận. Ví dụ: A(1,2) truy cập phần tử a12 Tạo vector đơn gồm có n phần tử. Cú pháp 1: Tênvector = [pt1 pt2 pt3 … ptn] Tênvector = [pt1, pt2, pt3, …, ptn] Trong đó: pt1 pt2 …ptn: là các phần tử của véc tơ. Ví dụ: Tạo vector a gồm có 4 phần tử, với các giá trị là:1, 2, 3, 4 »a = [1 2 3 4] a = 1 2 3 4 Cú pháp 2: Tênvector = gtđầu:gia:gtcuối Trong đó: gtđầu: là giá trị đầu của vector. gia: số gia (có thể âm nếu gtđầu > gtcuối). gtcuối: giá trị cuối. Ví dụ: Tạo vector a có giá trị đầu 0.5, giá trị cuối 1.5, số gia 0.2 »a = 0.5:0.2:1.5 a = 0.5000 0.7000 0.9000 1.1000 1.3000 1.5000 ... dùng để tiếp tục dòng lệnh dài khi xuống hàng. Ví dụ: »set(h,’facecolor’,[0 1], ... ‘EdgeColor’,’k’,’Linewidth’,2) : Tạo vector hoặc ma trận phụ và lặp đi lặp lại các giá trị. Trong đó: Khai báo Công dụng j : k Tạo ra chuỗi j, j+1, j+2,…., k-1, k j : i : k Tạo ra chuỗi j, j+i, j+2i,….,k-i, k A(: , j) Chỉ cột thứ j của ma trận A A(i , :) Chỉ hàng thứ i của ma trận A(: , :) Chỉ toàn bộ ma trận A A(j : k) Chỉ phần tử A(j), A(j+1)…A(k) (ưu tiên theo cột) A(: , j , k) Chỉ các phần tử A(:, j), A(:, j+1)…A(:, k) A(:) Chỉ tất cả các thành phần của ma trận A % đứng trước các lời chú giải trong các câu lệnh. ' đặt sau trên biến ma trận để chuyển vị phức ma trận. .’ đặt sau trên biến ma trận để chuyển vị ma trận. Ví dụ: nếu A= [ 4.0000 + 2.0000i 3.0000 5.0000 - 7.0000i 3.0000 + 4.0000i] thì A’= 4.0000 - 2.0000i 5.0000 + 7.0000i 3.0000 3.0000 - 4.0000i và A.’= 4.0000 + 2.0000i 5.0000 - 7.0000i 3.0000 3.0000 + 4.0000i ‘ ‘ mở đầu và kết thúc cho các xâu văn bản (string) { } được dùng trong các câu lệnh gán phần tử mảng, mảng cấu trúc. Các phép toán đại số + cộng 2 ma trận/vectơ hoặc 2 số vô hướng với nhau - trừ 2 ma trận/vectơ hoặc 2 số vô hướng với nhau \ toán tử chia trái ma trận/véc tơ. Ví dụ: A\B tương đương A-1*B / toán tử chia phải ma trận/véc tơ. Ví dụ: A/B tương đương A*B-1 ./ hoặc .\ chia phải hay chia trái từng phần tử của ma trận * nhân hai ma trận với nhau .* nhân các phần tử tương ứng. Ví dụ: C=A.*B tức là cij =aij*bij ^ luỹ thừa ma trận hay số vô hướng. Ví dụ: a^2 tức là a2 .^ luỹ thừa từng phần tử của ma trận Ví dụ: Đầu tiên, sử dụng lệnh: format rat Phép toán với véc tơ, ma trận Phép toán với các phần tử 1 x 2 3 4 y 5 6 x’ 1 2 3 y’ 4 5 6 5 x + y 7 9 -3 x – y -3 -3 3 x + 2 4 5 -1 x – 2 -0 1 x * y không thực hiện được 4 x.* y 10 18 x’* y 32 x’.* y không thực hiện được 4 5 6 x * y’ 8 10 12 12 15 18 x.* y’ không thực hiện được 2 x * 2 4 6 2 x.* 2 4 6 x \ y 2.2857 4.0000 x.\ y 2.5000 2.0000 0.5000 2 \ x 1.0000 1.5000 2.0000 2./ x 1.0000 0.6667 0 0 0.1667 x / y 0 0 0.3333 0 0 0.5000 0.2500 x./ y 0.4000 0.5000 0.5000 x / 2 1.0000 1.5000 0.5000 x./ 2 1.0000 1.5000 x ^ y không thực hiện được 1 x.^ y 32 729 x ^ 2 không thực hiện được 1 x.^ 2 4 9 2 ^ x không thực hiện được 2 2.^ x 4 8 Các phép toán quan hệ và logic Các phép toán quan hệ: == So sánh bằng ; >= ; <= các toán tử so sánh ~= so sánh không bằng Trong đó: Các toán tử quan hệ thực hiện so sánh từng thành phần của 2 ma trận. Chúng tạo ra một ma trận có cùng kích thước với 2 ma trận, so sánh với các phần tử là 1 nếu phép so sánh là đúng và là 0 nếu phép so sánh là sai. Phép quan hệ ưu tiên thấp hơn phép toán đại số, cao hơn phép toán logic. Ví dụ: thực hiện phép so sánh sau: »x=6 x = 6 »x>=[1 2 3;4 5 6;7 8 9] ans = 1 1 1 1 1 1 0 0 0 »x=6 x = 6 »A=[1 2 3;4 5 6;7 8 9] A = 1 2 3 4 5 6 7 8 9 »x>=A ans = 1 1 1 1 1 1 0 0 0 »x=A x = 1 2 3 4 5 6 7 8 9 »x==A ans = 1 1 1 1 1 1 1 1 1 »x=2 x = 2 »x==A ans = 0 1 0 0 0 0 0 0 0 »x<A ans = 0 0 1 1 1 1 1 1 1 Các phép toán logic & phép và (nhân) logic AND | phép hoặc (cộng) logic OR ~ phép phủ định logic NOT xor phép logic EXCLUSIVE OR Trong đó: Kết quả phép toán là 1(khác 0) nếu phép logic là đúng và là 0 nếu phép logic là sai. Phép toán logic có độ ưu tiên thấp nhất so với phép toán đại số và quan hệ. Ví dụ: Cho phép toán 1>2 & 3+4 thì máy tính sẽ thực hiện 3+4 được 7, sau đó tới 1>2 được 0 rồi thực hiện 0 & 7 và cuối cùng ta được kết quả là 0. (thay 1<2 & 3-4 kết quả vẫn là 0) Các hàm logic (Logical function) Hàm all Kiểm tra vector/cột ma trận có giá trị nào bằng 0 hay không. Cú pháp: y = all(x) y = all(x,DIM) Trong đó: y biến chứa kết quả y = 1 khi tất cả các phần tử khác 0 y = 0 khi có 1 phần tử bằng 0 x tên vector hay ma trận DIM hướng kiểm tra ma trận, DIM = 1 (mặc nhiên) kiểm tra theo cột, DIM = 2 kiểm tra theo hàng, DIM = 3 kiểm tra từng phần tử Ví dụ: » a=[1 2 3] a = 1 2 3 » y=all(a) y = 1 » a=[1 2 0] a = 1 2 0 » y=all(a) y = 0 » a=[1 2 3;4 5 6;7 -8 9] a = 1 2 3 4 5 6 0 -8 9 » y=all(a) y = 0 1 1 » a=[1 2 3; 4 5 0;7 0 9] a = 1 2 3 4 5 0 7 0 9 » y=all(a) y = 1 0 0 Hàm any Kiểm tra vector/cột ma trận có giá trị nào khác 0 hay không. Cú pháp: y = any(x) y = any(x,DIM) Trong đó: y biến chứa kết quả. y = 1 khi có 1 phần tử khác 0. y = 0 khi tất cả các phần tử bằng 0. x tên vector, hay ma trận. DIM hướng kiểm tra ma trận, Ví dụ: » a=[1 2 3]; » y=any(a) y = 1 » b=[1 0 3 0]; » y=any(b) y = 1 » c=[1 2 0 4;0 2 0 4;1 2 3 4;3 4 5 6] c = 1 2 0 4 0 6 7 8 1 2 3 0 5 0 7 8 » y=any(c) y = 1 1 1 1 » d=[0 0 0 0;0 1 3 0] d = 0 0 0 0 0 1 3 0 » y=any(d) y = 0 1 1 0 Hàm exist Kiểm tra biến hay file có tồn tại hay không. Cú pháp: e = exist(‘name’) Trong đó: name: là tên file hay tên biến. e: biến chứa giá trị trả về. e Ý nghĩa 0 name không tồn tại trong vùng làm việc 1 name là biến đang tồn tại trong vùng làm việc 2 name đang tồn tại trên đĩa (m-file hoặc file không xác định kiểu) 3 name là MEX-file 4 name là file dịch từ phần mềm Simulink (.mdl) 5 name là hàm của Matlab 6 name là p-file 7 name là thư mục Ví dụ: »e = exist(‘dir’) e = 5 Hàm find Tìm phần tử trong vector/cột ma trận theo yêu cầu. Cú pháp: i = find(x) [i,j] = find(x) [i,j,V] = find(x) Trong đó: i: chỉ vị trí của phần tử cần tìm trong vector. i,j: chỉ số hàng và số cột tương ứng của phần tử cần tìm. V: chứa giá trị của phần tử cần tìm. x: tên vector, ma trận hay yêu cầu đề ra. Nếu không nêu ra yêu cầu thì mặc nhiên là tìm các phần tử khác 0. Yêu cầu thường có mặt các phép toán so sánh và logic. Ví dụ: » x=[1 8 0 2 3 0] x = 1 8 0 2 3 0 » k=find(x) k = 1 2 4 5 » a=[5 0 0;8 0 3] a = 5 0 0 8 0 3 » [i,j,k]=find(a) i = 1 2 2 j = 1 1 3 k = 5 8 3 Các giá trị đặc biệt MATLAB tự định nghĩa: pi : hằng số p i, j : ký hiệu đơn vị ảo. Nếu biến đặt trùng tên i hoặc j thì nó đè lên ký hiệu i, j (sau đó không sử dụng được) inf : đại diện cho giá trị vô cực µ (infinite) NaN: giá trị vô định 0 chia 0 (Not a Number) eps : độ chính các tương đối (khi sử dụng định dạng format long, eps = 2.220446049250313e-016) Các lệnh tương tác vào/ra (Interactive Input/Output) = lệnh gán (tương tự lệnh gán trong các ngôn ngữ khác) input nhập dữ liệu từ bàn phím. Cú pháp: Có 2 dạng: R = input('How many apples:') R = input('What is your name:','s') % nhập dữ liệu vào dạng string R giá trị nhập từ bàn phím fprintf cho phép in thông số ra theo định dạng. Cú pháp: fprintf(định dạng, tham số cần in) Giải thích: (xem thêm lệch sprintf) Định dạng bao gồm cả text và các ký tự định dạng đặc biệt (%e, %f, %g, \n, ...,các số và dấu chấm) được ghi trong dấu nháy đơn để điều khiển in các giá trị. %e : in ra dưới dạng số phảy động %f : in ra dưới dạng số phảy tĩnh %g : in ra dưới dạng số phảy tĩnh/động tuỳ thuộc bản thân giá trị %s : in ra dạng xâu ký tự \n, \r : xuống dòng (xuống dòng và lùi về đầu dòng) \t : thêm khoảng tab trống \\ : đưa ra \ %% : đưa ra % %o, %x, %u in ra dạng cơ số 8 (o), 16 (x), 10 không dấu Ví dụ: fprintf(‘ket qua la: %4.1f radian\n’, a); %Kết quả trên màn hình (với a=35) ket qua la: 35.0 radian disp hiển thị kết quả véc tơ/ma trận hay thông báo lên màn hình Cú pháp: disp(x) hiển thị véc tơ/ma trận x mà không hiển thị tên biến x disp(‘message’) hiển thị message lên màn hình pause ngừng tạm thời chương trình sau một thời gian/đợi gõ một phím bất kỳ. Cú pháp: pause tạm dừng đợi gõ phím bất kỳ pause(n) với n thời gian tạm dừng (tính bằng giây) Ví dụ: pause % Press any key to continue ... format điều khiển định dạng đầu ra Các định dạng kiểu hiển thị như sau: (mặc nhiên MATLAB hiển thị format short) Cú pháp Giải thích Ví dụ format short Hiển thị 4 số sau dấu chấm 3.1416 format long Hiển thị 15 số sau dấu chấm 3.141592653589792 format rat Hiển thị dạng phân số tối giản 355/133 format + Hiển thị số dương hay âm + format short e Hiển thị 4 số sau dấu chấm, ký pháp kỹ thuật 0.3142e+01 format long e Hiển thị 15 số sau dấu chấm với ký pháp kỹ thuật 0.314159265358979e+01 format short g Hiển thị 4 số sau dấu chấm chính xác hơn short và short e 3.1416 format long g Hiển thị 15 số sau dấu chấm chính xác hơn long và long e 3.141592653589792 format hex Hiển thị cơ số 16 4a02dbc format bank Hiển thị 2 số sau dấu chấm 3.14 Các lệnh, cấu trúc điều khiển chương trình (Control Flow) Cấu trúc if, else, elseif: Lệnh điều kiện. Cho phép if lồng nhau Cú pháp: if lệnh; lệnh; elseif lệnh; lệnh; else lệnh; lệnh; end; Ví dụ: if I = = J A(I,J) = 2; elseif abs(I-J) = = 1 A(I,J) = -1; else A(I,J) = 0; end; Lệnh end kết thúc câu lệnh for, while, switch, try, và if Cấu trúc switch Dùng trong câu lệnh lựa chọn nhiều trường hợp. Giống như câu lệnh CASE.. OF trong Pascal Cú pháp: switch case , lệnh; ..., lệnh; case lệnh; ..., lệnh; otherwise, lệnh; ..., lệnh; end; Cấu trúc for vòng lặp xác định. Cho phép nhiều vòng for lồng nhau Cú pháp: for , lệnh; ..., lệnh; end; Ví dụ: for i = 1:n, for j = 1:n, a(i,j) = 1/(i+j-1); end end for s = 1.0: -0.1: 0.0; end % steps s with increments of -0.1 Cấu trúc while vòng lặp không xác định. Cho phép lồng nhau. Cú pháp: while , lệnh; ..., lệnh; end Lệnh continue quay lại đầu vòng lặp WHILE hoặc FOR Lệnh break nhảy vô điều kiện ra khỏi lặp WHILE hoặc FOR Ví dụ: while 1, input(‘nhap so duong, thoat khi n<0:’); if n<=0, break; end; end; Lệnh global khai báo các biến toàn cục trong chương trình và hàm (dạng .m files) Lệnh local khai báo các biến cục bộ trong chương trình và hàm (dạng .m files) Lệnh echo on/off có/không hiển thị các lệnh M-files trong khi thi hành lệnh. Lệnh try dùng để bẫy lỗi. Nếu xảy ra lỗi khi thực hiện các lệnh trong TRY thì chương trình nhảy sang thực hiện các lệnh sau CATCH Cú pháp: try statement; ...; statement; catch statement; ...; statement; end Cách viết chương trình và hàm dạng m-files trong MATLAB Files chứa mã chương trình MATLAB gọi là m-files. M-files có thể là functions (hàm) yêu cầu phải trả về các tham số đầu ra, hoặc dạng scripts (chương trình) thi hành chuỗi các lệnh của MATLAB. MATLAB nhận biết file là M-file qua tên tập tin mở rộng *.m Cách tạo function M-files Định nghĩa hàm: function y = average(x) tham số hàm (arguments) tên hàm (function name) đầu ra (output argument) từ khoá (keyword) Cấu trúc hàm m-file Function definition line (dòng định nghĩa hàm) H1 (help 1) line (dùng cho tìm kiếm) Help text (dùng cho lời giải thích sử dụng) Function body function f = fact(n) % FACT Factorial. % FACT(N) returns the factorial of N, usually denoted by N!. % Put simply, FACT(N) is PROD(1:N). f = prod(1:n); Chú ý: - Nếu có nhiều tham số đầu ra thì viết dưới dạng: [thamso1, thamso2,...]=(arg1,arg2,...) - Trong thân hàm có lệnh gán tham số đầu ra bởi một giá trị. Gọi hàm thực hiện từ chương trình theo cú pháp: tênhàm(arg1,arg2,...); Ví dụ: Tạo hàm m-file trong cửa sổ soạn thảo có tên myfile và gọi hàm thực hiện. - Lưu hàm m-files với tên myfile.m (tên tập tin bắt buộc trùng với tên hàm) vào một đường dẫn thuộc các đường dẫn tìm kiếm của MATLAB - Gọi hàm vừa tạo để chạy dưới cửa sổ MATLAB như sau: myfile.m function c = myfile(a,b) c = sqrt((a.^2)+(b.^2)); »a = 7.5;b = 3.342; »c = myfile(a,b) % goi ham, truyen tham so c = 8.2109 So sánh chương trình viết bằng script M-Files và function M-Files script M-Files function M-Files • Không có tham số đầu vào và đầu ra • Làm việc với dữ liệu trong workspace • Thuận lợi cho việc thực hiện trình tự các dãy lệnh cần thiết một cách tự động tại nhiều thời điểm khác nhau • Có thể có tham số đầu vào và đầu ra • Làm việc với dữ liệu, các biến (local/global) bên trong function và các tham số vào, ra • Thuận lợi cho việc mở rộng ngôn ngữ MATLAB cho ứng dụng của bạn Ví dụ: tính trung bình function y = average(x) % AVERAGE Mean of vector elements (tinh gia tri trung binh cua cac phan tu) % AVERAGE(X), where X is a vector, is the mean of vector elements. % Non-vector input results in an error. [m,n] = size(x); if (~((m == 1) | (n == 1)) | (m == 1 & n == 1)) error(’Input must be a vector’) end y = sum(x)/length(x); % Actual computation - Cách làm việc khi gọi m-files trong MATLAB theo trình tự sau: + Tìm xem đó có phải là biến không + Kiểm tra có phải là dạng chương trình đã biên dịch sẵn hay không (*.mex file) + Tìm trong thư mục hiện hành + Tìm trong các thư mục trong search path Chú ý: có thể chuyển script file sang function file bằng cách thêm vào: function mà không cần có tham số đầu vào và tham số đầu ra Các bài tập ứng dụng ** Các hàm toán hỌc thông dỤng Các hàm toán học cơ bản Các hàm xử lý số phức: Cho số phức dạng đại số: Z = a + jb (dạng số mũ C.ej.phi) abs(Z) cho giá trị tuyệt đối của số/biên độ C của số phức angle(Z) cho góc pha phi của một số phức complex(a,b) tạo số phức Z từ các số thực a, b. Ví dụ: complex(3,4) cho kết quả là số phức 3+4i conj(Z) cho số phức liên hợp Z* = a - jb imag(Z) lấy phần ảo của số phức real(Z) lấy phần thực của số phức Các hàm lượng giác và hữu tỷ (thực hiện từng phần tử) acos, acosh cho arccos và arccos hyperbolic acot, acoth cho arccotang và arccotang hyperbolic asin, asinh cho arcsin và arcsin hyperbolic atan, atanh cho arctang và arctang hyperbolic atan2(x,y) cho arctang của y/x trong khoảng -p -> +p cos, cosh cho cosin và cosin hyperbolic cot, coth cho Cotang và cotang hyperbolic sin, sinh cho sin và sin hyperbolic tan, tanh tang và tang hyperbolic exp cho ex với x là một số log logarithm tự nhiên ln(x) với x là một số log2 logarithm cơ số 2 log2(x) với x là một số log10 logarithm cơ số 10 sqrt căn bậc hai Các hàm làm tròn số, ... round làm tròn với số nguyên gần nhất fix làm tròn bằng cách cắt bỏ phần thập phân ceil làm tròn số về phía số nguyên lớn hơn. Cú pháp: y = ceil(x) Ví dụ: »x = [-1.9000 -0.2000 3.4000 5.6000 7.0000]; »y = ceil(x) y = -1 0 4 6 7 floor làm tròn số về phía số nguyên nhỏ hơn. Ví dụ: »x = [-1.9000 -0.2000 3.4000 5.6000 7.0000]; »y = floor(x) y = -2 -1 3 5 7 mod mod(x,y): phần dư phép chia x/y có dấu trùng dấu của y rem rem(x,y): phần dư phép chia x/y có dấu trùng dấu của x sign xác định dấu của một biến hoặc phần tử của véc tơ/ma trận. sign(x) có kết quả bằng 1 nếu x>0, bằng 0 nếu x=0 và bằng –1 nếu x<0 gcd ước số chung lớn nhất của các phần tử (Greatest common divisor). lcm bội số chung nhỏ nhất (Least common multiple). Ví dụ: lcm(A,B) cho bội số chung nhỏ nhất của từng phần tử tương ứng hai ma trận A, B. Các hàm xử lý ma trận và vector Ký hiệu A là ma trận, X là vectơ, MATLAB cung cấp các hàm sau: length(X) cho ta kích thước vectơ X linspace tạo vector tuyến tính giới hạn trong một khoảng. Cú pháp: y = linspace(x1, x2) y = linspace(x1, x2, n) Trong đó: y: tên của vector. x1, x2: giá trị lớn nhất và nhỏ nhất của vector y. n: số phần tử của vector y, nếu không có thì mặc định n = 100. Ví dụ: »y = linspace(1, 10, 7) y = 1.0000 2.5000 4.0000 5.5000 7.0000 8.5000 10.0000 logspace tạo vector có giá trị tỷ lệ logarithm trong một khoảng. Cú pháp: y = logspace(x1, x2) y = logspace(x1, x2, n) Trong đó: y: tên của vector. x1, x2: giới hạn giá trị lớn nhất 10^x2 và nhỏ nhất 10^x1 của vector y. n: số phần tử của vector y. Nếu không có n thì mặc định n = 50. Ví dụ: »y = logspace(1, 2, 7) y = 10.0000 14.6780 21.5443 31.6228 46.4159 68.1292 100.0000 A=diag(X) nếu X là vectơ thì A là ma trận vuông với đường chéo chính là X X=diag(A,k) lấy các phần tử trên đường chéo (chính khi k=0) lưu vào vec tơ cột det(A) tính định thức ma trận vuông inv(A) tìm ma trận nghịch đảo [m,n] = size(A) : cho kích thước mxn của ma trận A rank(A) hạng ma trận expm(A) hàm eA với A là ma trận Ví dụ: »kq = expm(3) kq = 20.0855 logm(A) ln(A) với A là ma trận sqrtm(A) với A là ma trận eye(m,n) tạo ma trận đơn vị mở rộng mxn, eye(n) tạo ra ma trận vuông nxn zeros(m,n) tạo ma trận mxn có các phần tử bằng 0 ones((m,n) tạo ma trận mxn có các phần tử bằng 1 rand tạo ma trận các phần tử ngẫu nhiên chuẩn ([0 1]). Cú pháp: y = rand(n) y = rand(m,n) Trong đó: y: tên ma trận. n: ma trận có n hàng, n cột. m, n: ma trận có m hàng, n cột. Ví dụ: »y = rand(3) y = 0.9340 0.0920 0.7012 0.8462 0.6539 0.7622 0.5269 0.4160 0.7622 »y = rand(3,5) y = 0.2625 0.3282 0.9910 0.9826 0.6515 0.0475 0.6326 0.3653 0.7227 0.0727 0.7361 0.7564 0.2470 0.7534 0.6316 Xem thêm các hàm randn, sprand, sprandn, ... magic tạo ma trận vuông có tổng của các phần tử trên hàng, cột, đường chéo bằng nhau (ma phương). Giá trị của mỗi phần tử là dãy số nguyên từ 1 đến n2. Cú pháp: A = magic(n) Trong đó: n: kích thước ma trận. Ví dụ: »A = magic(3) A = 8 1 6 3 5 7 4 9 2 max cho giá trị lớn nhất của véc tơ/ma trận. Cú pháp: m = max(x) [m,i] = max(x) v = max(x,y) v = max(x,[],DIM) Trong đó: x,y: tên vector/ma trận. v : tên véc tơ. m: giá trị lớn nhất. i: vị trí của m. DIM: hướng thực hiện phép toán Ví dụ: x = [3 5 2 1 4] »m= max(x) m = 5 »[m,i] = max(x) m = 5 i = 2 Cho y = [1 6 8 -5 3] »v =max(x,y) v = 3 6 8 1 4 Cho b =[3 6 2 1 7 9 2 8 1] »m = max(b) m = 3 8 9 »[m,i] = max(b) m = 3 8 9 i = 1 3 2 a = 0 3 6 7 1 1 4 6 8 »v = max(a,b) v = 3 6 6 7 7 9 4 8 8 min cho giá trị nhỏ nhất của véc tơ/ma trận. Cú pháp: m = min(x) [m,i] = min(x) v = min(x,y) Trong đó: x,y: Tên ma trận/véc tơ. v: tên vector. m: là giá trị nhỏ nhất. i: là vị trí của m. DIM: hướng thực hiện phép toán (x là ma trận) DIM=1(mặc nhiên) theo cột, 2: hàng Ví dụ: x =[ 3 5 2 1 4] »m = min(x) m = 1 Cho y =[1 6 8 -5 3] »v = min(x,y) v = 1 5 2 -5 3 b = [ 3 6 2 1 7 9 2 8 1] »[m,i] = min(b) m = 1 6 1 i = 2 1 3 a = [ 0 3 6 7 1 1 4 6 8] »v = min(a,b) v = 0 3 2 1 1 1 2 6 1 minmax cho giá trị nhỏ nhất và lớn nhất của véc tơ/hàng ma trận. Cú pháp: V = minmax(A) Trong đó: A: véc tơ/ma trận cần tìm giá trị nhỏ nhất và lớn nhất. V: véc tơ/ma trận có hai cột chứa giá trị nhỏ nhất và lớn nhất của các hàng. fmin tìm điểm có giá trị nhỏ nhất của hàm số. Cú pháp: x = fmin(‘function’,x1,x2) Trong đó: x: biến chứa kết quả. function: tên hàm số. x1, x2: khoảng khảo sát. Ví dụ: Tìm giá trị nhỏ nhất của hàm số: x3-2x-5 trong khoảng [0 2] »x =fmin(‘x.^3-2*x-5’,0,2); x = 0.8165 »y = x.^3-2*x-5 y = -6.0887 fzero tìm điểm 0 của hàm số. Cú pháp: fzero(‘fun’,x0) Trong đó: Điểm 0 của hàm số là điểm (0,x), đây cũng chính là nghiệm của hàm số. Nếu hàm có nhiều nghiệm thì sẽ tìm nghiệm gần giá trị x0. fun: tên hàm số dạng .m file. Nếu hàm toán học thì thêm @ trước tên hàm. Ví dụ: Tìm giá trị 0 của hàm số: x2-5x+3. Trước tiên ta khai báo hàm số f trong tập tin f.m function y = f(x); y = x.^2-5*x+3; Sau đó, tạo tập tin gt0.m: x = 0:10; % Giá trị x0 = 0 z = fzero(‘f’,0); sprinf(‘z = %3f’,z) %z = 0.382 % Giá trị x0 = 2 z = fzero(‘f’,2); sprintf(‘z = %.3f’,z) %z = 2.618 z = fzero(‘f’,0); % Vẽ đồ thị hàm số minh họa: fplot(‘f’,[0,5]; grid; hold on; plot(z,0,‘o’); hold off Các thao tác trên dữ liệu chuỗi (STRING) Khái niệm Biến chứa dữ liệu string trong MATLAB giống như các biến số thông thường, tức là biến được nhập, thao tác và lưu trong các vectơ với mỗi phần tử của vectơ là một ký tự. Việc xác định vị trí của mỗi phần tử biến string thông qua chỉ số của nó. Ma trận string cũng được sử dụng nhưng các string phải có kích thước bằng nhau. Ví dụ: nếu a=’toi’ thì a(1)=t và a(1:3)=toi »b=[‘toi’ ; ‘ten’] thì b(1,1)=t ; b(2,2)=e ; b(1,:)=toi Kết hợp các chuỗi tạo ra string mới bằng cách: newst =[str1,str2,str3] Các hàm xử lý chuỗi isstr/ischar kiểm tra nội dung biến là chuỗi ký tự không. Cú pháp: kq = ischar(n) kq = isstr(n) % chỉ có đến phiên bản MATLAB 5.3 Trong đó: kq: biến chứa kết quả. n: tên biến cần kiểm tra. kq = 1 nếu n là chuỗi ký tự, 0 nếu n không là chuỗi ký tự. Ví dụ: » n='MATLAB'; » kq=isstr(n) kq = 1 » m=[1 2 3 4]; » kq=isstr(m) kq = 0 isspace(st) trả lại véc tơ giá trị 0 tại các ký tự trống (1 tại ký tự khác) strcat(st1,st2,...) nối các xâu st1 st2 ... thành dòng strvcat(st1,st2,...) nối các xâu st1 st2 ... thành cột strrep(st1,st2,st3) thay thế xâu st2 trong st1 thành st3 findstr(st1,st2) trả về véc tơ vị trí bắt đầu của xâu st2 trong st1 strcmp so sánh 2 chuỗi ký tự. Cú pháp: l = strcmp(s1, s2) Trong đó: l: biến chứa kết quả. s1, s2: chuỗi cần so sánh. Ví dụ: »a = ‘MatLab WoRkS’ »b = ‘MatLab WoRkS’ »strcmp(a,b) ans = 1 upper cho ra chuỗi ký tự viết hoa. Cú pháp: b = upper(s) Trong đó: b: biến chứa kết quả. s: tên biến chứa chuỗi ký tự. Ví dụ: »a = ‘MaTlab WORks’ »b = upper(a) b = MATLAB WORKS »b = upper(‘MaTlab WORks’) b= MATLAB WORKS lower cho ra chuỗi ký tự viết thường. Cú pháp: b = lower(s) Trong đó: b: biến chứa kết quả. s: tên biến chứa chuỗi ký tự hay chuỗi ký tự. str2mat tạo ma trận có các phần tử dạng chuỗi. Cú pháp: s = str2mat(‘s1’, ‘s2’, …) Trong đó: s: tên ma trận kết quả. s1, s2: chuỗi ký tự. Ví dụ: »s = str2mat(‘mat’, ‘lab’) s = mat lab blanks tạo khoảng trắng giữa hai hay nhiều chuỗi ký tự theo mong muốn. Cú pháp: [S1 blanks(b1) S2 blanks(b2) …blanks(bn) Sn] Trong đó: S1, S2, …, Sn: các chuỗi ký tự. b1, b2: số khoảng trắng. Các hàm chuyển đổi dữ liệu abs(str) trả lại giá trị là vectơ với các phần tử là mã ASCII của các ký tự. Ví dụ: a='abc' thì X=abs(a)= [97 98 99] double(str) chuyển str sang dạng số ( ASCII t.tự hàm abs) char(x) chuyển véc tơ/các dòng ma trận x dạng mã ASCII thành xâu eval chuyển đổi chuỗi ký tự thành biểu thức. Cú pháp: kq = eval(‘string’) Trong đó: kq: biến chứa kết quả. ‘string’ là các ký số: chuyển thành những con số, là câu lệnh thi hành được. Ví dụ: » a='199999999'; » eval(a)+1 ans = 200000000 setstr(X) chuyển vectơ X với các phần tử là các số nguyên trong khoảng 0 đến 255 thành chuỗi string tương ứng. Ví dụ: với X = [97 98 99] thì setstr(X)=’abc’ num2str(f) chuyển đổi đại lượng vô hướng f thành chuỗi string (dùng hiển thị ra màn hình các dữ liệu số như lệnh disp) num2str(f,k) chuyển đổi đại lượng vô hướng f thành chuỗi string với k chữ số str2num chuyển chuỗi (dạng số) sang số thực. Cú pháp: n = str2num(s) Trong đó: s: chuỗi dạng số. n: số thực. Ví dụ: »n = str2num(‘456456’) n = 456456 int2str(n) chuyển đổi số nguyên n thành chuỗi string rats(x,strlen) chuyển số thực thành chuỗi string với strlen chiều dài của chuỗi hex2num(hstr) chuyển đổi số theo hệ hexa thành chuỗi string hex2dec(str) chuyển đổi hệ hexa dưới dạng string str thành sô nguyên. Ví dụ: hex2dec('0f')=15 dec2hex(num) chuyển đổi số nguyên sang hexa. Ví dụ: dec2hex(2748) = 'ABC'. dec2bin(num) chuyển số thập phân num thành số nhị phân. Ví dụ: dec2bin(23) = '10111' bin2dec(num) chuyển số nhị phân num thành số nguyên. Ví dụ: bin2dec('010111') returns 23 Các thao tác trên dữ liệu cấu trúc Dữ liệu kiểu cấu trúc (Struct) Mỗi dữ liệu cấu trúc (bản ghi: record) bao gồm nhiều thành phần dữ liệu (các trường: fields) có kiểu khác nhau, ví dụ thông tin về quản lý con người: Họ tên tuổi giới tính bậc lương số con bảng chấm công ... xâu số nguyên logic số thực số nguyên mảng số ... Tạo cấu trúc (Có 2 cách): Sử dụng lệnh STRUCT để tạo cấu trúc. Cú pháp: S = struct('field1',VALUES1,'field2',VALUES2,...) S = struct(OBJ) chuyển dữ liệu đối tượng OBJ thành cấu trúc tương đương. Trong đó: S: biến chứa dữ liệu cấu trúc. field1, field2,...: các biến trường của cấu trúc. VALUES1, VALUES2,...: các giá trị của các biến trường. OBJ: đối tượng cần chuyển đổi kiểu. Ví dụ1: »s = struct('strings',{{'hello','yes'}},'lengths',[5 3]) s = strings: {'hello' 'yes'} lengths: [5 3] Ví dụ 2: »s = struct('type',{'big','little'},'color','red','x',{3 4}) s = 1x2 struct array with fields: type color x Tạo cấu trúc trực tiếp: Sử dụng dấu chấm ’.’ truy cập các trường của cấu trúc Cú pháp: recname.fielname = value Trong đó: recname: tên biến cấu trúc. fielname: tên biến trường cần tạo. value : giá trị của fielname. Ví dụ: »nguoi.hoten = ’Nguyen Van A’; »nguoi.tuoi = 20; »nguoi.gtinh = 0; »nguoi.bluong = 1.52; »nguoi.ngaycong = [1 1 1 0 1 0 0;1 0 1 0 1 0 0;1 0 0 1 1 0 0;0 1 1 1 0 0 0]; » nguoi nguoi = hoten: 'Nguyen Van A' tuoi: 20 gtinh: 0 bluong: 1.5200 ngaycong: [4x7 double] Các hàm làm việc với cấu trúc fieldnames trả về biến mảng cấu trúc chứa tên các trường. Cú pháp: NAMES = fieldnames(S) Trong đó: S: biến cấu trúc đã tạo. NAMES: biến mảng cấu trúc chứa tên các trường của S. rmfield loại bỏ một trường ra khỏi cấu trúc. Cú pháp: S = rmfield(S,'field') loại bỏ trường field khỏi cấu trúc S. S = rmfield(S,FIELDS) loại bỏ một số trường, với FIELDS là mảng các ký tự. isfield kiểm tra biến là một trường của cấu trúc hay không. Cú pháp: F = isfield(S,'field') trả về giá trị đúng (1) nếu 'field' là tên một trường của S. getfield lấy nội dung một trường của cấu trúc. Cú pháp: F = getfield(S,'field') trả về nội dung của field trong cấu trúc S. tương tự F=S.field. Ví dụ: F = getfield(S,{i,j},'field',{k}) %tương tự với lệnh F = S(i,j).field(k). setfield thiết lập nội dung cho các trường. Cú pháp: S = setfield(S,'field',V) đặt giá trị V cho trường field của S, tương tự S.field=V. Ví dụ: S = setfield(S,{i,j},'field',{k},V) %tương tự S(i,j).field(k) = V; Dữ liệu kiểu mảng cấu trúc (Cell Array) Có thể tổ chức các cấu trúc thành mảng với mỗi cấu trúc là một phần tử mảng Tạo mảng cấu trúc (Có 2 cách): Cách 1: Sử dụng lệnh CELL để tạo mảng cấu trúc. Các cú pháp: cell(n) tạo mảng cấu trúc rỗng kích thước NxN. cell(M,N)/cell([M,N]) tạo mảng cấu trúc rỗng kích thước MxN. cell(M,N,P,...)/cell([M N P ...]) tạo mảng cấu trúc rỗng MxNxP. cell(SIZE(A)) tạo mảng cấu trúc rỗng kích thước giống kích thước của A. Cách 2: Tạo mảng cấu trúc trực tiếp: Sử dụng dấu ngoặc nhọn {} và dấu () để truy cập đến các phần tử mảng cấu trúc. Cú pháp: có 2 cách tạo và sử dụng khác nhau arrname{i,j}=value arrname(i,j)={value} Trong đó: arrname : tên biến mảng cấu trúc. i, j : chỉ số của phần tử mảng cấu trúc. value : giá trị cần gán cho phần tử mảng thứ i, j (fielname). Ví dụ1: »lop{1,1}=‘00D’; »lop{1,2}=55; »lop{1,3})=[0 1 2;3 4 5]; Ví dụ2: »clear »lop{1,1}.hoten=‘Nguyen Van A’; »lop{1,1}.tuoi=20; »lop{1,2}.hoten=‘Tran B’; Làm việc với mảng cấu trúc sử dụng { } để truy cập đến từng phần tử mảng cấu trúc (cách 1) và ( ) để truy cập đến từng phần tử mảng cấu trúc (cách 2) celldisp hiển thị nội dung của mảng cấu trúc. Cú pháp: celldisp(C) hiển thị nội dung của mảng cấu trúc C celldisp(C,NAME) hiển thị nội dung cấu trúc C và thay thế tên xâu NAME cho C Ví dụ: »celldisp(lop) lop{1} =hoten: 'Nguyen Van A' tuoi: 20 lop{2} = hoten: 'Tran B' » celldisp(lop,'ten') ten{1} = hoten: 'Nguyen Van A' tuoi: 20 ten{2} = hoten: 'Tran B' cellplot(C) hiển thị bằng đồ hoạ cấu trúc của mảng cấu trúc C cellstr(S) chuyển xâu S sang dạng mảng cấu trúc char(B) chuyển mảng cấu trúc B sang dạng xâu Các hàm giao tiếp với tệp dữ liệu (FILES) Ngoài tệp mat-file đã biết, để tương thích với ngôn ngữ C, MATLAB còn định nghĩa hai loại tệp dạng văn bản (text) và nhị phân (ASCII) với các cách làm việc khác nhau. fopen mở file hoặc truy xuất dữ liệu của file đang mở. Cú pháp: fid = fopen(‘fn’, ‘p’) Trong đó: fid: tên biến kiểu số nguyên (0, 1, 2, ...) trỏ đến file đang mở. fn: tên file (có thể đặt đường dẫn). Tham số p có các định dạng sau (mặc nhiên là dạng nhị phân): ‘r’: chỉ đọc. ‘r+’: đọc và ghi. ‘w’: xóa tất cả nội dung của file, tạo file mới và mở để ghi. ‘w+’: xóa tất cả nội dung của file, tạo file mới để ghi và đọc. ‘a’ : mở file để bổ sung thông tin (khởi tạo nếu file chưa có) ‘a+’ : mở file để đọc và bổ sung thông tin (tạo nếu chưa có) 'W' : mở file để ghi mà không tự động làm tươi 'A' : mở file để bổ sung mà không tự động làm tươi ‘t’ : mở file dạng văn bản (text). Ví dụ: ‘rt’, ‘wt+’, ... fread đọc dữ liệu dạng nhị phân từ file. Cú pháp: [A, COUNT] = fread(FID) [A, COUNT] = fread(FID,SIZE,PRECISION) Trong đó: A: tên biến chứa dữ liệu được đọc vào. COUNT: số phần tử được đọc vào. FID: tên biến trỏ đến file cần đọc. SIZE: kích thước dữ liệu đọc vào, được định dạng bởi: n: chỉ đọc n phần tử vào cột vector a. inf: đọc đến hết file. [m,n]: chỉ đọc vào m cột và n hàng, n có thể bằng inf còn m thì không. PRECISION: là xâu ký tự (thường ít sử dụng thông số này). Ví dụ 1: fid = fopen('fread.m','r'); F = fread(fid); s = setstr(F') Ví dụ 2: file vd.txt có nội dung: A B C 1 2 3 fid = fopen(‘vd.txt’,’r’); [a,c] = fread(fid); disp(a); disp(c); a = 65 32 66 32 67 13 10 49 32 50 32 51 c = 12 Ví dụ 3: fid = fopen(‘vd1.txt’,’r’); [a,c] = fread(fid, 4); disp(a); disp(c); a= 65 32 66 32 c = 4 Ví dụ 4: file vd3.txt có nội dung ABCDE FGHIJ KLMNO fid = fopen(‘vd3.txt’,’r’); [a,c] = fread(fid, [7, inf]); disp(a); disp(c); a = 65 70 75 66 71 76 67 72 77 68 73 78 69 74 79 13 13 13 10 10 10 c = 21 »a’= 65 66 67 68 69 13 10 70 71 72 73 74 13 10 75 76 77 78 79 13 10 fwrite ghi đoạn dữ liệu dạng nhị phân thành file. Cú pháp: COUNT = FWRITE(FID,A,PRECISION) Trong đó: FID: tên biến trỏ đến file cần ghi. A: tên biến ma trận chứa dữ liệu cần ghi. COUNT: nhận số phần tử ghi được. PRECISION: tương tự lệnh FREAD. Ví dụ 1: fid = fopen('magic5.bin','wb') fwrite(fid,magic(5),'integer*4')%file nhị phân có 25 phần tử magic 5x5 số nguyên. Ví dụ 2: Ghi đoạn dữ liệu của biến a thành file a.txt: a = [65 66 67] fid = fopen(‘a.txt’, ‘w’); fwrite(fid, ‘%’); fwite(fid,a); %Gán file a.txt vào biến b để xem nội dung fid = fopen(‘a.txt’); b = fscanf(fid, ‘%’); disp(b); fclose(fid);%Kết quả b = ABC fscanf đọc dữ liệu đã định dạng từ file. Cú pháp: [a,count] = fscanf(fid, ‘format’, size) Trong đó: a: tên biến chứa chuỗi ký tự sau khi được định dạng. count: đếm số phần tử được đọc vào. size: kích thước sẽ được đọc vào. format: phần định dạng giống như lệnh sprintf. fid: biến định vị tên file từ lệnh FOPEN. Ví dụ: S = fscanf(fid,'%s') đọc và trả về xâu ký tự. A = fscanf(fid,'%5d') đọc 5 số nguyên. fprintf ghi đoạn dữ liệu thành file. Cú pháp: COUNT = fprintf(FID,FORMAT,A,...) Trong đó: COUNT : số các byte được ghi FID : tên biến trỏ đến file cần ghi. FORMAT : phần định dạng phần thực của ma trận dữ liệu A. Ví dụ 1: x = 0:.1:1; y = [x; exp(x)]; fid = fopen('exp.txt','w'); fprintf(fid,'%6.2f %12.8f\n',y); fclose(fid); % tạo file text chứa bảng các giá trị hàm mũ 0.00 1.00000000 0.10 1.10517092 ... 1.00 2.71828183 Ví dụ 2: Tạo file exp.txt có nội dung: x = 0:2:10; y = [x, x/2]; fid = fopen(‘exp.txt’, ‘w’); fprintf(fid, ‘%d’, [2, inf]); Gán file exp.txt và biến a để xem nội dung: fid = fopen(‘exp.txt’) a = fscanf(fid, ‘%d’, [2,inf]); disp(a); fclose(fid); Kết quả 0 2 4 6 8 10 0 1 2 3 4 5 sscanf đọc chuỗi ký tự và định dạng lại chuỗi ký tự đó. Cú pháp: [a,count] = sscanf(s, ‘format’, size) Trong đó: a: tên biến chứa chuỗi ký tự sau khi được định dạng. count: đếm số phần tử được đọc vào. size: kích thước sẽ được đọc vào. format: phần định dạng giống như lệnh sprintf. Ví dụ: s = ‘3.12 1.2 0.23 2.56’; »[a, count] = sscanf(s, ‘%f’,3) a = 3.1200 1.2000 0.2300 count = 3 sprintf hiển thị thông tin lên màn hình. Cú pháp: s = sprintf(‘ts’,ds) Trong đó: s: biến chứa chuỗi số hiển thị trên màn hình. ts: các tham số định dạng. ds: danh sách các đối số. Tham số định dạng thuộc 1 trong 2 kiểu sau: Chuỗi ký tự: chuỗi sẽ được hiển thị lên màn hình giống như trong câu lệnh. (2) Chuỗi các tham số định dạng: chuỗi này sẽ không được hiển thị lên màn hình, nhưng tác dụng điều khiển việc chuyển đổi và cách hiển thị các đối số được đưa ra trong danh sách các đối số. Ví dụ các tham số định dạng: 1) %d: đối số là số nguyên được viết dưới dạng thập phân. s = sprintf(‘Đây là số: %d’,-24) s = Đây là số: -2 2) %u: đối số là số nguyên viết dưới dạng thập phân không dấu. s = sprintf(‘Đây là số: %u’,24) s = Đây là số: 24 3) %o: đối số là số nguyên viết dưới dạng cơ số 8 không dấu. s = sprintf(‘Đây là số: %o’,9) s = Đây là số: 11 4) %x: đối số là số nguyên được viết dưới dạng cơ số 16. s = sprintf(‘Đây là số: %x’,255) s = Đây là số:ff 5) %f: đối số là số nguyên được viết dưới dạng cơ số 10. s = sprintf(‘Đây là số: %f’,255) s = Đây là số: 255.000000 Để định dạng phần thập phân thì thêm vào con số chứa số thập phân cần lấy. s = sprintf(‘Đây là số: %.3f’, 2.5568) s = Đây là số: 2.557 6) %c: đối số là 1 ký tự riêng đặc biệt. s = sprintf(‘Đây là chữ: %c’,’M’) s = Đây là chữ: M 7)%s: đối số là chuỗi ký tự. s = sprintf(‘Đây là chuỗi: %s’, ‘Matlab’) s = Đây là chuỗi: Matlab fclose đóng file đang mở sau khi truy xuất xong. Cú pháp: st = fclose(fid) st = fclose('all') đóng tất cả các file, ngoại trừ fid = 0, 1 và 2. Trong đó: fid: tên biến trỏ đến file đang mở. Nếu đóng thành công st=0, nếu không st = -1. Các thao tác vẽ và xử lý đồ thị Các lệnh xử lý trên cửa sổ đồ thị MATLAB cung cấp thư viện hàm xử lý đồ hoạ rất mạnh và phong phú trong không gian 2-D và 3-D. Cùng lúc trên 1 trục toạ độ có thể vẽ nhiều đồ thị hoặc phân chia thành các đồ thị con. Sau đây ta nghiên cứu một số lệnh cơ bản nhất figure(n) tạo ra cửa sổ đồ thị mới với số thứ tự là n. Nếu cửa sổ đã tồn tại thì chọn đến đồ thị hiện hành để cho các lệnh khác tác dụng lên cửa sổ được chọn. sublot(m,n,p) chia một trang đồ hoạ làm nhiều ô nhỏ để vẽ các đồ thị lên mỗi ô. Với mxn là số ô sẽ vẽ, p là số thứ tự của ô hiện hành. Lệnh subplot luôn đi trước lệnh plot để chỉ cho lệnh plot biết sẽ vẽ lên ô nào. Khi cần trở về màn hình đồ hoạ bình thường (màn hình đơn có một đồ thị) ta gọi lệnh: subplot không có tham số. Trường hợp có nhiều cửa sổ đồ thị, nên dùng biến để nhận kết quả từ lệnh plot. hold on/off giữ lại đồ thị hiện hành trong khung màn hình đồ thị để gán thêm thuộc tính đồ thị hoặc vẽ thêm đồ thị khác mà không xoá đồ thị cũ/có xoá đồ thị cũ axis([xmin xmax ymin ymax]) xác định khoản giới hạn vẽ cho trục x và y axis([xmin xmax ymin ymax zmin zmax]) xác định khoản giới hạn vẽ cho trục x , y và z trong đồ thị 3D axis(‘ij’) quay trục y với hướng dưới theo chiều dương, trên theo chiều âm axis(‘xy’) xét lại trục y với hướng ban đầu axis('square') thay đổi toạ độ trục x,y để có cửa sổ vuông axis('auto') tự động thay đổi kích thước title(‘string’) in tiêu đề chương trình xlabel(‘string’) gán nhãn cho trục x ylabel(‘string’) gán nhãn cho trục y zlabel(‘string’) gán nhãn cho trục z (đối với đồ thị 3-D) legend(‘string1’,’ string2’,...) ghi chú cho đồ thị legend(‘off’) loại bỏ chú thích text(x1,y1, ‘string’) vẽ dòng string lên màn hình đồ hoạ tại toạ độ (x1,y1) gtext(‘string’) vẽ dòng string lên màn hình đồ hoạ tại vị trí bấm chuột zoom on/off cho phép sử dụng nút trái chuột để phóng to đồ thị, nút phải chuột để thu nhỏ/loại bỏ lệnh zoom [x,y]= ginput(n) đọc n điểm dữ liệu trên màn hình đồ hoạ. Toạ độ [x,y] nhận được từ vị trí con chuột đang trỏ trên màn hình đồ hoạ. box on/off hiển thị/không hiển thị đường viền hộp đồ thị grid on/off vẽ lên các ô lưới trên mặt phẳng toạ độ/bỏ chức năng vẽ lưới clf : xoá các đối tượng trong cửa sổ figure cla : xoá đồ thị trong ô close, close all xoá màn hình đồ hoạ (xem thêm hướng dẫn trên help) Các thao tác trực tiếp thuộc tính trên màn hình đồ hoạ - Thuộc tính Line Properties: Chỉnh sửa các tham số Linewidth, LineStyle, Color, MarkerSize, MarkerStyle Cách chọn theo các bước sau: + Chọn chế độ Enable Plot Editing + Chọn đồ thị cần thay đổi: Từ menu Tool -> Line Properties... Các thao tác này giúp người sử dụng chỉnh sửa lại đồ thị trực tiếp trên màn hình đồ hoạ. Có 3 thuộc tính với nội dung như sau: - Thuộc tính Axes Properties: Chỉnh sửa các thông số Title, Label, Scale, Grid... Cách chọn theo các bước sau: + Chọn chế độ Enable Plot Editing + Chọn trục toạ độ cần thay đổi: Từ menu Tool -> Axes Properties... - Thuộc tính Text Properties: Chỉnh sửa lại các thông số Font chữ. Cách chọn theo các bước sau: + Chọn chế độ Enable Plot Editing + Từ menu Tool -> Edit font properties... Lệnh vẽ trong không gian 2-D Đồ thị dạng đường, điểm (PLOT) Gồm các kiểu lệnh sau: plot(x,y) : vẽ đồ thị gồm tập hợp các điểm là các phần tử của véc tơ x (trục hoành) và y (trục tung). plot(y) : vẽ đồ thị gồm tập hợp các điểm là các phần tử của véc tơ y (trục tung) và các giá trị thứ tự các phần tử véc tơ y (trục hoành). Nếu y véc tơ gồm các số phức thì đồ thị là tập hợp các điểm với hoành độ là phần thực và tung độ là phần ảo. Tương đương với lệnh: plot(real(y), image(y)) plot(x,y,’str’) : vẽ đồ thị với định dạng cho màu sắc và kiểu đường vẽ nhờ khai báo qua str là tham số tối đa gồm 3 ký tự chứa các thông tin sau: + màu sắc theo quy định: y yellow m magenta c cyan r red g green b blue w white k black + quy định kiểu đánh dấu (markerStyle): . point o circle x x-mark + plus * star s square d diamond v triangle ^ triangle < triangle > triangle p pentagram h hexagram + Kiểu đồ thị (lineStyle) - solid -. dashdot -- dashed : dotted Ví dụ: plot(X,Y,'c+:') sẽ vẽ đồ thị với định dạng màu xanh cyan, kiểu đánh dấu + và kiểu đồ thị : (dotted). Khi vẽ nhiều đồ thị cùng lúc trên một ô, dùng lệnh plot sau: plot(x1,y1,’str1’,x2,y2,’str2’,...) với str1, str2,... là các định dạng theo quy định trên. Ví dụ: plot(x1,y1,’y-‘,x2,y2,’g--‘) Có thể cho phép gán thuộc tính đồ thị trong câu lệnh plot Ví dụ: plot(x1,y1,’y-‘,’LineWidth’,2,’MarkerSize’,10,x2,y2,’g--‘,... ’LineWidth’,1,’MarkerSize’,5) Trong đó: LineWidth là thuộc tính chiều dày nét vẽ và MarkerSize là chiều cao ký tự đánh dấu. (Chú ý các ký tự in HOA và in thường). fplot vẽ đồ thị của hàm số dạng function. Cú pháp: fplot(‘fun’,[xmin,xmax] Trong đó: fun: tên hàm số. xmin, xmax: xác định khoảng cần vẽ. Ví dụ: »fplot(‘x.^3-2*x-5’,[0,2]); »grid; Các ví dụ tổng hợp: Ví dụ1: vẽ đồ thị áp 3 pha hình sin trên cùng một hệ toạ độ x = linspace(0,4*pi,500); % cho x chay tu o den 4pi voi 500 mau y1 = 5*sin(x); y2 = 5*sin(x+2*pi/3); y3 = 5*sin(x-2*pi/3); plot(x,y1,x,y2,x,y3); % Set axis limits and grid lines grid on xlabel('Time') ylabel('Amplitude') legend('First','Second','Third') title('3 phase_sin plot') Ví dụ2: vẽ đồ thị áp 3 pha hình sin trên cùng một cửa sổ với 3 ô đồ thị nhỏ x = linspace(0,4*pi,500); % cho x chay tu o den 4pi voi 500 mau y1 = 5*sin(x); y2 = 5*sin(x+2*pi/3); y3 = 5*sin(x-2*pi/3); %Select window and position plot region within window subplot(2,2,1) h1 = plot(x,y1,’y-o’,'LineWidth',2,’MarkerSize’,5); grid on xlabel('Time') ylabel('Amplitude') legend(h1,'First') title('First phase') subplot(2,2,2) h2 = plot(x,y2,’g-+’,'LineWidth',2,’MarkerSize’,5); xlabel('Time') ylabel('Amplitude') legend(h2,'Second') title('Second phase') subplot(2,2,3) h3 = plot(x,y3,’r-*’,'LineWidth',2,’MarkerSize’,5); xlabel('Time') ylabel('Amplitude') legend(h3,'third') title('third phase') subplot % dua cua so do thi tro lai binh thuong Ví dụ 3: vẽ đồ thị áp 3 pha hình sin trên 3 cửa sổ khác nhau x = linspace(0,4*pi,500); % cho x chay tu o den 4pi voi 500 mau y1 = 5*sin(x); y2 = 5*sin(x+2*pi/3); y3 = 5*sin(x-2*pi/3); figure(1) plot(x,y1,’r-‘); % Set axis limits and grid lines grid on xlabel('Time') ylabel('Amplitude') legend('First') title('3 phase_sin plot') % ve do thi thu 2 figure(2) plot(x,y2,’g-.‘); % Set axis limits and grid lines xlabel('Time') ylabel('Amplitude') legend('Second') title('3 phase_sin plot') % ve do thi thu 3 figure(3) plot(x,y3,’g-.‘); xlabel('Time') ylabel('Amplitude') legend('Third') title('3 phase_sin plot') Đồ thị dạng hoạt cảnh (COMET) Cho phép vẽ đồ thị giống như plot với cách vẽ chậm trên màn hình gây ra hiệu ứng hoạt hình. Có 2 cú pháp: comet(y) : vẽ đồ thị hệ toạ độ xy với thời gian kéo dài 0.1 (giây) comet(x,y) : vẽ đồ thị hệ toạ độ xy với thời gian kéo dài 0.1 comet(x,y,t) : vẽ đồ thị hệ toạ độ xy với thời gian kéo dài t Ví dụ: thay các lệnh vẽ plot ở các ví dụ trên thành lệnh comet. Đồ thị dạng thanh (BAR) bar(y): vẽ đồ thị thanh theo giá trị nằm trong trục y tăng dần theo x. bar(x,y) vẽ đồ thị thanh, mỗi thanh theo giá trị nằm trên trục y tại vị trí chỉ định theo x bar(x,y,’width’,0.5) vẽ đồ thị có đặt thuộc tính chiều rộng thanh Ví dụ: % Bar plot of a bell shaped curve x = -2.9:0.2:2.9; bar(x,exp(-x.*x)); Đồ thị dạng hình tròn theo kiểu phần trăm (PIE). pie(x) cho đồ thị hình pie dưới dạng tỉ lệ phần trăm theo các giá trị của véc tơ thành phần của x. pie(x,tach) tach là véc tơ có giá trị 1/0 để tách/không tách giá trị đồ thị ra khỏi pie (có cùng kích thước với x). pie(x,nhan) nhan là véc tơ kiểu mảng xâu cấu trúc biểu thị nhãn của các giá trị. pie(x,tach,nhan) Ví dụ: x= [1 4 6 7 9] pie(x) Đồ thị trong toạ đồ cực (POLAR): polar(theta,r) vẽ đồ thị quan hệ bán kính r theo góc theta Ví dụ: % Polar plot t=0:0.01:2*pi; polar(t,abs(sin(2*t).*cos(2*t))); Đồ thị theo trục toạ độ logarithm (LOG) semilogx(x,y) vẽ đồ thị với thang đo theo trục x là log10 của x, tương đương plot(log10(x),y) semilogy(x,y) vẽ đồ thị với thang đo theo trục y là log10 của y, tương đương plot(x,log10(y)) loglog(x,y) vẽ đồ thị với thang đo theo trục x và y đều là log10, tương đương plot(log10(x),log10(y)) Ví dụ: x=linspace(0,7,100) y=exp(x) subplot(2,1,1) ; plot(x,y) subplot(2,1,2) ; semilogy(x,y) Ví dụ: tìm nghiệm của phương trình bậc 3 bằng đồ thị x=linspace(-100,100,1000); y=x.^3+2*x.^2+3*x-6; plot(x,y) [r1,r2]=ginput % nghiem phuong trinh trong doan [-100 100] la r1 % kiem ta lai bang lenh roots r=roots([1 2 3 –6]) Lệnh vẽ trong không gian 3-D ** Bao gồm nhiều lệnh phong phú, xin nêu ra một số lệnh tiêu biểu. Chi tiết hãy nghiên cứu phần DEMO/visualization và graphic. Đồ thị dạng đường, điểm plot3 (x,y,z) vẽ đồ thị trong toạ độ xyz theo các giá trị các phần tử các véc tơ plot3 (x,y,z, ‘str’) vẽ đồ thị trong toạ độ xyz theo giá trị các phần tử các véc tơ với định dạng quy định như lệnh plot Đồ thị dạng hoạt cảnh comet3(z) : vẽ đồ thị hệ toạ độ xyz với thời gian kéo dài 0.1 comet3(x,y,z) : vẽ đồ thị hệ toạ độ xyz với thời gian kéo dài 0.1 comet3(x,y,z,t) : vẽ đồ thị hệ toạ độ xyz với thời gian kéo dài t Đồ thị dạng thanh bar3(x,y,z): vẽ đồ thị thanh với mỗi thanh theo giá trị nằm trong trục z tăng dần. Ví dụ: % Bar plot of a bell shaped curve x = -2.9:0.2:2.9; bar3(x,exp(-x.*x),sin(x)); Đồ thị dạng hình tròn theo kiểu phần trăm pie3(x,y,z) cho đồ thị hình pie dưới dạng tỉ lệ phần trăm theo các giá trị của véc tơ. Xem thêm cú pháp ở phần 2D. Đồ thị dạng lưới meshgrid(x,y) tạo mảng xấp xỉ hoá hai chiều trong miền khảo sát mesh(z) vẽ mặt lưới trong không gian 3D Ví dụ: »[X,Y] = meshgrid(-2:.1:2, -2:.1:2); »Z = X .* exp(-X.^2 - Y.^2); »mesh(Z) waterfall(z) tương tự mesh nhưng chỉ vẽ theo một hướng. Đồ thị dạng mặt surf(X,Y,Z,C) tạo bề mặt 3 chiều Xem thêm surfl và surfc. Ví dụ: Vẽ đồ thị lưới của hàm sin(x)/x: » x=linspace(-10,10); » y=x; » [p,q]=meshgrid(x,y); » R=sqrt(p.^2+q.^2)+eps; » z=sin(R)./R; » figure(1); » mesh(z); » figure(2); » waterfall(z); » figure(3); » surf(z); Các thủ tục in ấn và lưu trữ kết quả + Lưu mã nguồn chương trình (dạng m-file, mdl-file của Simulink) 1. Mở và chọn phần chương trình cần copy 2. Copy vào vùng nhớ đệm: Từ menu Edit -> Copy (Ctrl+C) 3. Dán vào báo cáo: Mở báo cáo và chọn Edit -> Paste (Ctrl+V) + Lưu đồ thị kết quả: Chú ý: Đặt tình trạng kết quả đồ thị về dạng wmf-file bằng cách: Từ đồ thị chọn menu:Edit->Copy Options -> Windows Metafile. 1. Copy đồ thị vào bộ nhớ đệm: Menu Edit -> Copy Figure 2. Dán nội dung bộ nhớ đệm vào báo cáo (xem tương tự trên) hoặc 2. Copy đồ thị vào file: (Lưu đồ thị dưới dạng tập tin định kiểu) Menu File-> Export... Sử dụng các nút thanh công cụ để vẽ, ghi chú trên đồ thị sau đó chèn vào báo cáo Các ví dụ và bài tập ** các phương pháp tính và Ứng dỤng Khái niệm Symbolic và giới thiệu về Toolbox Symbolic Khái niệm Symbolic Trong MATLAB cho phép dùng các ký hiệu đại diện (symbolic) cho các biến, tham số hay hàm trong các biểu thức và trong các hàm. Do đó, kết quả sau khi tính toán là một biểu thức theo tham số. Toolbox Symbolic của MATLAB cung cấp các hàm thực hiện các phép tính dưới dạng symbolic. Đây là thư viện của hãng phần mềm Maple (Mỹ). Cách khai báo biến symbolic Để thực hiện tính toán dưới dạng symbolic, cần phải định nghĩa trước các biến, hay tham số bằng một trong 2 cách sau: Cách 1: Dùng khai báo sym. Các ví dụ sau cho thấy các hình thức khai báo: »x = sym('x'); % tạo ra biến x với tên x (khi đó x là biến có thể có giá trị bất kì) »x = sym('x','real'); % tạo ra biến thực x với tên x »k = sym('k','positive'); % tạo ra biến k dương với tên k Cách 2: Khai báo syms: khi cần khai báo các biến có cùng kiểu (mặc nhiên: real). Các ví dụ: »syms x1 x2 x3; % tương đương với 3 lần khai báo »x1 = sym('x1'); »x2 = sym('x2'); »x3 = sym('x3'); »syms x beta real; % tương đương với 2 khai báo »x = sym('x','real'); »beta = sym('beta','real'); Các biến sau khi đã khai báo được phép có mặt trong các biểu thức hay làm tham số cho các hàm. Do đó, các hàm đã dùng trước đây với các biến có giá trị cho trước đều áp dụng được dưới dạng symbolic. Ta xét các ví dụ sau. Ví dụ 1: chương trình một m-file dưới dạng script syms x y real z = x + i*y; % tạo số phức k=x^2; f = x^2 + y^2; % khai báo hàm f(x,y) Ví dụ trên tạo ra: biến z kiểu số phức, biến (hay hàm) k và hàm f có hai biến (thông số) là x và y: f(x,y). Ví dụ 2: Các thao tác với ma trận giải hệ phương trình tuyến tính dạng tham số syms a b c d b1 b2 A = [a b; c d] B=[b1; b2 ] X=inv(A)*B % hoặc X=A\B % kết quả A = [ a, b] [ c, d] B = [ b1] [ b2] X = % nghiem phuong trinh A*X=B [ d/(a*d-c*b)*b1-b/(a*d-c*b)*b2] [ -c/(a*d-c*b)*b1+a/(a*d-c*b)*b2] Các hàm trong Toolbox Symbolic ** findsym Tìm biến đặc trưng gần x nhất trong biểu thức đặc trưng khi không có x subs thay thế biến trong biểu thức đặc trưng double chuyển giá trị của biểu thức đặc trưng thành số class trả về kiểu dữ liểu của biến numden tách tử số và mẫu số của phân thức (đa thức hữu tỉ) Các phép toán đại số + - * / ^ compose kết hợp hai hàm f(y) và g(x) thành hàm hợp f(g(x)) Ví dụ: syms x y z t u; f = 1/(1 + x^2); g = sin(y); h = x^t; p = exp(-y/u); compose(f,g) trả về 1/(1+sin(y)^2) compose(f,g,t) trả về 1/(1+sin(t)^2) compose(h,g,x,z) trả về sin(z)^t compose(h,g,t,z) trả về x^sin(z) compose(h,p,x,y,z) trả về exp(-z/u)^t compose(h,p,t,u,z) trả về x^exp(-y/z) finverse tìm nghịch đảo của một biểu thức Ví dụ: finverse(1/tan(x)) trả về atan(1/x). f = x^2+y; finverse(f,y) trả về -x^2+y. finverse(f) trả về (-y+x)^(1/2) và chú ý phép nghịch đảo không duy nhất symsum tìm tổng đặc trưng của một biểu thức sym2poly chuyển đa thức đặc trưng thành véc tơ hệ số của nó 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 đặc trưng Ví dụ: poly2sym([1 0 -2 -5]) trả về x^3-2*x-5 poly2sym([1 0 -2 -5],'t') và t = sym('t') poly2sym([1 0 -2 -5],t) % cả hai đều trả về t^3-2*t-5 horner đưa đa thức về dạng horner taylor mở rộng chuỗi taylor pretty hiển thị biểu thức đặc trưng tương tự kiểu toán học collect gom tất cả các mục giống nhau factor biểu diễn dưới dạng một đa thức expand mở rộng tất cá các mục simplify đơn giản hoá các biểu thức Ví dụ: »x = sym(‘x’); »f = (x^2-1)*(x-2)*(x-3); »collect(f) ans = x^4 - 5*x^3 + 5*x^2 + 5*x - 6 »horner(ans) ans = -6 + (5 + (5 + (-5 + x)*x)*x)*x »factor(ans) ans = (x-1)*(x-2)*(x-3)*(x+1) »expand(f) ans = x^4 - 5*x^3 + 5*x^2 + 5*x - 6 »syms x y a »simplify(sin(x)^2 + 3*x + cos(x)^2 - 5) ans = -4+3*x »simplify(log(2*x/y)) ans = log(2)+log(x/y) »simplify((-a^2 + 1)/(1 - a)) ans = a + 1 simple tìm biểu thức tương đương có chuỗi ký tự ngắn nhất Cú pháp: simple(S) [R,H] = simple(S) Ví dụ: Nếu sử dụng [R,H] = simple(S) sẽ có tương ứng như sau: S R H cos(x)^2+sin(x)^2 1 combine(trig) 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 collect(x) x^3+3*x^2+3*x+1 (x+1)^3 factor cos(3*acos(x)) 4*x^3-3*x expand syms x y positive log(x) + log(y) log(x*y) combine ezplot vẽ đồ thị hàm đặc trưng Các hàm biến đổi Z, Laplace, Fourier. Đa thức và nội suy Đa thức roots tìm nghiệm của đa thức. Cú pháp: r = roots(p) Trong đó: r: biến chứa kết quả. p: tên biểu thức. Ví dụ: Tìm nghiệm của phương trình: x2-1 =0 »p = [1 0 -1]; »r = roots(p) r = -1.0000 1.0000 poly tạo ra đa thức từ các nghiệm được chỉ định. Cú pháp: p = poly(A) p = poly(r) Trong đó: p = poly(A), A là ma trận nxn với các phần tử là các hệ số của đa thức đặc trưng det (sI-A) (đa thức vế trái phương trình |lI-A|=0), tạo ra vector hàng có n+1 phần tử xếp theo thứ tự giảm dần số mũ của s. Vậy nếu X = roots(P) thì P = poly(X) với P là vectơ. p = poly(r), tạo ra vector hàng với các phần tử là các hệ số của đa thức có nghiệm là các phần tử của vector ngõ ra. Ví dụ 1: Cho ma trận A = 1 2 3 4 5 6 7 8 0 »p = poly (A) p = 1 -6 -72 -27 polyval tính giá trị đa thức Cú pháp: Y = polyval(P,X), Trong đó: P là véc tơ chứa các hệ số của đa thức, X là giá trị của biến. Nếu x là ma trận/véc tơ, sẽ tính cho toàn bộ giá trị trong X. polyvalm tính giá trị đa thức với tham số là ma trận Cú pháp: polyvalm(V,X) Trong đó: V là véc tơ chứa các hệ số của đa thức cần tìm, X là ma trận vuông. residue chuyển đổi giữa dạng khai triển phân số từng phần và dạng đa thức. Cú pháp: [r,p,k]= residue(b,a) [b,a]= residue(r,p,k) Trong đó: [r,p,k]= residue(b,a) tìm giá trị thặng dư, các cực, và các số hạng khai triển phân số từng phần của 2 đa thức b(s) và a(s) dạng: [b,a]= residue(r,p,k) chuyển dạng khai triển phân số từng phần về dạng đa thức với các hệ số trong vector a và b. Ví dụ: Xác định thành phần tối giản của hàm truyền: F(s)= (2s3+9s+1)/(s3+s2+4s+4) a=[1 1 4 4] b=[2 0 9 1] [r,p,k]=residue(b,a) %Kết quả: b = 2 0 9 1 a = 1 1 4 4 r = 0.0000 - 0.2500i 0.0000 + 0.2500i -2.0000 p = -0.0000 + 2.0000i -0.0000 - 2.0000i -1.0000 k = 2 Từ đó hàm truyền tối giản là: 2 + (-2/(s+1)) + (0,25i/(s -j2)) + (-0,25i/(s -j2)) = 2 + (-2/(s+1))+ 1/(s2+4) conv(p1,p2) nhân 2 đa thức p1, p2 thành đa thức tích p1*p2 (rút gọn đa thức) deconv chia hai đa thức. Cú pháp: [q,r] =deconv(a,b) Trong đó: a,b: véc tơ chứa đa thức. q: thương số của a, b. r: số dư (véc tơ có cùng kích thước với a). Cách khai báo: sắp xếp các hệ số theo thứ tự bậc luỹ thừagiảm dần. Ví dụ: Chia 2 đa thức (2x2+3x+6)/(2x+3) »a = [2 3 6]; »b = [2 3]; »[q,r] = deconv (a,b) q = 1 0 r = 0 0 6 polyder tính đạo hàm đa thức Cú pháp: polyder(P) polyder(A,B) Trong đó: P là véc tơ chứa đa thức. A,B véc tơ chứa tích các đa thức A*B Nội suy và xấp xỉ polyfit xấp xỉ bảng số liệu bằng đa thức theo phương pháp bình phương bé nhất Cú pháp: P = polyfit(X,Y,N) Trong đó: X, Y véc tơ chứa dãy số liệu cần xấp xỉ N bậc đa thức cần xấp xỉ P Véc tơ chứa kết quả xấp xỉ đa thức (bậc N) Ví dụ: »x=[1:.1:3]; »y=rand(1,21); »p=polyfit(x,y,3) % bậc N=3 p = -0.3374 2.3974 -5.2936 4.1091 interp1,interp2,interp3,interpn nối điểm theo các phương pháp Tính vi phân (Differentiation) Vi phân số Sử dụng hàm diff để tính vi phân (sai phân) các bậc khác nhau của hàm số bất kỳ. Các cú pháp: diff(X) X: véc tơ, kết quả [X(2)-X(1) X(3)-X(2)...X(n)-X(n-1)]. diff(X) X: ma trận, kết quả ma trận hàng [X(2:n,:) - X(1:n-1,:)]. diff(X,N) vi phân bậc N theo t diff(X,N,DIM) vi phân bậc N theo hướng DIM. 1: cột, 2: hàng. (Nếu N >= size(X,DIM), DIFF trả về ma trận rỗng). Ví dụ: »h = .001; x = 0:h:pi; »diff(sin(x.^2))/h xấp xỉ đến 2*cos(x.^2).*x »diff((1:10).^2) có kết quả là 3:2:19 Nếu X = [3 7 5 4 8 0 9 2 6 3 1 6 2 8 7 4 2 8 6 9 3 4 0 8 6] »diff(X,1,1) ans = -3 2 -3 2 -5 1 -3 0 2 4 3 -4 6 -2 2 -1 2 -8 2 -3 »diff(X,1,2) ans = 4 -2 -1 4 9 -7 4 -3 5 -4 6 -1 -2 6 -2 3 1 -4 8 -2 »diff(X,2,1) ans = 4 -5 3 0 9 2 -1 6 -4 -2 -4 6 -14 4 -5 »diff(X,2,2) ans = -6 1 5 -16 11 -7 -9 10 -7 8 -8 5 -5 12 -10 »diff(X,3,1) ans = -2 4 3 -4 -11 -6 7 -20 8 -3 »diff(X,3,2) ans = 7 4 27 -18 19 -17 -16 13 17 -22 »diff(X,3,3) trả về ma trận rỗng do mảng chỉ có 2 chiều Sử dụng symbolic Trong symbolic, cũng dùng hàm diff tính vi phân hàm số bất kỳ. Cú pháp: diff(s) vi phân hàm s đối với một biến độc lập được xác định bởi hàm findsym diff(s,’v’) hoặc diff(s,sym(‘v’)) vi phân hàm s đối với biến v diff(s,n) vi phân bậc n theo thời gian , với n là số nguyên diff(s,’v’,n) hoặc diff(s,n,’v’) vi phân bậc n của s theo biến v Xét các ví dụ sau: Ví dụ 1: »x = sym(‘x’); »t = sym(‘t’); »syms a b »df=diff(sin(x^2)) df= 2*cos(x^2)*x »d6f=diff(t^6,6) % đạo hàm bậc 6 d6f = 720 »f= exp(a*x + b) »diff(f,x); % đạo hàm f theo x »diff(f,a); đạo hàm f theo a »diff(f,b,2) % đạo hàm bậc 2 f theo b Đối với một hàm, A là một vec tơ/ma trận thì diff(A) sẽ vi phân cho từng phần tử. Ví dụ 2: »syms a x »A = [cos(a*x) sin(a*x) ; –sin(a*x) cos(a*x)] A = [ cos(a*x) sin(a*x)] [ –sin(a*x) cos(a*x)] »dy = diff(A) dy = [ –sin(a*x)*a cos(a*x)*a] [ –cos(a*x)*a –sin(a*x)*a] Tính tích phân (Integration) Tích phân số trap tính tích phân số theo phương pháp hình thang Cú pháp: Z = trapz(Y) Z = trapz(X,Y) Z = trapz(X,Y,DIM) hoặc trapz(Y,DIM) Trong đó: Y là véc tơ/ma trận hoặc hàm cần tính tích phân. Nếu Y là ma trận thì tính cho cột. X véc tơ chỉ vùng cận lấy tích phân (có cùng kích thước với Y) DIM hướng lấy tích phân (DIM = 1 hoặc 2) Ví dụ: Nếu Y = [0 1 2 3 4 5] thì trapz(Y,1) là [1.5 2.5 3.5] và trapz(Y,2) là [ 2 8 ]; quad tính tích phân số theo phương pháp thích nghi cầu phương của Simpson sử dụng đệ quy. Cú pháp: Q = quad(FUN,A,B) Q = quad(FUN,A,B,TOL) [Q,FCNT] = quad(...) quad(FUN,A,B,TOL,TRACE) quad(FUN,A,B,TOL,TRACE,P1,P2,...) Trong đó: FUN hàm cần tính tích phân dạng Y = FUN(X), nếu X là véc tơ thì Y cũng véc tơ. Nếu hàm .m file thì thêm @ trước tên hàm. A, B cận lấy tích phân (lớn hơn 1.e-6) TOL Bước tăng của cận (mặc nhiên là 1.e-3 hoặc 1.e-6 với MATLAB 6.0). TRACE khác 0 hiển thị giá trị [fcnt a b-a Q]. P1,P2,... các tham số của hàm (nếu có) Ví dụ: Q = quad('1./(x.^3-2*x-5)',0,2); F = inline('1./(x.^3-2*x-5)'); Q = quad(F,0,2); Q = quad(@myfun,0,2); với myfun.m là M-file: function y = myfun(x) y = 1./(x.^3-2*x-5); quad8 tích phân số có kết quả chính xác hơn quad và thực hiện nhanh hơn quadl tích phân số theo phương pháp thích nghi cầu phương của Lobatto Sử dụng Symbolic Gọi f là một hàm trong symbolic thì : int(f) tích phân bất định của hàm f theo một biến độc lập ngầm định int(f,x) tích phân bất định của hàm f theo biến độc lập x int(f,a,b) tích phân xác định của hàm f theo biến độc lập trong khoảng [a b] int(f,x,a,b) tích phân xác định của hàm f theo biến độc lập x trong khoảng [a b] Ví dụ: syms x x1 alpha u t; A = [cos(x*t),sin(x*t);-sin(x*t),cos(x*t)]; int(1/(1+x^2)) trả về atan(x) int(sin(alpha*u),alpha) trả về -cos(alpha*u)/u int(besselj(1,x),x) trả về -besselj(0,x) int(x1*log(1+x1),0,1) trả về 1/4 int(4*x*t,x,2,sin(t)) trả về 2*sin(t)^2*t-8*t int([exp(t),exp(alpha*t)]) trả về [exp(t), 1/alpha*exp(alpha*t)] int(A,t) trả về [sin(x*t)/x, -cos(x*t)/x] [cos(x*t)/x, sin(x*t)/x] Giải các phương trình và hệ phương trình Phương pháp số Phương trình dạng đa thức: Xem phần đa thức (hàm ROOTS). Phương trình dạng hàm toán học: Sử dụng hàm FZERO Hệ phương trình: Xem các phép toán đa thức, ma trận, hàm INV. Sử dụng Symbolic ** Dùng hàm solve trong toolbox symbolic Cú pháp: (có 3 dạng) solve(‘eqn1’,’eqn2’,...,’eqnN’) solve(‘eqn1’,’eqn2’,...,’eqnN’,’var1,var2,...,varN’) solve(‘eqn1’,’eqn2’,...,’eqnN’,’var1’,’var2’,...’varN’) Trong đó: eqns là các xâu phương trình. vars là các biến symbolic. Ví dụ: »solve(‘p*sin(x) = r’); % sẽ tự chọn biến là ‘x’ và kết quả ans = asin(r/p) »[x,y] = solve(‘x^2 + x*y + y = 3’,’x^2 - 4*x + 3 = 0’) % kết quả là x = [ 1] [ 3] y = [ 1] [ -3/2] »S = solve(‘x^2*y^2 -2*x- 1=0’,’x^2 - y^2 - 1=0’) % sẽ trả về cấu trúc S = x: [8x1 sym] y: [8x1 sym] »[u,v] = solve(‘a*u^2 + v^2 = 0’,’u - v = 1’) % sẽ xem ‘a’ là tham số và hai biến u và v. »S = solve(‘a*u^2 + v^2’,’u - v = 1’,’a,u’) % sẽ xem ‘v’ là tham số, kết quả là S.a và S.u. »[a,u,v] = solve(‘a*u^2 + v^2’,’u - v = 1’,’a^2 - 5*a + 6’) % có ba phương trình cho ba biến a, u và v. »syms a b c x »S = a*x^2 + b*x + c; »solve(S) ans = [1/2/a*(–b+(b^2–4*a*c)^(1/2))] [1/2/a*(–b–(b^2–4*a*c)^(1/2))] »b = solve(S,b) b = –(a*x^2+c)/x Xác định nghiệm và vẽ »syms x »s = solve(tan(x)+sin(x)–2); »X = double(s) X = 0.8863 –1.8979 2.0766– 1.5151i 2.0766+ 1.5151i »ezplot(tan(x)+sin(x)–2) »hold on »w = –2*pi:pi/2:2*pi; »plot(w,0*w,’r-.’); % vẽ điểm trên màn hình »RX = [X(1), X(2)] »plot(RX, 0*RX,’gO’) »text(–1.8,–0.4,’X(2)’) »text(1.0,–0.4,’X(1)’) Ví dụ: Tiếp ví dụ trên »f = cos(2*x) + sin(x) – 1; »s = solve(f); % plotting s and f, using »ezplot(f) »hold on; »plot(w,0*w,’r-.’) »plot(double(s),0*double(s),’gO’) Giải phương trình vi phân và hệ phương trình vi phân Phương pháp số: Dùng các hàm ODE45, ODE23, ODE113 ode45 giải phương trình và hệ phương trình vi phân bậc cao. Cú pháp: [T,Y] = ode45(ODEFUN,TSPAN,Y0) [T,Y] = ode45(ODEFUN,TSPAN,Y0,OPTIONS) [T,Y] = ode45(ODEFUN,TSPAN,Y0,OPTIONS,P1,P2...) Trong đó: TSPAN = [T0 TFINAL] khoảng lấy tích phân của phương trình vi phân y' = f(t,y) hoặc hệ phương trình vi phân M(t,y)*y' = f(t,y) với M là ma trận. TSPAN = [T0 T1 ... TFINAL] có thể là véc tơ (luôn tăng hoặc luôn giảm). Y0 giá trị khởi đầu (tại t = T0) ODEFUN(T,Y) xâu tên hàm trả về véc tơ cột f(t,y0). Nếu hàm .m file thì thêm @. Y mảng lưu kết quả (theo hàng) T véc tơ cột chỉ các thời điểm t. OPTIONS các giá trị tình trạng (xem thêm hàm ODESET). Giá trị mặc định gồm sai lệch liên kết 'RelTol' = 1e-3 và véc tơ sai lệch tuyệt đối 'AbsTol' = 1e-6 (tất cả các thành phần). Nếu không thì OPTIONS=[]. P1, P2, ... các tham số của hàm ODEFUN(T,Y,P1,P2,...) nếu có. Ví dụ: »[t,y]=ode45(@vdp1,[0 20],[2 0]); »plot(t,y(:,1)); ode23 giải các phương trình và hệ phương trình vi phân. ode113 giải các phương trình và hệ phương trình vi phân. Sử dụng symbolic ** Dùng hàm dsolve trong toolbox symbolic Cú pháp: dsolve('eqn1','eqn2', ...) Trong đó: ‘eqn1’,’eqn2’,... các phương trình vi phân. Cách biểu diễn hàm dựa trên cú pháp D: Dy biểu diễn đạo hàm bậc 1 của hàm y (mặc nhiên) D2y, D3y, ..., DNy đạo hàm bậc 2,3, ..., N của hàm y (không được dùng t) Vậy ký hiệu: D2y biểu diễn của d 2 y//dt 2; Dy là biểu diễn của dy/dt Biến độc lập mặc nhiên là 't'. Nếu muốn thay đổi biến độc lập phải thêm tên biến đó vào cuối cùng của biểu diễn hàm (không được dùng tên D). Các điều kiện đầu cũng ở dạng phương trình như là 'y(a)=b' hoặc 'Dy(a) = b' với y là biến độc lập và a, b là các hằng số. Nếu thiếu điều kiện đầu thì các hằng số tích phân mặc nhiên thêm vào C1, C2, ... Với hệ phương trình vi phân, kết quả (nghiệm) là một cấu trúc. Ví dụ 1: »dsolve('Dx = -a*x') ans = exp(-a*t)*C1 »x = dsolve('Dx = -a*x','x(0) = 1','s') x = exp(-a*s) »y = dsolve('(Dy)^2 + y^2 = 1','y(0) = 0') y = [ sin(t)] [ -sin(t)] »S=dsolve('Df=f+g','Dg=-f+g','f(0)=1','g(0)=2') % trả về cấu trúc S 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)') % Kết quả Y = t+1/y-log(y)+log(-1+y)+C1=0 Ví dụ 2: phương trình vi phân bậc 1: »y = dsolve('Dy= y0*y') % giai phuong trinh dy/dt=y0*y %ket qua y= C1*exp(y0*t) Chú ý: phương trình sau cho kết quả khác »y = dsolve(‘Dyt= y0*y’) % giai phuong trinh dy/dt=y0*y % ket qua y= y0*y*t+C1 Ví dụ 3: giải hệ phương trình vi phân đơn giản »[u,v] = dsolve('Du = v', 'Dv = u') u = 1/2*C1*exp(t)-1/2*C1*exp(-t)+1/2*C2*exp(-t)+1/2*C2*exp(t) v = 1/2*C1*exp(-t)+1/2*C1*exp(t)+1/2*C2*exp(t)-1/2*C2*exp(-t) Ví dụ 4: hệ pt vi phân 3 ẩn với kết quả dạng cấu trúc với 3 ẩn f, g, h »S = dsolve('Df=g','Dg=h','Dh=-f') S = f: [1x1 sym] g: [1x1 sym] h: [1x1 sym] Để hiển thị giá trị lệnh dạng cấu trúc, ta dùng cách gọi S.f để biểu diễn nghiệm f, tương tự với các nghiệm S.g, S.h. »S.h ans = -1/3*C1*3^(1/2)*exp(1/2*t)*sin(1/2*t*3^(1/2))-1/3*C1*exp(1/2*t)*cos(1/2*t*3^(1/2))+1/3*C1*exp(-t)-1/3*C2*3^(1/2)*exp(1/2*t)*sin(1/2*t*3^(1/2))+1/3*C2*exp(1/2*t)*cos(1/2*t*3^(1/2))-1/3*C2*exp(-t)+1/3*C3*exp(-t)+2/3*C3*exp(1/2*t)*cos(1/2*t*3^(1/2)) Các ví dụ ứng dụng ** Giải phương trình vi phân với điều kiện đầu d3u/dx3 =u u(0) = 1, u'(0) = –1, u''(0) = pi Ta có câu lệnh: »u = dsolve('D3u=u','u(0)=1','Du(0)=–1','D2u(0) = pi','x') Giải hệ phương trình vi phân có điều kiện đầu [f,g] = dsolve('Df=3*f+4*g, Dg =–4*f+3*g', 'f(0) = 0, g(0) = 1') dsolve('Df = f + sin(t)', 'f(pi/2) = 0') dsolve('D2y = -a^2*y', 'y(0) = 1, Dy(pi/a) = 0') S = dsolve('Dx = y', 'Dy = -x', 'x(0)=0', 'y(0)=1') S = dsolve('Du=v, Dv=w, Dw=-u','u(0)=0, v(0)=0, w(0)=1') w = dsolve('D3w = -w','w(0)=1, Dw(0)=0, D2w(0)=0') y = dsolve('D2y = sin(y)'); pretty(y) LẬp trình trỰc quan giao diỆn ngưỜi dùng (GUI: Graphic User Interface) GUI là công cụ để lập các giao diện đồ hoạ người dùng trực quan “VISUAL”, giúp lập trình viên tạo các nút bấm, Menu điều khiển chương trình theo hướng sự kiện. Cách xây dựng các nút ấn và menu Phương pháp sử dụng UIMENU và UICONTROL Viết một m-file trong đó sử dụng các lệnh uimenu để tạo ra menu và lệnh uicontrol để tạo ra các nút ấn cũng như các đối tượng giao diện khác. Cách này có nhược điểm là người sử dụng phải tốn nhiều công sức để truyền các thuộc tính đối tượng bằng dòng lệnh nên yêu cầu lập trình viên phải thành thạo. Ví dụ: Muốn tạo ra nút bấm có tên plot với lệnh Callback là plot(x,y) uicontrol('Style','pushbutton', ... 'String','Plot', ... 'Callback','plot(x,y)', ... 'Units','point', ... 'Position',[50 65 75 35]) Lệnh uicontrol tạo giao diện điều khiển người dùng. Cú pháp: uicontrol('PropertyName1',value1,'PropertyName2,'value2,...) tạo giao diện điều khiển người dùng trong cửa sổ hình vẽ hiện tại và trả về một handle. uicontrol(FIG,...) tạo giao diện điều khiển người dùng trong cửa sổ hình vẽ (FIG). Các properties có thể thiết lập cặp tham số PropertyName/PropertyValue cho đối tượng hoặc được thay đổi sau đó bằng lệnh SET. Lệnh get(H) lấy danh sách và giá trị các thuộc tính của đối tượng (H) trong UICONTROL. Lệnh set(H) đặt danh sách và giá trị các thuộc tính của đối tượng (H) trong UICONTROL. Lệnh uimenu tạo giao diện menu người dùng. Cú pháp: uimenu('PropertyName1',value1,'PropertyName2',value2,...) tạo một menu trên thanh menu bar tại đỉnh trên của cửa sổ hiện tại, và trả về handle. uimenu(H,...) tạo một đối tượng menu mới với H là đối tượng cha ‘Parent’. H có thể là figure handle, menu handle, hoặc context menu handle. Nếu H là figure handle, UIMENU tạo menu trên menu bar tại đỉnh của cửa sổ. Nếu H là handle menu trên menu bar, một menu item mới đổ xuống trên menu bar. Nếu H là context menu, sẽ tạo ra menu item trên context menu. Các properties có thể thiết lập cặp tham số PropertyName/PropertyValue cho đối tượng hoặc được thay đổi sau đó bằng lệnh SET. Lệnh get(H) lấy danh sách và giá trị các thuộc tính của đối tượng (H) trong UIMENU. Lệnh set(H) đặt danh sách và giá trị các thuộc tính của đối tượng (H) trong UIMENU. Phương pháp sử dụng GUIDE (GUI design) Sử dụng tiện ích có sẵn mà MATLAB cung cấp. Đó là chương trình GUIDE (GUI design). GUIDE cung cấp cho lập trình viên một giao diện trực quan gồm các nút chức năng (ví dụ: nút bấm Push, văn bản tĩnh text, dữ liệu nhập edit, nút chọn radio, nút kiểm check, ... như hình 5.1) và giao diện Menu Editor trên cửa sổ figure để thiết kế giao diện vào ra như hình 5.4 và từ đó tạo các cấu trúc chương trình, gọi các lệnh, hàm (chương trình con) giải quyết các bài toán đặt ra theo yêu cầu. Sau khi tạo xong, ngôn ngữ sẽ tự động sinh ra mã nguồn (m-file) tương ứng với từng thao tác (như ta viết lệnh theo cách 1). Ngoài ra, phương pháp còn tạo ra một file *.mat để lưu cấu hình giao diện. Để thực hiện, tại dấu nhắc lệnh MATLAB gõ lệnh: nút công cụ soạn và đặt thuộc tính Danh sách các figure và tình trạng activated,controlled Các đối tượng tạo giao diện vào - ra trong cửa số figure »guide % ta có các cửa sổ giao diện như sau: Hình 5.1 Cửa sổ giao diện người dùng trực quan Trong cửa sổ này có các công cụ để thiết kế menu, các nút bấm, soạn và đặt thuộc tính, canh lề các nút bấm, đặt chế độ kiểm tra trực tiếp công việc thiết kế, bổ sung thêm các figure vào thiết kế, ... - Cửa sổ Graphics Property Editor soạn thảo các thuộc tính các đối tượng như hình 5.2. Danh sách đối tượng kiểu các thuộc tính Các thuộc tính giá trị Hình 5.2 Cửa sổ soạn thảo thuộc tính Cửa sổ Guide Callback Editor soạn thảo các hàm/ thực hiện các lệnh như hình 5.3. Hiển thị các kiểu đối tượng Vùng soạn, sửa Callback Kiểu đối tượng Hình 5.3 Cửa sổ soạn thảo Callback - Cửa sổ Guide Menu Editor soạn thảo các hàm hoặc thực hiện các lệnh như hình 5.3. Liệt kê các đối tượng (Object) Hình 5.4 Cửa sổ soạn thảo Menu Cách lập trình trên giao diện GUI Giả sử ta cần lập trình giao diện như hình 5.5 với nút PLOT1 vẽ đặc tính đồ thị áp sin tuỳ thuộc vào tuỳ chọn trong poupmeu là 1 pha, 2 pha hay 3 pha. Các bước như sau: Bước1: Trên cửa sổ figure mới, tạo các đối tượng bằng phương pháp kéo và thả. Gán các thuộc tính như sau: PLOT1: có thuộc tính String: ‘PLOT1’ , Tag : ‘plot1’ Callback: (Đoạn chương trình sau) x=linspace(0,3*pi,1000); y1=sin(x); y2=sin(x-2*pi/3); y3=sin(x+2*pi/3); % Lay thuoc tinh chon trong popupmenu handle_chon=findobj(gcbf,'Tag','chon'); % lay thuoc tinh Value cua chon hang=get(handle_chon,'Value') % ve do thi theo tinh huong grid on if hang==1 plot(x,y1,'b-') elseif hang==2 plot(x,y1,'b-',x,y2,'r-.') elseif hang==3 plot(x,y1,'b-',x,y2,'r-.',x,y3,'k:') end khối ‘xoa do thi’ có: ‘Tag’ : ‘xoá’ ‘String’ : ‘xoa do thi’ ‘Callback’ : ‘cla’ khối ‘close’ có: ‘String’: ‘close’ ‘Callback’ : ‘close’ Khối poupmenu có: Hình 5.5 giao diện lập trình vẽ đồ thị. ‘Tag’ : ‘chon’ ‘String’ : ‘1 pha|2 pha|3 pha’ Bước 2: Lưu chương trình (Save figure), đặt chương trình ở chế độ Active để chạy kiểm tra kết quả. Nếu bị lỗi thì đặt lại ở chế độ Controlled để chỉnh sửa. Nếu muồn sửa đổi chương trình có sẵn, thì gọi tên chương trình để chạy, sau đó đặt nó ở chế độ Controlled trong cửa sổ GUIDE để chỉnh sửa. Chú ý: Để đảm bảo xem được mã Callback, nên đặt mỗi Callback là một hàm hay script dưới dạng *.m file. Ngoài ra, người ta hay dùng phương thức lập trình sự kiện để truyền tham số cho chương trình thông qua lời gọi hàm Callback ứng với mỗi sự kiện. Phương thức lập trình sự kiện thông qua truyền tham số “Action” Khái niệm function mygui(action) switch(action) case 'load', ...... case 'plot' ....... case 'close', close(gcbf) end VD: ta cần lập chương trình với yêu cầu sau (hình 5.6): Hình 5.6 mô tả phương pháp lập trình sự kiện. Với phương thức trên, ta cần mở cửa sổ soạn thảo và sửa lại đầu chương trình đoạn mã trên. Với các lệnh cho mỗi Callback được đặt vào giữa các lệnh CASE ... (nên dùng hàm hay script cho mỗi đoạn chương trình nếu chương trình dài). Đây là phương thức lập trình sáng sủa nhất và tiện lợi nhất. Ghi chú quan trọng Để tương tác giữa các đối tượng, ta cần đặt và lấy thuộc tính các đối tượng. Để thực hiện ta dùng các hàm sau: Lấy thuộc tính đối tượng dùng hàm get theo cú pháp y = get(,’Tên thuộc tính’): Trả về giá trị thuộc tính cho biến y. Để lấy biến handle, ta dung hàm findobj có cấu trúc sau: Handle_bien = findobj(gcbf,’ten thuoc tinh’,’gia tri thuoc tinh’) : hàm này tìm một đối tượng có ‘ten thuoc tinh’ ứng với ‘gia tri thuoc tính’ chỉ ra và kết quả trả về biến Handle quản lý đối tượng Ví dụ 1: »handle_chon = findobj(gcbf,'Tag','chon'); »hang = get(handle_chon,'Value') Ví dụ trên tìm đối tượng có thuộc tính ’Tag’=’chon’, nhờ đó ta mới lấy được thuộc tính ‘Value’ của nó. Ví dụ 2: lấy thuộc tính string của đối tượng EditText1 »EditHandle = findobj(gcbf,'Tag','EditText1'); »ZString = get(EditHandle,'String'); Đặt thuộc tính cho các đối tượng: dùng hàm SET Cú pháp: set(,’tên thuộc tính’,’giá trị thuộc tính’) : gán thuộc tính đổi tượng được quản lý bởi biến Handle cho một giá trị. Ví dụ: »EditHandle = findobj(gcbf,'Tag','EditText1'); »str = ’1 pha|2 pha|3 pha’; »set(EditHandle,'String',str); Một số hàm thường dùng quản lý đối tượng gcf lấy giá trị handle của figure hiện hành gcbo lấy giá trị handle của object Callback hiện hành gcbf lấy giá trị handle callback của figure hiện hành gca lấy giá trị handle của đồ thị (axes) hiện hành gco lấy giá trị handle của object hiện hành Ví dụ ứng dụng Mã chương trình *.m file cho chương trình ở ví dụ trên khi viết chương trình theo kiểu dùng tham số action function fig = actiongui(action) % This is the machine-generated representation of a Handle Graphics object % and its children. Note that handle values may change when these objects % are re-created. This may cause problems with any callbacks written to % depend on the value of the handle at the time the object was saved. % This problem is solved by saving the output as a FIG-file. % % To reopen this object, just type the name of the M-file at the MATLAB % prompt. The M-file and its associated MAT-file must be on your path. % % NOTE: certain newer features in MATLAB may not have been saved in this % M-file due to limitations of this format, which has been superseded by % FIG-files. Figures which have been annotated using the plot editor tools % are incompatible with the M-file/MAT-file format, and should be saved as % FIG-files. load actiongui if nargin < 1, action = 'initialize'; end; if strcmp(action,'initialize') ; h0 = figure('Color',[0.8 0.8 0.8], ... 'Colormap',mat0, ... 'FileName','D:\MATLABR11\work\actiongui.m', ... 'PaperPosition',[18 180 576 432], ... 'PaperUnits','points', ... 'Position',[255 39 508 420], ... 'Tag','Fig1', ... 'ToolBar','none'); h1 = uimenu('Parent',h0, ... 'Label','Plot', ... 'Tag','Plot1'); h2 = uimenu('Parent',h1, ... 'Label','plot1', ... 'Tag','Plotplot11'); h2 = uimenu('Parent',h1, ... 'Callback',mat1, ... 'Label','plot2', ... 'Tag','Plotplot21'); h1 = uicontrol('Parent',h0, ... 'Units','points', ... 'BackgroundColor',[1 0.501960784313725 1], ... 'Callback','actiongui plotting', ... 'ListboxTop',0, ... 'Position',[288 246 45 21.75], ... 'String','PLOT1', ... 'Tag','plot1'); h1 = axes('Parent',h0, ... 'Box','on', ... 'CameraUpVector',[0 1 0], ... 'CameraUpVectorMode','manual', ... 'Color',[1 1 1], ... 'ColorOrder',mat2, ... 'NextPlot','add', ... 'Position',mat3, ... 'Tag','Axes1', ... 'XColor',[0 0 0], ... 'XGrid','on', ... 'YColor',[0 0 0], ... 'YGrid','on', ... 'ZColor',[0 0 0], ... 'ZGrid','on'); h2 = text('Parent',h1, ... 'Color',[0 0 0], ... 'HandleVisibility','off', ... 'HorizontalAlignment','center', ... 'Position',[0.4983606557377049 -0.06760563380281681 9.160254037844386], ... 'Tag','Axes1Text4', ... 'VerticalAlignment','cap'); set(get(h2,'Parent'),'XLabel',h2); h2 = text('Parent',h1, ... 'Color',[0 0 0], ... 'HandleVisibility','off', ... 'HorizontalAlignment','center', ... 'Position',[-0.09508196721311477 0.4957746478873241 9.160254037844386], ... 'Rotation',90, ... 'Tag','Axes1Text3', ... 'VerticalAlignment','baseline'); set(get(h2,'Parent'),'YLabel',h2); h2 = text('Parent',h1, ... 'Color',[0 0 0], ... 'HandleVisibility','off', ... 'HorizontalAlignment','right', ... 'Position',[-0.1278688524590164 1.047887323943662 9.160254037844386], ... 'Tag','Axes1Text2', ... 'Visible','off'); set(get(h2,'Parent'),'ZLabel',h2); h2 = text('Parent',h1, ... 'Color',[0 0 0], ... 'HandleVisibility','off', ... 'HorizontalAlignment','center', ... 'Position',[0.4983606557377049 1.019718309859155 9.160254037844386], ... 'Tag','Axes1Text1', ... 'VerticalAlignment','bottom'); set(get(h2,'Parent'),'Title',h2); h1 = uicontrol('Parent',h0, ... 'Units','points', ... 'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ... 'ListboxTop',0, ... 'Position',[291 183 45 20.25], ... 'String',['1 pha';'2 pha';'3pha ';' '], ... 'Style','popupmenu', ... 'Tag','chon', ... 'Value',3); h1 = uicontrol('Parent',h0, ... 'Units','points', ... 'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ... 'ListboxTop',0, ... 'Position',[291 206.25 45 15], ... 'String','Popupmenu', ... 'Style','text', ... 'Tag','StaticText1'); h1 = uicontrol('Parent',h0, ... 'Units','points', ... 'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ... 'Callback','actiongui dong', ... 'ListboxTop',0, ... 'Position',[299.25 36.75 45.75 16.5], ... 'String','close', ... 'Tag','Pushbutton3'); h1 = uicontrol('Parent',h0, ... 'Units','points', ... 'BackgroundColor',[0.752941176470588 0.752941176470588 0.752941176470588], ... 'Callback','actiongui xoa', ... 'ListboxTop',0, ... 'Position',[298.5 76.5 51.75 21.75], ... 'String','xoa do thi', ... 'Tag','xoa'); %set(h0, 'Visible','on'); else switch action case 'dong' close(gcbf) case 'xoa' cla case 'plotting' x=linspace(0,3*pi,1000); y1=sin(x); y2=sin(x-2*pi/3); y3=sin(x+2*pi/3); % Lay thuoc tinh chon trong popupmenu handle_chon=findobj(gcbf,'Tag','chon'); % lay thuoc tinh Value cua chon hang=get(handle_chon,'Value') % ve do thi theo tinh huong grid on if hang==1 plot(x,y1,'b-') elseif hang==2 plot(x,y1,'b-',x,y2,'r-.') elseif hang==3 plot(x,y1,'b-',x,y2,'r-.',x,y3,'k:') end end end mô phỎng, thiẾt kẾ trỰc quan (SIMULINK) Tổng quan về SIMULINK SIMULINK (Simulation and Link): là một tiện ích quan trọng của MATLAB giúp cho người sử dụng mô phỏng, phân tích và thiết kế các hệ thống thực tế cho các đối tượng liên tục, gián đoạn tuyến tính hay phi tuyến và cả các hệ sự kiện logic (ví dụ như một quá trình sản xuất)... Nguyên tắc làm việc chung của SIMULINK là xây dựng mô hình sơ đồ khối từ các khối mô đun chức năng tạo sẵn bằng thao tác “nhấn” và “thả” chuột các khối vào cửa sổ thiết kế, sau đó kết nối các khối và khai báo tham số cho phù hợp. Bước tiếp theo là chạy kết quả, phân tích, hiệu chỉnh để có kết quả mong muốn. SIMULINK cho phép giao diện với MATLAB thông qua một số khối. Các kết quả trả lại trong không gian Workspace để chương trình MATLAB lấy và xử lý. Trong SIMULINK còn cho phép đưa các dòng lệnh MATLAB hoặc các biểu thức toán học vào ngay trong sơ đồ SIMULINK. Như vậy công cụ SIMULINK giúp cho người lập trình tiết kiệm nhiều thời gian và công sức vì nó tự động liên kết, biến đổi để chuyển thành các hệ phương trình vi phân tính toán ngầm trong môi trường MATLAB mà người lập trình không cần quan tâm. Vì vậy, để mô phỏng một quá trình thực tế có thể tính toán bằng hai cách: hoặc viết các dãy lệnh MATLAB (*. m file) hay lập mô hình tính toán trong SIMULINK. Cách đầu có ưu điểm là chạy nhanh nhưng vất vả cho người lập trình nhất là đối với các hệ phức tạp. Cách sau có ưu điểm là rất trực quan sinh động, dễ tư duy tiện lợi, nhất là đối với hệ thống lớn. Nhược điểm là chạy chậm. Tuy nhiên, theo quan niệm lập trình nâng cao, nên kết hợp hai phần trên trong một dự án (project) để thực hiện nhiều công việc khác nhau. Khởi động SIMULINK Khởi động SIMULINK hiển thị thư viện các nhóm chức năng bằng cách gõ lệnh: »similink3 Hình 1. Thư viện SIMULINK 3 Khởi động SIMULINK hiển thị thư viện chi tiết bằng cách gõ lệnh: »similink Giới thiệu thư viện SIMULINK Hình 2. Thư viện các thành phần SIMULINK Cửa sổ tìm kiếm: nhập tên khối và enter. Chương trình sẽ tìm khối cần tìm. Kích chuột vào dấu + mỗi khối sẽ liệt kê các phần tử cần sử dụng Hình 3. Thư viện chi tiết SIMULINK các khối để mô phỏng hệ liên tục các khối để mô phỏng hệ gián đoạn khối logic AND, OR, NAND,... Khối khuyếch đại các khối dành cho quan sát đặc tính ra tạo ra hệ con bao gồm các khối. Một hệ thống lớn được xây dựng bằng nhiều hệ thống con Thư viện simulink bổ sung Sources: gồm các khối tạo ra các dạng nguồn phát khác nhau Tạo ra tín hiệu step (hàm 1(t)) dùng làm tín hiệu đặt trong các hệ điều khiển tự động tạo ra các giá trị thời gian theo bước lấy mẫu tạo ra các nguồn xung chuẩn khác nhau Thư viện NCD blocksets : gồm 3 khối phục vụ thiết kế hệ phi tuyến Thư viện Power system Blockset *. Giới thiệu chi tiết một số khối thường dùng - Khối không gian trạng thái - khối hàm truyền các khối hệ gián đoạn - Các khối tạo hàm - Khối hàm trong MATLAB - Một số khối trong Power System Blockset Cách xây dựng một chương trình SIMULINK Xét một số ví dụ sau: Ví dụ 1: xây dựng mô hình hệ điều khiển PID tương tự. Trong ví dụ trên, sử dụng khối PID là khối điều khiển theo luật PID dạng hàm truyền: WPID(s)= P+I/s+D.s, đó là hàm truyền của đối tượng là khối Transfer Fcn. Các bước thực hiện như sau: Bước 1: Rê và thả các khối cần xây dựng mô hình từ các thư viện SIMULINK. Nếu có các khối giống nhau cần xây dựng trong một mô hình thì dùng lệnh COPY và PAST (dán) để tạo nhanh các khối, có thể copy từ một mô hình khác. Có thể sử dụng Menu Format của SIMULINK để định dạng mô hình như: Chọn lại font, màu sắc, nét vẽ, quay khối (rotate), ... Bước 2: Nhập thông số hợp lý cho các khối bằng cách kích đúp chuột lên đối tượng khối sau đó nhập các tham số từ cửa sổ hội thoại. Bước 3: Chú thích các dòng text lên đối tượng như hình trên. Bước 4: Khai báo các lựa chọn tham số trong Menu Simulation -> parametter... để chọn các tham số tính toán mô phỏng. (xem hình trang sau). Bước 5: Chạy chương trình bằng cách chọn nút Run trên thanh công cụ hoặc chọn Menu Simulation ->Run Quan sát kết quả đánh giá và hiệu chỉnh tham số sau mỗi lần chạy. Các chú ý: + Muốn vẽ nhiều đồ thị trên một trục toạ độ, phải sử dụng khối ghép kênh (MUX) trước khi cho tín hiệu đến bộ quan sát. Nếu dùng khối To Workspace thì sau khi chạy xong ta nhận được biến out là biến toàn cục trong không gian Workspace của MATLAB. (biến out sẽ là biến toàn cục trong bộ nhớ). Lúc này để vẽ được nhiều đồ thị trên một hệ toạ độ, ta dùng hàm plot như sau: plot(out(:,1), out(:,2),out(:,1), out(:,3)...) sẽ vẽ nhiều đồ thị biến đổi theo thời gian trên chung 1 trục toạ độ. + Chương trình chạy đến hết thời gian (stop time) thì tự động ngừng. Để chương trình dừng trước khi kết thúc, ấn nút STOP trên thanh công cụ (hoặc Menu Simulation -> Stop). Có thể ấn nút tạm dừng (PAUSE) để chương trình tạm nghỉ và sau đó chạy lại tiếp tục từ bước trước khi dừng. + Đối với hệ thống lớn, có thể Module hoá chương trình bằng cách sử dụng khối SUBSYSTEM để chứa nhóm khối chức năng lại với nhau và hệ thống sẽ được xây dựng từ nhiều hệ thống con hợp thành (xem phần sau). Cửa sổ Parameter trước khi mô phỏng Ví dụ: Mô phỏng một hệ thống điều khiển tốc độ động cơ điện một chiều. Với bộ điều khiển PID theo luật PI được tổng hợp theo phương pháp module tối ưu. Hãy thành lập mô hình và mô phỏng đánh giá kết quả Cách tạo ra thư viện riêng (một subsystem) từ các khối đã có Ý nghĩa cách làm này là tạo ra một khối con trên cơ sở các khối đã có để phân hệ thống lớn thành nhiều hệ thống con (subsystem). Nếu một khối con được sử dụng nhiều lần trong các chương trình thì ta có thể đóng gói khối con, tức là che mặt nạ cho nó (mask subsystem) để biến nó thành một khối chức năng như những khối đã được tạo ra trong SIMULINK. Trong thư viện SIMULINK, có rất nhiều các khối đã tạo từ những khối cơ bản. Ví dụ: khối PID controller được tạo ra từ các khối: Gian, Derivative, Integrator, Sum. Để xem cấu trúc bên trong của subsystem đã che mặt nạ (masked), ta làm như sau: Chọn khối cần xem cấu trúc bên trong Chọn menu Edit ->Look under Mask để mở cửa sổ simulink cho mô hình của subsystem. (có thể ấn nút phải chuột trên đối tượng để chọn chế độ trên) Ví dụ ứng dụng ** Ta xét ví dụ sau đây, tạo ra một khối có tên là PID controller làm chức năng một khối tích hợp là bộ điều khiển theo luật PID. Các trình tự tạo ra khối chức năng theo trình tự sau: Bước 1: Kéo và thả một khối Subsystem trong cửa số SIMULINK, đặt tên khối này là PID Controller Bước 2: Xây dựng mô hình bộ điều khiển PID tổng quát với hàm truyền dạng: WPID(s)= P+I/s+D.s Có cấu trúc sơ đồ như hình vẽ. Trong đó 3 thông số P, I, D là 3 tham số cần nhập vào Bước 3: đóng gói hệ con này thành một khối riêng bằng cách: chọn menu Edit -> Mask subsystem, xuất hiện một cửa sổ lựa chọn sau gồm 3 trang: Trang 1: tạo ra biểu tượng (Icon) cho khối bằng cách dùng các lệnh vẽ trong khung Drawing Commands Ví dụ: disp(‘PID’) : hiển thị nhãn trên biểu tượng khối. Trang 2: Nhập và khai báo các biến. (Initialization) Trang 3: Mô tả chức năng khối (Documetation) Chức năng khối được mô tả bằng các dòng Text vào Block description. Block Help: các mô tả khi ấn nút help nhập thông số khối. Trong ví dụ trên, ta có 3 tham số cấn khai báo (P, I, D). Lần lượt khai báo từng tham số trong các ô: Prompt và ô Variable. Sau khi khai báo xong một biến, chọn nút Add để tạo thêm biến mới. Cuối cùng, chọn OK để kết thúc. Khi đó khối con trở thành một khối thư viện chức năng với các tham số cần nhập như hình bên phải (khi kích đúp chuột vào khối này) Khảo sát các mô hình hệ thống trên cơ sở các hệ thống con thông qua ví dụ sau: VD: hệ thống điều khiển tốc độ một chiều dùng chỉnh lưu Thyristor. Trong đó: khối hệ con là 6-pulse Converter và Pulse_ Generator là hệ con được xây dựng sẵn trong thư viện Power System Blocksets. Có thể xem cấu trúc bên trong của nó bằng cách xem chế độ Look under Mask. Khối 6-pulse converter là subsystem có cấu trúc như sau: Hãy thành lập mô hình này và chạy quan sát kết quả? Ví dụ: phân tích quá trình quá độ hệ thống điện. Hãy thành lập mô hình và chạy mô phỏng lấy kết quả. Cách xây dựng một mô hình như sau: TÀI LIỆU THAM KHẢO MỤC LỤC

Các file đính kèm theo tài liệu này:

  • docGiáo trình MATLAB - SIMULINK.doc