45 title('Acid-Water Bath Dipping Example') Chạy chơng trình trên ta đợc kết quả nh sau: lost = 1 2 3 4 5 6 7 8 9 10 n = 59 29 19 14 12 10 8 7 6 6 Hình 6.2 Chú ý ở đây yêu cầu phơng pháp chia chấm vì log(1 + lost/ 100) là một vector oOo chơng 7 các phép tính với mảng 46 7.1 Tạo phơng trình tuyến tính. Về cơ bản, MATLAB đợc viết đối với những ma trận và thực hiện phép toán số học tuyến tính đơn giản mà xuất hiện trong nhiều ứng dụng. Một vấn đề chung nhất của số học tuyến tính là việc giải phơng trình. Ví dụ tạo phơng trình: . = A.x = b Biểu tợng phép nhân toán học (.) đợc định nghĩa trong phép toán trên, khác với kí hiệu ta dùng đối với mảng trớc kia. Trong MATLAB phép nhân ma trận này đợc định nghĩa bằng dấu sao (*). Tiếp theo định nghĩa dấu bằng, ma trận tạo ra từ ma trận A và vector x bằng với vector b. Giải pháp tồn tại cho sự cân bằng đề cập ở trên là những vấn đề cơ bản của số học tuyến tính. Thêm nữa, khi lời giải không tồn tại, có rất nhiều cách gần đúng để tìm kiếm giải pháp, nh phép loại trừ Gaussian, sự tìm thừa số LU, hoặc tính trực tiếp A -1 .b. Dới đây chúng ta sẽ đề cập đến một số cách giải quyết nh trên: Trớc tiên nhập vào ma trận A và b: >> A = [1 2 3; 4 5 6; 7 8 0] A= 1 2 3 4 5 6 7 8 0 >> b = [366; 804; 315] b= 366 804 351 Nếu bạn có kiến thức về số học tuyến tính, nó rất dễ để bạn kiểm tra xem định thức của ma trận trên có khác không hay không: >> det(A) ans= 27 Nếu nó đúng, MATLAB có thể giải phơng trình theo hai cách, một cách hay đợc dùng hơn, một cách ít sử dụng, nhng trực tiếp hơn, phơng pháp này là chuyển thành dạng x=A -1 .b. >> x = inv(A)*b x= 25.0000 22.0000 99.0000 ở đây inv(A) là hàm của MAYLAB dùng để tính A -1 ; và toán tử nhân ( * ), không có dấu chấm phía trớc, đây là phép nhân ma trận. Phơng pháp đợc dùng nhiều hơn là dùng toán tử chia ma trận trái: >> x = A\b x= 25.0000 22.0000 99.0000 47 Phơng trình này sử dụng phơng pháp tìm thừa số LU gần đúng và đa ra câu trả lời nh là phép chia trái A cho b. Toán tử chia trái ( \ ) không có dấu chấm phía trớc là một phép toán của ma trận, nó không phải là các phép toán giữa các phần tử của mảng. Phơng pháp thứ hai này đợc sử dụng nhiều hơn do nhiều nguyên nhân, một trong những nguyên đơn giản nhất là phơng pháp này dùng ít phép toán hơn và tốc độ nhanh hơn. Thêm vào đó, nhìn chung phơng pháp này chính xác hơn cho những bài toán lớn. Trong trờng hợp khác, nếu MATLAB không tìm thấy phơng pháp giải hoặc không tìm thấy phơng pháp chinh xác, nó sẽ hiện thông báo lỗi. Nếu bạn nghiên cứu số học tuyến tính, bạn biết rằng khi số phơng trình và số biến khác nhau, thì không thể có một phơng pháp duy nhất để giải. Trong MATLAB khi gặp những hệ phơng trình có số phơng trình lớn hơn số biến nó dùng toán tử chia trái hoặc chia phải, tự động giảm thấp nhất những phần tử thừa A.x - b. Cách này gọi là phơng pháp vuông nhỏ nhất. Ví dụ: >> A = [1 2 3; 4 5 6; 7 8 0; 2 5 8] % Bốn phơng trình, ba biến. A= 1 2 3 4 5 6 7 8 0 2 5 8 >> b = [366 804 351 514] b= 366 804 351 514 >> x = A\b % Phơng pháp vuông nhỏ nhất. x= 247.9818 -173.1091 114.9273 >> res = A*x - b res= -119.4545 11.9455 0.0000 35.8364 Mặt khác khi số phơng trình ít hơn số biến tơng tự nh trờng hợp không xác định, thì số nghiệm phơng trình là vô tận. Đối với những nghiệm này MATLAB tính theo hai cách. Dùng toán tử chia đa ra phơng pháp mà có số phần tử 0 của x là cực đại. Nh một sự lựa chọn, tính x=pinv(A)*b đa ra phơng pháp chiều dài hoặc tiêu chuẩn của x nhỏ hơn các phơng pháp khác. Phơng pháp này gọi là phơng pháp tiêu chuẩn cực tiểu. Ví dụ: >> A = A % Tạo ba phơng trình, bốn biến. A= 1 4 7 2 2 5 8 5 3 6 0 8 >> b = b(1:3) b= 366 48 804 351 >> x = A\b % phơng pháp với số phần tử 0 cực đại. x= 0 -165.9000 99.0000 168.3000 >> xn = pinv(A)*b % Tìm kiếm giải pháp tiêu chuẩn nhỏ nhất. xn= 30.8182 -168.9818 99.0000 159.0545 >> norm(x) % Tiêu chuẩn O_clit với các phần tử 0. ans= 256.2200 >> norm(xn) % Giải pháp tiêu chuẩn nhỏ nhất ans= 254.1731 7.2 Các hàm ma trận . Để giải phơng trình tuyến tính, MATLAB cung cấp các hàm trợ giúp sau: Các hàm ma trận balance(A) Cân bằng để tăng độ chính xác cdf2rdf(A) Chuyển từ dạng số phức chéo sang dạng số thực chéo chol(A) Tìm thừa số Cholesky cholinc(A, droptol) Thừa số Cholesky không đầy đủ cond(A) Số điều kiện ma trận condest(A) Ước lợng số điều kiện ma trận theo tiêu det(A) Định thức ma trận expm(A) Ma trận theo luật mũ expm1(A) Bổ sung M_file của expm expm2(A) Ma trận theo luật hàm mũ, dùn g thứ tự Ta y lor funm(A, fun) Tính toán hàm ma trận chung hess(A) Mẫu Hessenberg inv(A) Ma trận chuyển vị logm(A) Ma trận logarithm lu(A) Tìm thừa số với phép khử Gaussian luinc(A, droptol) Thừa số LU không đầy đủ norm(A) Ma trận và vector tiêu chuẩn norm(A,1) Tiêu chuẩn 1 norm(A, 2) Tiêu chuẩn 2 norm(A, inf) Vô cùng norm(A, p) Tiêu chuẩn P (chỉ đối với vector) norm(A, fro) Tiêu chuẩn F normest(A) Tiêu chuẩn 2 ớc lợng cho ma trận lớn null(A) Khoảng rỗng orth(A) Tính trực giao 49 poly(A) Đa thức đặc trng polyvalm(A) Tính giá trị của ma trận qr(A) Xác định trực giao tam giác qrdelet(Q, R, j) Xoá cột từ thừa số QR qrinsert(Q, R, j, x) Chèn cột trong thừa số QR rank(A) Số của hàng hoặc cột độc lập rcond(A) Ước lợng điều kiện thuận nghịch sqrtm(A) Ma trận gốc bình phơng subspace(A, B) Góc giữa hai điểm svd(A) Phân tích giá trị đơn svds(A, K) Một số các giá trị đơn trace(A) Tổng các phần tử chéo 7.3 Ma trận đặc biệt MATLAB đa ra một số các ma trận đặc biệt, trong đó một số chúng có những ứng dụng rộng rãi trong các phép toán. Nhìn chung những ma trận đó là: >> a = [1 2 3; 4 5 6]; >> b = find(a>10) b= [ ] ở đây b là ma trận rỗng. MATLAB trả lại ma trận rỗng khi phép toán không có kết quả. Trong ví dụ trên không có phần tử nào của a lớn hơn 10. Ma trận rỗng không có kích cỡ, nhng tên biến của chúng vẫn tồn tại trong không gian làm việc. >> zeros(3) % Ma trận không 3 hàng, 3 cột (3x3). ans= 0 0 0 0 0 0 0 0 0 >> ones(2,4) % Ma trận một 2 hàng, 4 cột (2x4). ans= 1 1 1 1 1 1 1 1 >> zeros(3) + pi ans= 3.1416 3.1416 3.1416 3.1416 3.1416 3.1416 3.1416 3.1416 3.1416 Ví dụ trên về tạo ma trận 3x3 với các phần tử đều là . >> rand(3,1) ans= 0.2190 0.0470 0.6789 ma trận 3x1 gồm các phần tử là số cung cấp bởi hàm random giữa 0 và 1. >> randn(2) 50 ans= 1.1650 0.0751 0.6268 0.3516 ma trận 2x2 của các số cung cấp bởi hàm random với giá trị trung bình là 0. Thuật toán cho hàm rand và randn có thể tìm thấy trong S.K>Park and K.W.Miller,Random Number Generator: Good Ones Are Hard to Find, Comm. ACM, 32, 10, Oct. 1988-1201. >> eye(3) ans= 1 0 0 0 1 0 0 0 1 Ma trận đồng nhất 3x3 >> eye(3,2) ans= 1 0 0 1 0 0 Ma trận đồng nhất 3x2 Ngoài ra để chỉ kích cỡ của một ma trận, bạn có thể dùng hàm size để tạo một ma trận có kích cỡ giống nh ma trận khác: >> A = [1 2 3; 4 5 6]; >> ones(size(A)) ans= 1 1 1 1 1 1 ma trận một có cùng kích cỡ với ma trận A. Các ma trận trên và các ma trận đặc biệt khác đợc giới thiệu trong bảng sau: Các ma trận đặc biệt [ ] Ma trận rỗng compan Tạo ma trận rỗng eye Ma trận đồng nhất gallery Ma trận kiểm tra nhỏ vài phần tử hadamard Ma trận Hadamard hankel Ma trận Hankel hilb Ma trận Hilbert invhilb Chuyển thành ma trận Hilbert magic Ma trận vuông, giá trị các phần tử bằng từ 1 đến giá trị số phần tử ones Ma trận 1 pascal Ma trận tam giác Pascal rand Ma trận với các phần tử ngẫu nhiên từ 0 đến 1. randn Ma trận ngẫu nhiên thông thờng với giá trị trung bình bằng 0 rosser Ma trận kiểm tra đối xứng trục chính toeplitz Ma trận Toeplitz vander Ma trận Vandermond wilkinson Ma trận kiểm tra Wilkinson 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. . Phơng pháp vuông nhỏ nhất. x= 2 47. 9818 -1 73 .1091 114.9 273 >> res = A*x - b res= -1 19.4545 11.9455 0.0000 35.8364 Mặt khác khi số phơng trình ít hơn số biến tơng tự nh. % 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=Ay. 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