Giáo trình MATLAB - SIMULINK

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.

doc98 trang | Chia sẻ: aloso | Lượt xem: 9404 | Lượt tải: 3download
Bạn đang xem trước 20 trang tài liệu Giáo trình MATLAB - SIMULINK, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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