Tài liệu matlap toàn tập_3 pps

25 177 0
Tài liệu matlap toàn tập_3 pps

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

51 zeros Ma trận không Ví dụ Vấn đề : Ta có mạch điện nh trong hình 7.1 đợc mô tả bằng phơng trình điện áp nút khi nguồn đa vào là sóng hình sin. Hình 7.1 E = 10 o ; R1 = 2; L = 10j; C = ; R2 = 10. ở đây v i là điện áp giữa nút thứ i và đất. Hỏi điện áp tại mỗi nút là bao nhiêu? Giải pháp: Đây là vấn đề về phân tích pha. Phơng pháp giải bài này là giải phơng trình trên, và chuyển các kết quả về dạng thời gian. Trong MATLAB giải pháp sẽ là: function circuit % circuit.m script file to solve circuit proplem A(1,1)=1/2; % poke in nonzero values as needed A(1,2)=-1/2; A(2,1)=-1/2; A(2,2)=1/2 + 0.2j + 1/10j; A(2,3)= -1/10j; A(3,2)=-1/10j; A(3,3)=1/10 + 1/10j; y=[-1 0 0]'; % right hand side vector v=A\y % complex solution vmag=abs(v) % solution magnitudes vphase=angle(v)*180/pi % solution phase in degrees theta=linspace(0,2*pi); % plot results in time v1=vmag(1)*cos(theta-vphase(1)); v2=vmag(2)*cos(theta-vphase(2)); v3=vmag(3)*cos(theta-vphase(3)); thd=theta*180/pi; plot(thd,v1,thd,v2,thd,v3) Sau khi chạy chơng trình trên, kết quả sẽ là: v = -4.0000 + 6.0000i -2.0000 + 6.0000i 2.0000 + 4.0000i vmag = 7.2111 52 6.3246 4.4721 vphase = 123.6901 108.4349 63.4349 Hình 7.2 oOo chơng 8 các phép tính LOGIC Và QUAN Hệ Thêm vào những toán tử truyền thống, MATLAB cung cấp toán tử logic và quan hệ. Bạn có thể quen thuộc với những phép toán này, nếu bạn đã làm quen với các ngôn ngữ lập trình khác. Mục đích của những toán tử và hàm này là để trả lời câu hỏi True_False (đúng_sai). Đối với các số thì trong toán tử logic và quan hệ quy định các số khác không là True còn số không là False. Kết quả của phép toán logic và quan hệ đa ra là 1 cho True, 0 cho False. 53 8.1 Toán tử quan hệ Toán tử quan hệ MATLAB bao gồm tất cả các phép so sánh: Toán tử quan hệ ý nghĩa < nhỏ hơn <= nhỏ hơn hoặc bằng > lớn hơn >= lớn hơn hoặc bằng == bằng ~= không bằng Toán tử quan hệ MATLAB có thể dùng để so sánh hai mảng có cùng kích cỡ hoặc so sánh một mảng với một số đơn. Trong trờng hợp thứ hai, số đơn so sánh với tất cả các phần tử của mảng, kết quả trả về giống nh kích cỡ của mảng. Ví dụ: >> A = 1:9, B = 9 - A A= 1 2 3 4 5 6 7 8 9 B= 8 7 6 5 4 3 2 1 0 >> tf = A>4 tf= 0 0 0 0 1 1 1 1 1 tìm kiếm các phần tử của A mà lớn hơn 4. Kết quả bằng 0 khi A 4, bằng 1 khi A>4. >> tf = (A==B) tf= 0 0 0 0 0 0 0 0 0 Tìm kiếm các phần tử của A mà bằng với B. Chú ý sự khác nhau giữa = và == dùng để so sánh hai biến và trả về 1 khi chúng bằng nhau, 0 khi chúng khác nhau; = dùng để gán kết quả đa ra của toán tử cho một biến. >> tf = B - (A>2) tf= 8 7 5 4 3 2 1 0 -1 Tìm các phần tử A>2 và bị trừ bởi vector B. Ví dụ này chỉ ra rằng kết quả đa ra của toán tử logic là một mảng số bao gồm các số không và một, chúng cũng có thể dùng trong các phép toán số học. >> B = B + (B==0)*eps B= Columns 1 through 7 8.0000 7.0000 6.0000 5.0000 4.0000 3.0000 2.0000 Columns 8 through 9 1.0000 0.0000 Ví dụ trên đa ra cách thay thế các phần tử của B mà trùng với không bằng số đặc biệt của MATLAB là eps, có giá trị xấp xỉ 2.2e-16. Cách thay thế này đôi khi có ích là tránh trờng hợp chia cho số không nh ví dụ sau: >> x = (-3:3)/3 54 -1.0000 -0.6667 -0.3333 0 0.3333 0.6667 1.0000 >> sin(x)./x Warning: Divide by zero ans= 0.8415 0.9276 0.9816 NaN 0.9816 0.9276 0.8415 Tính toán hàm sin(x)/ x đa ra một cảnh báo vì phần tử thứ t bằng không, sin(0)/ 0 không đợc định nghĩa, MATLAB trả lại NaN ( nghĩa là không phải là một số) tại vị trí đó trong kết quả. Thử lại ví dụ trên, sau khi thay thế phần tử có giá trị bằng không bằng số eps: >> x = x + (x==0)*eps; >> sin(x)/x ans= 0.8415 0.9276 0.9816 1.0000 0.9816 0.9276 0.8415 Bây giờ sin(x)/ x tại x = 0 đa ra kết quả giới hạn chính xác. 8.2 Toán tử Logic Toán tử logic cung cấp một cách diễn đạt mối quan hệ phủ định hay tổ hợp. Toán tử logic MATLAB bao gồm: Toán tử logic ý nghĩa & AND | OR ~ NOT Một vài ví dụ về dùng toán tử logic: >> A = 1:9; B = 9 - A; >> tf = A>4 tf= 0 0 0 0 1 1 1 1 1 Tìm kiếm các phần tử của A mà lớn hơn 4. >> tf = ~(A>4) 1 1 1 0 0 0 0 0 phủ định của kết quả, tơng đơng với vị trí nào bằng không thay bằng một và ngợc lại. >> tf = (A>2)&(A<6) tf= 0 0 1 1 1 0 0 0 0 Trả lại một tại những vị trí mà phần tử của A lớn hơn 2 và nhỏ hơn 6. 8.3 Các hàm logic và hàm quan hệ Thêm vào những toán tử logic và toán tử quan hệ đề cập đến ở trên, MATLAB cung cấp các hàm logic và quan hệ khác dới đây: Các hàm logic và hàm quan hệ khác xor(x,y) Toán tử hoặc. Trả lại giá trị 1 khi x hoặc y khác không (True), giá trị 0 khi cả x 55 và cùng bằng không (False) hoặc cùng khác không (True) any(x). Trả lại 1 nếu bất cứ phần tử nào trong vector x khác không. Trả lại 1 cho mỗi cột trong ma trận x mà có các phần tử khác không. all(x) Trả lại 1 nếu tất cả các phần tử của vector x khác không. Trả lại 1 cho mỗi cột trong ma trận x mà tất cả các phần tử khác không. MATLAB còn cung cấp rất nhiều các hàm kiểm tra cho sự tồn tại của các giá trị đặc biệt hoặc điều kiện và trả lại những kết quả là giá trị logic. Các hàm kiểm tra isa(X, name) True nếu X có lớp đối tợng là name iscell(X) True nếu đối số là mảng phần tử. iscellstr(X) True nếu đối số là mảng phần tử của các xâu. ischar(S) True nếu đối số là xâu kí tự. isempty(X) True nếu đối số là rỗng. isequal(A, B) True nếu A và B giống nhau. isfield(S, name) True nếu namelà một trờng của cấu trúc S. isfinite(X) True khi các phần tử có hạn. isglobal(X) True khi đối số là biến toàn cục. ishandle(h) True khi đối số là sự điều khiển đối tợng hợp lý ishold True nếu đồ thị hiện tại giữ trạng thái ON. isiee True nếu máy tính thực hiện phép số học IEEE isinf(X) True tại những phần tử vô cùng isletter(S) True khi các phần tử thuộc bảng chữ cái. islogical(X) True khi đối số là mảng logic ismember(A, B) True tại những vị trí mà phần tử của A và B trùng nhau isnan(X) True khi các phần tử là không xác định (NaN) isnumeric(X) True khi đối số là mảng số isppc True cho Macintosh với bộ xử lý PowerPC isprime(X) True khi các phần tử là số nguyên tố isreal(X) True khi đối số không có phần ảo isspace(S) True khi các phần tử là kí tự trắng issparse(A) True nếu đối số là ma trận Sparse isstruct(S) True nếu đối số là một cấu trúc isstudent True nếu Student Edition của MATLAB isunix True nếu máy tính là UNIX isvms True nếu máy tính là VMS oOo chơng 9 VĂN Bản Sự tiện ích của MATLAB là xử lý với các con số. Tuy nhiên chúng ta đã nhiều lần đề cập đến thao tác với văn bản (text), nh khi đa nhãn và tiêu đề vào trong đồ thị. Trong MATLAB biến text đợc dùng đến nh là xâu kí tự, hoặc đơn giản là các xâu. 9.1 Xâu kí tự Xâu kí tự trong MATLAB là mảng của các giá trị ASCII mà quy ớc của nó là các kí tự. 56 Ví dụ: >> t = 'How about this character string?' t= How about this character string? >> size(t) ans= 1 32 >> whos Name Size Bytes Class t 1x32 64 char array Grand total is 32 elements using 64 bytes Một xâu kí tự, đơn giản là dạng văn bản, đợc đặt giữa hai dấu nháy đơn. Mỗi kí tự trong xâu là một phần tử của mảng, với mỗi phần tử chiếm hai bytes. Muốn xem các mã ASCII của một xâu kí tự, bạn phải dùng các phép toán số học đối với xâu, hoặc chuyển nó sang dạng số, dùng hàm double . Ví dụ: >> double(t) ans= Columns 1 through 12 72 111 119 32 97 98 111 117 116 32 116 104 Columns 12 through 24 105 115 32 99 104 97 114 97 99 116 101 114 Columns 25 through 32 32 115 116 114 105 110 103 63 >> abs(t) ans= Columns 1 through 12 72 111 119 32 97 98 111 117 116 32 116 104 Columns 13 through 24 105 115 32 99 104 97 114 97 99 116 101 114 Columns 25 through 32 32 115 116 114 105 110 103 63 Hàm char chuyển lại thành xâu: >> char(t) ans= How about this character string? Với mảng xâu là một mảng số với thuộc tính đặc biệt, chúng ta có thể thao tác bằng tất cả các công cụ thao tác với mảng sẵn có trong MATLAB. Ví dụ: >> u = t(16:24) u= character Địa chỉ của xâu cũng giống nh mảng. ở đây phần tử từ 16 đến 24 chứa từ character >> u = t(24:-1:16) retcarahc 57 Đây là từ character đọc ngợc lại >> u = t(16:24) u= c h a r a c t e r Dùng toán tử chuyển vị để chuyển từ character sang dạng ma trận cột >> v = 'I cant't find the manual!' v= I can't find the manual! Dấu nháy đơn với xâu kí tự là biểu tợng trong hai dấu nháy đơn. Chúng ta có thể nối hai xâu nh đối với hai mảng: >> w = [u,v] w= character I can t find the manual! Hàm disp cho phép bạn hiển thị xâu kí tự mà không có tên biến >> disp(v) I can't find the manual Chú ý là trạng thái v= bị bỏ đi, điều này rất có ích cho chúng ta hiển thị những lời trợ giúp trong script file. Cũng giống nh đối với ma trận, xâu kí tự có thể có nhiều hàng, nhng mỗi một hàng phải có số cột bằng nhau, để cho số cột của chúng bằng nhau chúng ta có thể dùng kí tự trống. >> v = ['However, this' 'does work! '] v= However, this does work! >> w = ['this'; ' does not'] ??? All rows in the bracketed expression must have the same number of columns. >> size(v) ans= 2 13 58 Ta cũng có thể dùng hàm char để tạo một mảng xâu từ các xâu, và nó tự thêm các kí tự trống để tạo ra một mảng đầy đủ. >> w = char('this', 'does not') w= this does not >> size(w) ans= 2 8 9.2 Chuyển đổi xâu Để bổ xung thêm về sự chuyển đổi giữa xâu và mã ASCII của nó nh đã trình bày ở trên, MATLAB đa ra một số các hàm chuyển đổi hữu ích khác, chúng bao gồm dới đây: Các hàm chuyển đổi xâu base2dec Dựa trên xâu x chuyển sang hệ mời. bin2dec Từ xâu nhị phân sang hệ mời char Từ xâu sang ASCII dec2base Từ hệ mời sang xâu x dec2bin Từ số hệ mời sang xâu nhị phân dec2hex Từ số hệ mời sang xâu của các số hệ mời sáu. double Chuyển từ mã ASCII sang xâu fprintf Viết dạng văn bản ra file hoặc ra màn hình hex2dec Chuyển từ xâu gồm các số hệ 16 sang các số hệ mời hex2num Chuyển từ xâu các số hệ 16 sang số dấu phẩy động IEEE int2str Chuyển từ số nguyên sang xâu mat2str Chuyển từ ma trận số sang xâu gồm các số num2str Chuyển từ số sang xâu sprintf Chuyển từ mã ASCII sang xâu sscanf Chuyển từ số sang xâu có điều chỉnh kích thớc str2num Chuyển từ xâu sang số không có điều chỉnh kích thớc Trong trờng hợp chúng ta tạo một thông báo có chứa các số không phải là xâu, những hàm chuyển đổi sẽ giúp chúng ta làm việc đó. >> rad = 2.5; area = pi*rad^2; >> t = ['A circle of radius ' num2str(rad) 'has an area of ' num2str(area) '.']; >> disp(t) A circle of radius 2.5 has an area of 19.63. ở đây hàm num2str đợc dùng để chuyển từ số sang xâu. Giống nh vậy int2str chuyển từ số nguyên sang xâu, cả hai hàm này gọi hàm sprintf , nó giống nh cú pháp trong C dùng để chuyển số sang xâu. 9.3 Các hàm về xâu MATLAB đa ra một số các hàm của xâu, bao gồm các hàm trong danh sách dới đây: 59 Các hàm xâu blanks(n) Trả lại một xâu gồm các kí tự trống hay dấu cách deblank(s) Trả lại các vệt trống từ một xâu eval(xâu) Ước lợng xâu nh là một lệnh của MATLAB eval(try, catch) Ước lợng xâu và bắt lỗi feval(f, x, y, ) Hàm evaluate đa ra bằng xâu findstr(s1, s2) Tìm kiếm một xâu trong một xâu khác ischar(s) True nếu đa vào là một xâu isletter(s) True tại những vị trí kí tự Alphabet tồn tại isspace(s) True tại những vị trí là kí tự trống lasterr Xâu của lỗi cuối cùng MATLAB đa ra lower(s) Xâu với những chữ cái thờng strcat(s1, s2, ) Nối các xâu thành hàng strcmp(s1, s2) True nếu các xâu giống nhau strmatch(s1, s2) Tìm kiếm khả năng giống nhau của xâu strncmp(s1, s2, n) True nếu n kí tự đầu giống nhau strrep(s1, s2) Thay thế một xâu bằng một xâu khác strtok(s) Tìm kiếm dấu hiệu cho xâu strvcat(s1, s2, ) Nối các xâu thành cột upper(s) Chuyển thành chữ in Một số các hàm trên cung cấp khả năng xử lý các xâu cơ bản. Ví dụ nh, findstr trả lại chỉ số bắt đầu của một xâu trong một xâu khác: >> b = 'Peter Piper picked a peck of pickled peppers'; >> findstr(b, ' ') % Tìm kiếm khoảng trống 6 12 19 21 26 29 37 >> findstr(b, 'p') 9 13 22 30 38 40 41 >> find(b=='p') 9 13 22 30 38 40 41 >> findstr(b, 'cow') % Tìm kiếm từ cow ans= [ ] >> findstr(b,'pick') ans= 13 30 Hàm này trả lại ma trận rỗng khi không có những phần cần tìm. >> strrep(b,'Peter','Pamela') ans= Pamela Piper picked a peck of pickled peppers Nh trình bày ở trên, strrep đơn giản chỉ là sự thay thế một xâu. strrep không làm việc với ma trận xâu, vì vậy trớc tiên bạn cần phải chuyển từ ma trận thành vector. 9.4 Ma trận tế bào của xâu 60 Ma trận tế bào là một kiểu dữ liệu cho phép bạn gọi tên và thao tác với một nhóm dữ liệu có nhiều kích cỡ và nhiều kiểu. >> C = {'How';'about';'this for a';'cell array of strings?'} C= 'How' 'about' 'this for a' 'cell array of strings?' >> size(C) 4 1 Ma trận trên có 4 hàng và một cột nhng mỗi cột lại có độ dài khác nhau. Tất cả các phần tử đợc đặt trong dấu ngoặc nhọn, mỗi phần tử đợc đặt trong dấu nháy đơn, giữa hai hàng là dấu chấm phẩy. Mảng tế bào đợc đánh địa chỉ cũng giống nh mảng thông thờng: >> C(2:) ans= 'about' 'this for a' >> C([4 3 2 1]) ans= 'cell array of strings?' 'this for a' 'about' 'How' >> C(1) ans= How Đây vẫn là mảng tế bào. Để thay đổi dấu nháy của tế bào, ta sử dụng ngoặc nhọn: >> s = c{4} ans= cell array of strings? >> size(s) ans= 1 22 Để truy nhập vào nhiều hơn một tế bào, ta dùng hàm deal : >> [a, b, c, d] = deal(C{:}) a= How b= about c= this for a d= cell array of trings? ở đây C{:} để chỉ truy nhập đến tất cả các tế bào, nó giống nh: [...]... disp(['Friday,'datestr(start,1)]) % Display the % the result else m=start; % or return the resulting date end % number Sau khi chạy chơng trình ta đợc kết quả: >> friday Friday,13-Aug-1999 Nếu bạn muốn đợc cảnh báo cho toàn bộ năm, xem hàm fridays: function F=fridays(ynum) % FRIDAY List the Friday the 13ths in the year ynum % M=FRIDAY return the date numbers found % if nargin==0 [ynum dummy]=datevec(now); % use the current . ích là tránh trờng hợp chia cho số không nh ví dụ sau: >> x = ( -3: 3) /3 54 -1.0000 -0.6667 -0 .33 33 0 0 .33 33 0.6667 1.0000 >> sin(x)./x Warning: Divide by zero ans= 0.8415. dấu. Ví dụ sau vẽ hình 10 .3: >> t = (1900:10:1990)'; >> p = [75.995; 91.972; 105.771; 1 23. 2 03; 131 .669; 150.697; 179 .32 3; 2 03. 212; 226.505; 249. 633 ]; 67 >> plot(datenum(t,1,1),p). through 12 72 111 119 32 97 98 111 117 116 32 116 104 Columns 13 through 24 105 115 32 99 104 97 114 97 99 116 101 114 Columns 25 through 32 32 115 116 114 105 110 1 03 63 Hàm char chuyển

Ngày đăng: 12/08/2014, 22:20

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan