90 Các hàm phân tích dữ liệu cplxpair(x) Xắp xếp cặp phức liên hợp cross(x,y) Tích chéo vector cumprod(x) Tích tích luỹ theo cột cumprod(x,n) Tích tích luỹ theo chiều n cumsum(x) Tổng tích luỹ theo cột cumsum(x,n) Tổng tích luỹ theo chiều n cumtrapz(x,y) Tích chéo tích luỹ cumtrapz(x,y,n) Tích chéo tích luỹ theo chiều n del2(A) Toán tử rời rạc Laplacian 5 điểm diff(x) Tính độ chênh lệch giữa các phần tử diff(x,m) Tính số ra cấp m của các phần tử diff(x,m,n) Tính số ra cấp m của các phần tử theo chiều n dot(x,y) Tích vô hớng của hai vector gradient(Z,dx,dy) Gradient vi phân histogram(x) Biểu đồ hình cột max(x), max(x,y) Phần tử lớn nhất max(x,n) Phần tử lớn nhất theo chiều n mean(x) Giá trị trung bình của cột mean(x,n) Giá trị trung bình theo chiều n median(x) Giá trị của phần tử giữa của cột median(x,n) Giá trị của phần tử giữa theo chiều n min(x), min(x,y) Phần tử nhỏ nhất min(x,n) Phần tử nhỏ nhất theo chiều n prod(x) Tích các phần tử trong cột prod(x,n) Tích các phần tử theo chiều n rand(x) Số ngẫu nhiên phân bố đều randn(x) Số ngẫu nhiên phân bố bình thờng sort(x) Xắp xếp các cột theo thứ tự tăng dần sort(x,n) Xắp xếp theo chiều n sortrows(A) Xắp xếp các hàng theo thứ tự tăng dần std(x), std(0) Độ lệch chuẩn của cột chuẩn hoá theoN-1 std(x,1) Độ lệch chuẩn của cột chuẩn hoá theoN std(x, flag, n) Độ lệch chuẩn theo chiều n subspace(A,B) Góc giữa hai điểm sum(x) Tổng các phần tử trong mỗi cột sum(x,n) Tổng các phần tử theo chiều n trapz(x,y) Tích chéo của y=f(x) trapz(x,y,n) Tích chéo theo chiều n oOo chơng 14 ĐA THứC 14.1 Các nghiệm của đa thức Tìm nghiệm của đa thức là giá trị để đa thức bằng không, là một bài toán thờng gặp trong thực tế. MATLAB giải quyết những bài toán này và đồng thời cung cấp những công cụ để tính toán đa 91 thức. Trong MATLAB một đa thức đợc biểu diễn bằng một vector hàng các hệ số với bậc giảm dần. Ví dụ đa thức x 4 -12x 3 +25x+116 đợc nhập vào nh sau: >> p = [1 -12 0 25 116] p= 1 -12 0 25 116 Nhớ rằng mục dành cho hệ số 0 cũng phải đợc gõ vào nếu không MATLAB sẽ không hiểu đợc hệ số của biêủ thức bậc mấy là không. Sử dụng dạng này thì nghiệm của một đa thức có thể tìm đợc bằng cách dùng hàm roots : >> r = roots(p) r= 11.7374 2.7028 -1.2251 + 1.4672i -1.2251 - 1.4672i Bởi vì trong MATLAB cả đa thức và các nghiệm của nó đều là vector nên MATLAB ngầm quy ớc rằng đa thức là vector hàng, còn các nghiệm là các vector cột. Nếu biết trớc nghiệm của một đa thức thì ta dễ dàng biết đợc đa thức đó. Trong MATLAB lệnh poly sẽ thực hiện công việc này: >> pp = poly(r) pp= 1 -12 -1.7764e-14 25 116 >> pp(abs(pp)< 1e-12 = 0 % Gán những phần tử quá nhỏ bằng không 1 -12 0 25 116 Bởi vì trong tính toán thờng gặp những sai số nên đôi khi kết quả của lệnh poly cho ra các đa thức có các hệ số gần bằng không và các đa thức có phần ảo rất nhỏ nh đợc chỉ ra ở trên, các giá trị bằng không có thể đợc làm tròn bằng các công cụ về mảng. Tơng tự nh vậy, ta có thể làm tròn một số phức để trở thành một số thực bằng hàm real . 14.2 Nhân đa thức Hàm conv thực hiện nhân hai đa thức (thực ra là hai ma trận), xét tích của hai đa thức sau: a(x) = x 3 +2x 2 +3x+4 và b(x) = x 3 +4x 2 +9x+16 >> a = [1 2 3 4]; b = [1 4 9 16]; >> c = conv(a,b) c= 1 6 20 50 75 84 64 Kết quả là c(x) = x 6 +6x 5 +20x 4 +50x 3 +75x 2 +84x+64 khi ta nhân nhiều đa thức với nhau thì ta phải sử dụng lệnh conv nhiều lần. 14.3 Phép cộng đa thức 92 MATLAB không cung cấp các hàm trực tiếp thực hiện phép cộng hai đa thức, dùng phép cộng ma trận chỉ có tác dụng khi hai đa thức là hai vector có cùng kích thớc. Ví dụ nh cộng hai đa thức a(x) và b(x) ở trên: >> d = a + b d= 2 6 12 20 Kết quả là d(x)=2x 3 +6x 2 +12x+20. Khi hai đa thức có bậc khác nhau thì đa thức có bậc thấp hơn phải đợc thêm vào các hệ số 0 để cho bậc của nó có cùng bậc với đa thức có bậc cao hơn. Xét phép cộng hai đa thức c và d ở trên: >> e = c + [0 0 0 d] e= 1 6 20 52 81 96 84 Kết quả là e(x)=x 6 +6x 5 +20x 4 +52x 3 +81x 2 +84. Các giá trị 0 cần phải đợc thêm vào ở phía đầu của vector chứ không phải phía đuôi, bởi vì các hệ số đó phải tơng ứng với các hệ số bậc cao của x. Nếu bạn muốn, bạn có thể tạo một hàm M_file để thực hiện phép công đa thức tổng quát: function p=polyadd(a,b) %POLYADD Polynomial addition %POLYADD(A,B) adds the polynomials A and B if nargin<2 error(Not enough input arguments) end a=a(:).; %make sureinputs are row vectors b=b(:).; na=length(a); %find lengths of a and b nb=length(b); p=[zeros(1,nb-na) a]+[zeros(1,na-nb) b]; % pad with zeros as necessary Bây giờ có thể minh hoạ cho việc dùng hàm polyadd, hãy xét ví dụ trớc đây: >> f = polyadd(c,d) f= 1 6 20 52 81 96 84 Kết quả cũng giống nh đa thức e ở trên. Tất nhiên polyadd cũng có thể dùng để thực hiện phép trừ. >> g = polyadd(c,-d) g= 1 6 20 48 69 72 44 14.4 Chia hai đa thức Trong một số trờng hợp ta phải chia đa thức này cho một đa thức khác, trong MATLAB công việc này đợc thực hiện bởi hàm deconv , sử dụng các đa thức b và c ở trên ta có: >> [q,r] = deconv(c,b) q= 1 2 3 4 r= 0 0 0 0 0 0 0 93 Kết quả này chỉ ra rằng c đem chia cho b thì đợc đa thức là q và đa thức d là r trong trờng hợp này đa thức d là đa thức 0 bởi vì c là đa thức chia hết cho q (nhớ rằng trên đây ta đã nhận đợc đa thức c bằng cách đem nhân đa thức a với đa thức b) 14.5 Đạo hàm Bởi vì dễ dàng tính đợc vi phân của một đa thức nên MATLAB đa ra hàm polyder để tính vi phân đa thức: >> h = polyder(g) h= 6 30 80 144 138 72 14.6 Tính giá trị của một đa thức Rõ ràng rằng bạn có thể cộng, trừ, nhân, chia, đạo hàm một đa thức bất kỳ dựa trên các hệ số của nó, bạn cũng có thể dễ dàng tính đợc giá trị các đa thức này. Trong MATLAB hàm polyval sẽ thực hiện công việc này: >> x = linspace(-1,3); Sẽ chọn 100 điểm dữ liệu giữa -1 và 3 >> p = [1 4 -7 -10]; Dùng đa thức p(x) = x3+4x2-7x-10 >> v = polyval(p,x); Tính giá trị của p(x) tại các giá trị của x và lu trữ kết quả vào trong mảng v. Sau đó kết quả sẽ đợc vẽ ra bằng lệnh plot >> plot(x, v), title(x^3+4x^2-7x-10), xlabel(x) 94 Hình 14.1 14.7 Phân thức hữu tỉ Đôi khi bạn gặp những bài toán liên quan đến tỉ số của hai đa thức hay còn gọi là phân thức hữu tỉ, ví dụ nh các hàm truyền hay các hàm xấp xỉ pade có dạng nh sau: Trong MATLAB phân thức cũng đợc mô phỏng bằng hai đa thức riêng rẽ. Ví dụ nh: >> n=[1 -10 100] % a numerator n = 1 -10 100 >> d=[1 10 100 0] % a dimominator d = 1 10 100 0 >> z=roots(n) % the zeros of n(x)/d(x) z = 5.0000 + 8.6603i 5.0000 - 8.6603i >> p=roots(d) % the poles of n(x)/d(x) p = 0 -5.0000 + 8.6603i -5.0000 - 8.6603i Đạo hàm của phân thức này theo biến x đợc tính dựa trên hàm polyder : >> [nd,dd]=polyder(n,d) 95 nd = -1 20 -100 -2000 -10000 dd = Columns 1 through 6 1 20 300 2000 10000 0 Column 7 0 ở đây nd và dd là tử thức và mẫu thức của đạo hàm. Một thao tác thông thờng khác là tìm phần d của phân thức. >> [r,p,k]=residue(n,d) r = 0.0000 + 1.1547i 0.0000 - 1.1547i 1.0000 p = -5.0000 + 8.6603i -5.0000 - 8.6603i 0 k = [] Trong trờng hợp này hàm residue trả về các hệ số mở rộng phân thức từng phần r, các nghiệm của phân thức là p và phần thơng chia hết của phân thức là k. Nếu bậc của tử số nhỏ hơn bậc của mẫu số thì phân thức chia hết sẽ bằng không. Trong ví dụ trên thì mở rộng phân thức từng phần của phân thức đã cho là: Nếu cho trớc các đa thức này thì phân thức ban đầu sẽ tìm đợc bằng cách sử dụng hàm residue : >> [nn,dd]=residue(r,p,k) nn = 1.0000 -10.0000 100.0000 dd = 1.0000 10.0000 100.0000 0 Vì vậy trong trờng hợp này, hàm residue có thể thực hiện đợc việc chuyển đổi hai chiều tuỳ thuộc vào số lợng các tham số vào và ra truyền cho nó. oOo . p = 0 -5 .0000 + 8.6603i -5 .0000 - 8.6603i Đạo hàm của phân thức này theo biến x đợc tính dựa trên hàm polyder : >> [nd,dd]=polyder(n,d) 95 nd = -1 20 -1 00 -2 000 -1 0000 dd. công việc này: >> x = linspace (-1 ,3); Sẽ chọn 100 điểm dữ liệu giữa -1 và 3 >> p = [1 4 -7 -1 0]; Dùng đa thức p(x) = x3+4x 2-7 x-10 >> v = polyval(p,x); Tính. công việc này: >> pp = poly(r) pp= 1 -1 2 -1 .7764e -1 4 25 116 >> pp(abs(pp)< 1e-12 = 0 % Gán những phần tử quá nhỏ bằng không 1 -1 2 0 25 116 Bởi vì trong tính toán thờng