Hàm tính giá trị của hàm cho trước dưới dạng xâu ký tự được thực hiện bởi hàm eval:
Cú pháp: eval(fn, x) hoặc eval(fn) nếu x đã có giá trị. Trong đó:
fn: là hàm được định nghĩa dưới dạng một xâu ký tự
x: là biến của hàm fn, x có thể là vô hướng hoặc là mảng, nếu là mảng thì kết quả của hàm cũng là mảng mà các phần tử là các giá trị tính được tại các phần tử của mảng x.
Ví dụ:
>> x=[1 2 3];↵ >> eval(fn,x)↵ ans = 1 4 9 4.1.3 Tìm cực trị của hàm
Ngoài việc sử dụng phương pháp vẽ đồ thị để thu được những thông tin trực quan về hàm, ta còn phải biết thêm những thông tin về một số thuộc tính nhất định của hàm. Trong nhiều trường hợp ta cần phải biết cực trị của hàm, đó là cực đại, cực tiểu. Về mặt toán học thì cực trị được tìm theo phương pháp giải tích bằng cách tính đạo hàm của hàm và tìm những điểm mà tại đó đạo hàm bằng không, tuy nhiên trong một số trường hợp việc tính đạo hàm có thể thực hiện đơn giản nhưng việc tìm nghiệm mà tại đó đạo hàm bằng không thì lại không đơn giản, Matlab cung cấp hàm fminbnd để tìm giá trị cực tiểu của hàm một biến trên khoảng cố định (việc tìm giá trị lớn nhất của hàm f(x) chỉ cần tìm giá trị nhỏ nhất của hàm –f(x)). Ở đây trình bày một trong nhiều cách gọi hàm như sau:
Cú pháp: xmin = fminbnd(fun,x1,x2)
Hàm trả về giá trị xmin là giá trị mà tại đó hàm đạt giá trị nhỏ nhất trong đoạn [x1, x2]. Ví dụ:
>> fn='sin(x)*exp(-x)';↵ >> xmin=fminbnd(fn,1,8)↵
xmin =
3.9270
>> fplot(fn,[1 8])↵
Lưu ý: xmin tìm được là cực tiểu địa phương. Ví dụ: >> fn='x*sin(x)';↵ >> x=fminbnd(fn,0,4*pi)↵ x = 4.9132 >> fplot(fn,[0 4*pi])↵ 4.1.4 Tìm giá trị không
Nếu quan tâm đến việc tìm kiếm khi khi nào hàm qua không và khi nào qua các giá trị không đổi.
Matlab cung cấp cho ta công cụ để giải quyết vấn đề này. Hàm fzero tìm giá trị không của hàm một biến. Có nhiều cách cách gọi hàm fzero với số các
tham số truyền vào và giá trị đưa ra là khác nhau, chức năng khác nhau, ở đây trình bày một cách gọi hàm fzero.
Cú pháp x = fzero(fun,x0)
- Nếu x0 là dữ liệu kiểu vô hướng, thì hàm fzero trả về giá trị gần x0 mà tại đó hàm fun có giá trị bằng không. Nếu không tìm thấy thì hàm trả về giá trị nan, trong trường hợp này việc tìm kiếm kết thúc khi khoảng tìm kiếm được mở rộng cho tới khi tìm được giá trị nan, inf hoặc giá trị phức.
- Nếu x0 là một vector gồm hai phần tử x0(1) và x0(2) thì hàm trả về giá trị x mà tại đó hàm fun đổi dấu khi xét hàm fun trong đoạn từ x0(1) đến x0(2) (tại đó hàm cho giá trị bằng không) với điều kiện fun(x0(1)) khác dấu fun(x0(2))
Ví dụ: >> fn='x*sin(x)';↵ >> x = fzero(fn,[-7 -4])↵ x = -6.2832 >> fplot(fn,[-7 -4])↵
Trong trường hợp hàm có nhiều điểm tại đó hàm bằng không trong đoạn từ x0(1) đến x0(2) thì hàm trả về một giá trị trong các giá trị đó.
4.2 Phép lấy tích phân
Matlab cung cấp một số hàm để xác định các phép toán liên quan đến tích phân: trapz, quad và quadl,…
Hàm trapz cho ta giá trị xấp xỉ tích phân ở phía dưới hàm bằng cách lấy tổng các miền hình thang của các điểm dữ liệu như trong hình vẽ dưới.
Cú pháp: z = trapz(x,y)
x: là mảng mà các phần tử là các điểm chia trên miền lấy tích phân y: là mảng mà các phần tử là giá trị của hàm tại các điểm tương ứng thuộc x
Các miền hình thang độc lập có giá trị ước lượng dưới mức thực tế. Khi thay đổi một cách độc lập các vùng hình thang, ví dụ như làm cho nó nhỏ đi thì kết quả sẽ chính xác hơn.
Ví dụ: tính tích phân: sin(x), x∈[0, pi], chia x thành 6 đoạn
Tạo script file: x=0:pi/6:pi; y=sin(x); z=trapz(x,y)
Ghi file với tên intrapz.m, sau đó dịch và chạy chương trình ta được kết quả z =
1.8232
(Ngoài ra ta còn có các hàm z = trapz(y), z = trapz(...,dim) cũng được dùng để tính tích phân)
Hàm quad và quadl: là các hàm có cách tính như nhau. Sự định giá của hai hàm là rất cần thiết để đạt kết quả chính xác. Hơn nữa độ xấp xỉ của chúng là cao hơn so với hình thang đơn, với quadl có kết quả chính xác cao hơn quad. Cú pháp: q = quad(fun,a,b)
q= quadl(fun,a,b)
Giải thích: hàm quad(fun,a,b) hoặc quadl(fun,a,b) tính tích phân của hàm fun trên đoạn [a,b].
Ví dụ: Tính tích phân hàm y=sinx trên [a, b] với a,b được nhập từ bàn phím. %script file: inquad.m
clc; fun='sin(x)'; a=input('a='); b=input('b='); z=quadl(fun,a,b) fplot(fun,[a b]); Kết quả: a=0 b=pi z = 2.0000
4.3 Phép lấy vi phân
Phép lấy vi phân khó hơn so với phép lấy tích phân, phép lấy tích phân cho cả một vùng, hoặc đặc tính vĩ mô của hàm trong khi phép lấy vi phân chỉ lấy tại một điểm nào đấy, hay còn gọi là đặc tính vi mô của hàm. Kết quả là phép tính vi phân sẽ không ổn định khi đặc tính của hàm thay đổi, trong khi phép tính tích phân ít chịu ảnh hưởng hơn.
Vì phép tính vi phân là khó nên người ta cố tránh những phép tính nào mà không thể thực hiện được, đặc biệt khi dữ liệu lấy tích phân là kết quả của thực nghiệm.
Cú pháp: Y = diff(X)
Y = diff(X,n)
Y = diff(X,n,dim)
Y = diff(X)
o Nếu X là dữ liệu kiểu vô hướng thì Y=[]
o Nếu X =[x1 x2 x3 x4 …xn-1 xn ] thì Y=[x2-x1 x3-x2 x4-x3 …xn-xn-1 ]
o Nếu X là một ma trận m×n thì Y=[X(2:m,:)-X(1:m-1,:)] Ví dụ:
X = 2 3 3 4 5 1 3 4 5 2 3 4 3 3 3 >> Y=diff(X) Y = 2 2 -2 -1 -1 4 -1 -1 -1 1 0 -1 Y=diff(X,n): diff(diff(…diff(X)…)): tính n lần Ví dụ: Với X và Y ở ví dụ trên. >> Z=diff(Y) Z = -3 -3 6 0 0 -5 2 1 0 >> Z=diff(X,2) Z = -3 -3 6 0 0 -5 2 1 0
Y = diff(X,n,dim): Hàm tính n lần độ chênh lệch giữa các phần tử theo chiều dim. Ví dụ: X = 2 3 3 4 5 1 3 4 5 2 3 4 3 3 3 >> diff(X,1,2) ans =
1 0 1 -4 1 1 1 1 0 0
Nếu dim ≥ số chiều của ma trận thì hàm trả về mảng rỗng.
Nhờ hàm diff mà ta có thể tính đạo hàm một cách sơ bộ dựa vào dữ liệu mô tả một số hàm. Đạo hàm được định nghĩa như sau:
dy/dx = limh->0(f(x+h)-f(x))/h. Nên đạo hàm của hàm f(x) có thể được tính một cách xấp xỉ dựa vào công thức: y’ = (f(x+h)-f(x))/h, hay còn gọi là số gia của y chia cho số gia của x.
Ví dụ: Tính đạo hàm của hàm y=sinx trên đoạn [-pi,pi]. Nghiệm đúng y’=cosx. Để tính gần đúng ta thực hiện chia đoạn cần tính thành 100 khoảng.
%script file: daoham.m clc; x=linspace(-pi,pi,100); y=sin(x); dy=diff(y); dx=diff(x); dyx=dy./dx; dyx=[dyx 0]; plot(x,y,'*',x,dyx)
CHƯƠNG 5 ĐỒ HOẠ HAI CHIỀU 5.1 Sử dụng lệnh plot
Vẽ một đường
Phần lớn các câu lệnh để vẽ đồ thị trong mặt phẳng đều là lệnh plot. Lệnh plot vẽ đồ thị của một mảng dữ liệu trong một hệ trục toạ độ thích hợp, và nối các điểm bằng đường thẳng.
Ví dụ: script file x = linspace(0,pi,50); y = tan(sin(x)) - sin(tan(x)); plot(x,y,'--p','LineWidth',1,... 'MarkerEdgeColor','r',... 'MarkerFaceColor','r',... 'MarkerSize',5)
(Dấu ‘…’ dùng để nối câu lệnh khi xuống dòng)
Ví dụ này tạo 50 điểm theo chiều ngang của đồ thị trong đoạn [0,pi], và tạo một vector y = tansinx-sintanx. Lệnh plot mở ra một cửa sổ đồ hoạ figure, trong cửa sổ này tạo độ chia phù hợp với dữ liệu, vẽ đồ thị qua các điểm, và đồ thị
được tạo thành bởi việc nối các điểm này bằng đường nét liền. Các thang chia số và dấu được tự động cập nhật vào, nếu cửa sổ figure đã tồn tại, plot xoá cửa sổ hiện thời và thay vào đó là cửa sổ mới.
Vẽ nhiều đường
Ví dụ: vẽ hai đường cos(x) và sin(x) trên cùng một hệ trục toạ độ. >> x=linspace(0,2*pi,1000);
>> y=sin(x); >> z=cos(x); >> plot(x,y,x,z)
Ví dụ này cho thấy ta có thể vẽ nhiều đường trên cùng một hệ trục toạ độ bằng cách đưa thêm vào plot một cặp đối số, plot tự động vẽ đồ thị thứ hai bằng màu khác trên màn hình. Nhiều đường cong có thể cùng vẽ một lúc nếu ta cung cấp đủ các cặp đối số cho lệnh plot.
Nếu một trong các đối số là ma trận và đối số còn lại là vector, thì lệnh
plot sẽ vẽ tương ứng mõi cột của ma trận với vector đó. Ví dụ:
>> w=[y;z]; >> plot(x,w)
Nếu thay đổi trật tự các đối số thì đồ thị sẽ xoay một góc bằng 900. Ví dụ:
>> plot(w,x)
Lệnh plot có một đối số
Nếu lệnh plot được gọi mà chỉ có một đối số, ví dụ plot(y) thì hàm plot
sẽ đưa ra một kết quả khác, phụ thuộc vào dữ liệu chứa trong y.
Nếu giá trị của y là một số phức, plot(y) tương đương với plot(real(y))
và plot(imag(y)). Trong tất cả các trường hợp khác thì phần ảo của y thường được bỏ qua.
Ví dụ:
>> y=[0+i 1+2i 2+4i 3+9i]; >> plot(y)
Mặt khác nếu y là phần thực thì plot(y) tương đương với
plot(1:length(y),y). Ví dụ:
>> x=linspace(0,2*pi,1000); >> y=sin(x);
>> plot(y)
5.2 Kiểu đường, dấu và màu
Trong Matlab khi vẽ đồ thị ta có thể khai báo kiểu màu, nét vẽ riêng bằng việc đưa vào plot một đối số thứ ba sau mỗi cặp dữ liệu của mảng. Các đối số tuỳ chọn này là một xâu ký tự, có thể chứa một hoặc nhiều hơn.
Nếu không khai báo màu thì Matlab sẽ chọn màu mặc định là blue. Kiểu đường mặc định là kiểu solid, còn về dấu, nếu không có dấu nào được chọn thì sẽ không có kiểu của dấu nào được vẽ.
Nếu một màu, dấu, và kiểu đường tất cả đều chứa trong một xâu, thì kiểu màu chung cho cả dấu và kiểu nét vẽ. Để khai báo màu khác cho dấu, ta phải vẽ cùng một dữ liệu với các kiểu khai báo chuỗi khác nhau.
Bảng màu, dấu và kiểu nét. Biểu tượng Màu Biểu tượng Dấu Biểu tượng Kiểu nét vẽ
b Xanh da trời . Điểm - Nét liền
g Xanh lá cây 0 Tròn : Đường chấm
r Đỏ x dấu x -. đường gạch
chấm
c Xanh xám + Dấu + -- đường gạch
gạch m Đỏ tím * Dấu * y Vàng s Vuông k Đen d Diamond w Trắng v Triangle(down) ^ Triangle(up) < Triangle(left) > Triangle(Right) p Pentagram h hexagram Ví dụ 1: >> x=linspace(0,2*pi,1000); >> y=sin(x); >> plot(x,y,'g--')
Ví dụ 2: >> x=linspace(0,2*pi,20); >> y=sin(tan(x)); >> plot(x,y,'m--+') 5.3 Kiểu đồ thị
Lệnh colordef cho phép lựa chọn kiểu hiển thị. Giá trị mặc định của
colordef là white. Kiểu này sử dụng trục toạ độ, màu nền, nên hình vẽ màu xám sáng, và tiêu đề của trục màu đen, có thể dùng lệnh colordef black. kiểu này sẽ cho ta nền trục toạ độ đen, nền hình vẽ màu tối xám, tiêu đề trục màu trắng.
5.4 Đồ thị lưới, hộp chứa trục, nhãn và lới chú giải
Lệnh grid on sẽ thêm đường lưới vào đồ thị hiện tại. Lệnh grid off sẽ bỏ các nét này.
Lệnh grid không có tham số đi kèm theo thì sẽ xen kẽ giữa chế độ on
và off. Matlab khởi tạo với grid off. Thông thường trục toạ độ có nét gần kiểu
solid nên gọi là hộp chứa trục. Hộp này có thể tắt đi với box off và box on sẽ khôi phục lại. Trục đứng và trục ngang có thể có nhãn với lệnh xlabel và
ylabel. Lệnh title thêm vào đồ thị tiêu đề ở đỉnh. Ví dụ: Tạo script file: ‘graphexample.m’ clc;
x=linspace(-10,10,50);% Tao mang x y=x.^2+sin(x);% Tao mang y
z=10*x.^2+cos(x);% mang z plot(x,y,'b--',x,z,'m*');% Ve z va y grid on% Tao luoi
xlabel('independent variable x');% Nhan x ylabel('independent variable y and z');% Nhan y
Thêm chuỗi ký tự vào đồ thị tại một vị trí được chọn: text(x,y,’string’)
trong đó x,y là toạ độ tâm bên trái của chuỗi văn bản. Ví dụ:
clc;
x=linspace(-10,10,50);% Tao mang x y=x.^2+sin(x);% Tao mang y
z=10*x.^2+cos(x);% mang z plot(x,y,'b--',x,z,'m');% Ve z va y grid on% Tao luoi
xlabel('independent variable x');% Nhan x ylabel('independent variable y and z');% Nhan y
title('y=x^2+sin(x) and z=10x^2+cos(x)');% Tieu de o dinh text(0,0,'(0,0)');%Toa do (0,0)
text(-6,400,'z=10x^2+cos(x)');%Toa do (-6,400) text(4,-100,'y=x^2+sin(x)');%Toa do (4,-100)
Thêm chuỗi văn bản bằng cách di chuột tới vị trí mong muốn
Lệnh gtext(string)
Ví dụ:
gtext('y=x^2+sin(x)'); gtext('z=10*x^2+cos(x)');
5.5 Kiến trúc hệ trục toạ độ
Matlab cung cấp công cụ để có thể kiểm soát hoàn toàn hình dáng và thang chia của cả hai trục đứng và ngang với lệnh axis. Do lệnh này có nhiều yếu tố, nên ở đây đề cập một số dạng hay dùng. Để biết chi tiết hơn về lệnh axis có thể mở help để xem trợ giúp trực tuyến của Matlab. Các đặc tính cơ bản của lệnh axis được cho trong bảng dưới đây.
Lệnh Mô tả
axis([xmin xmax ymin ymax])
Thiết lập các giá trị min, max của hệ trục dùng các giá trị được đưa ra trong vector hàng.
v=axis v là vector cột có chứa thang chia cho đồ thị hiện tại [xmin xmax ymin ymax]
axis auto Trả lại giá trị mặc định thang chia axis(‘auto’) xmin=min(x), xmax=max(x),…
axis manual Giới hạn thang chia như thang chia hiện tại
axis xy
Sử dụng (mặc định) hệ toạ độ decac trong đó gốc toạ độ ở góc thấp nhất bên trái, trục ngang tăng từ trái qua phải, trục đứng tăng từ dưới lên trên.
axis ij
Sử dụng hệ toạ độ ma trận, trong đó gốc toạ độ ở đỉnh góc trái, trục đứng tăng từ đỉnh xuống, trục ngang tăng từ trái qua phải.
axis square Thiết lập đồ thị hiện tại là hình vuông, so với mặc định hình chữ nhật.
axis equal Thiết lập thang chia giống nhau cho cả hai hệ trục.
axis tightequal Tương tự như equal nhưng hộp đồ thị vừa đủ đối với dữ liệu
axis normal Tắt chế độ axis equal, equal, tight và 3D axis off
Tắt bỏ chế độ nền trục, nhãn, lưới và hộp dấu. Thoát khỏi chế độ lệnh tight và bất cứ lệnh label nào, và thay bởi lệnh text và gtext axis on Ngược lại với lệnh axis off nếu chúng có thể
5.6 In hình
Để in hình vừa vẽ hoặc các hình trong chương trình của Matlab đã dược tạo, ta có thể dùng lệnh từ bảng chọn hoặc đánh lệnh in từ cửa sổ lệnh.
In bằng lệnh từ bảng chọn
Trước tiên chọn cửa sổ hình là cửa sổ hoạt động bằng cách nhấn chuột lên đó, sau đó chọn mục bảng chọn print từ bảng chọn file. Dùng các thông số tạo nên trong mục bảng chọn print Setup, đồ thị hiện tại sẽ được gửi ra máy in.
In bằng lệnh từ cửa sổ lệnh
Chọn cửa sổ hình làm cửa sổ hoạt động bằng cách nhấn chuột lên đó hoặc dùng lệnh figure(n). Sau đó dùng lệnh in print
Lệnh orient thay đổi kiểu in. Kiểu mặc định là kiểu portrait, in theo chiều đứng, ở giữa trang. Kiểu Lanscape là kiểu in ngang. Kiểu in tall là kiểu in đứng nhưng kín toàn bộ trang. Để thay đổi kiểu in khác với kiểu mặc định, ta có thể dùng lệnh orient với các thông số của nó như sau:
>>orient ans= portrait >>orient landscape >> orient tall 5.7 Thao tác với đồ thị Lệnh hold
Thêm nét vẽ vào đồ thị đã có sẵn bằng lệnh hold. Khi thiết lập hold on, Matlab không bỏ đi hệ trục đã tồn tại trong khi lệnh plot mới đang thực hiện, thay vào đó, nó thêm đường cong mới vào hệ trục hiện tại. Tuy nhiên nếu dữ liệu không phù hợp với hệ trục toạ độ cũ, thì trục được chia lại.
Lệnh hold off bỏ đi cửa sổ figure hiện tại và thay vào đó bằng một đồ thị mới. Lệnh hold mà không có đối số sẽ bật tắt chức năng của chế độ thiết lập
hold trước đó. Ví dụ: clc
x=linspace(0,pi,1000);
y=sin(x); plot(x,y); hold on
ishold% Ham tra ve 1 neu hold o trang thai on z=cos(x); plot(x,z,'r --'); hold off ishold axis([0 pi -1 1]); gtext('sinx'); gtext('cosx');
Tạo nhiều cửa sổ figure
Nếu muốn hai hay nhiều đồ thị ở các cửa sổ khác figure nhau, có thể dùng lệnh figure trong cửa sổ lệnh hoặc chọn new figure từ bảng chọn file,
figure không có tham số sẽ tạo một figure mới. Ta có thể chọn kiểu figure
bằng cách dùng chuột hoặc dùng lệnh. figure(n) trong đó n là số cửa sổ hoạt