228 Chương 9
ĐỒ HỌA TRONG MATLAB
9.1 ĐỒ HỌA HAI CHIỀU
Rất nhiều các bài toán khoa học, kĩ thuật và kinh tế cần được diễn giải và
phân tích để rút ra các thông tin liên quan. Đặc biệt trong hầu hết lĩnh vực mô
phỏng các quá trình khoa học và công nghệ chúng ta phải đối mặt với những tập
dữ liệu rất lớn mà không thể phân tích mà thiếu các phần mềm biểu diễn dữ liệu.
Trong phần này chúng ta sẽ nghiên cứu các công cụ biểu diễn dữ liệu hai
chiều và quá trình biến đổi dữ liệu theo thời gian. Trong các chương trước, chúng
ta đã được làm quen với một số lệnh vẽ đồ thị 2 chiều như: plot, xlabel, ylabel,
text, gtext, loglog, semilogx, semilogy, axis, grid on, hold on, figure và legend.
9.1.1 Hệ toạ độ Semilogarithm
Các thủ tục loglog,semilogx, semilogy thích hợp các tập dữ liệu biến đổi
lớn, đặc biệt các quá trình biến đổi (tiệm cận) theo hàm mũ, hàm luỹ thừa.
Thí dụ 1. Vẽ đồ thị của hàm ( )
1
x
x
f x
e
bằng plot và semilogy:
Hình 9.1 Vẽ đồ thị hàm ( )
1
M (x,y)
(r, )
r
O x
Hình 9.3 Hệ tọa độ Đề các và hệ tọa độ cực
Hàm POLAR
Cú pháp:
polar (Theta, R,Symbol)
230
Giải thích. Hàm POLAR vẽ đồ thị hàm số trong hệ tọa độ cực.
- Theta : vector trị số góc từ trục cố định đến bán kính, đơn vị đo là radian;
- R : giá trị của hàm R=R(Theta) ;
- Symbol là một xâu qui định kiểu vẽ (xem plot).
Thí dụ 2.
>> t = 0:.01:2*pi;
>> polar(t,sin(2*t).*cos(2*t),' r')
Hình 9.4 Vẽ đồ thị hàm số bằng hàm POLAR
9.1.3 Lưu trữ đồ thị
Có thể lưu trữ đồ thị vào file hoặc in đồ thị bằng hàm PRINT.
Cú pháp:
print [-driver] [-options] [ filename]
Giải thích.
print : in đồ thị hiện tại ra máy in mặc định;
print –f2 hay print(2) : in đồ thị figure (2);
print <filename> : lưu đồ thị dưới dạng file PostScript, mặc định *.ps.
Tham số driver: thường bắt đầu bằng chữ ‘-d’.
biểu đồ. Mặc định của width là 0.8. Nếu width > 1 thì các cột biểu đồ sẽ chồng
ken vào nhau.
bar(X,Y,'grouped') : vẽ biểu đồ theo nhóm cột đứng (mặc định).
bar(X,Y,'stacked') : vẽ biểu đồ theo nhóm xếp đống .
Thí dụ 5.
>> Y=hilb(10); y=Y([1:3],[1:2:9]);
>> figure(1), bar(y);
>> xlabel(‘ Truc I’);ylabel(‘Truc J’);
>> figure(2), bar(y,’stacked’);
>> xlabel(‘ Truc I’);ylabel(‘Truc J’);
232
Figure 1
Hình 9.5 Đồ thị bar ‘group’
Figure 2
Hình 9.6 Đồ thị bar ‘stacked’
9.1.5 Biểu diễn sai số ( Error Bars)
Khi xử lí dữ liệu, ta thường quan tâm đến mức độ thiếu chính xác của chúng
do dung sai thiết bị hay sự không hoàn hảo của môi trường thực nghiệm. Để mô
tả sai số có thể sử dụng hàm ERRORBAR .
233
Các phương án sử dụng:
errorbar(X,Y,L,U) : Vẽ đồ thị của vector Y đối với vector X cùng với các
khoảng sai số xác định bởi các vector L và U. L và U chứa các sai số giới hạn
dưới và trên của mỗi phần tử của Y. Mỗi ERRORBAR có độ cao là L(i) + U(i)
được vẽ bởi một doạn thẳng. Các vector X,Y,L và U phải cùng cỡ.
errorbar(X,Y,E) hay errorbar(Y,E): Vẽ đồ thị của vector Y với
trong SURF).
contour(Z,N) và contour(X,Y,Z,N): vẽ N đường mức lồng nhau với các giá
trị độ cao được chọn tự động.
contour(Z,V) và contour(X,Y,Z,V): vẽ N = length(V) đường mức với các
giá trị độ cao xác định bởi vector V.
[C,H] = contour( ), C = contour( ): Trả về ma trận C như trong
contourc và vector cột h điều khiển các đối tượng LINE hoặc PATCH (mảnh).
Cả hai đối tượng này được sử dụng làm tham số trong clabel. Màu đường mức là
các màu chuẩn của bản đồ.
contour( ,'linespec'): Vẽ các đối tượng LINE với màu và kiểu đường xác
định bởi linespec. Sử dụng mã R. Pawlowicz để quản lý các tham số mặt và nhãn
đường mức.
Thí dụ 7.
>> [C,H] = contour(peaks(20),10); colormap autumn
Hình 9.8 Đồ thị CONTOUR
235
9.2.2 Hàm CONTOUR3
Cú pháp:
contour3(Z)
contour3(Z,N)
contour3(Z,V)
contour3(X,Y,Z)
contour3(X,Y,Z,n)
contour3(X,Y,Z,V)
contour3( ,'linespec')
[C,H] = contour3( )
Giải thích. Hàm CONTOUR3 vẽ đồ thị contour 3 chiều.
contour3( ) có các tham số giống như contour( ),chỉ khác ở cách vẽ tương
Z = peaks(N) : Tạo ra một ma trận cỡ N×N;
Z = peaks(V) : Tạo ra một ma trận cỡ N×N, với N=length(V);
Z = peaks(X,Y) : Hàm Z được tính theo X và Y. X, Y và Z có cùng cỡ.
Giải thích. PEAKS là hàm mẫu 2 biến để minh hoạ cho các thủ tục vẽ đồ
thị. Khi gọi peaks, peaks(N), peaks(V) hay peaks(X,Y) Matlab vẽ một đồ thị
dạng SURF từ hàm PEAKS.
Thí dụ 9.
clear ;
p=peaks(30);
cs=contour(p,10);
clabel(cs,’manual’);
grid on;
Thí dụ 10.
>> peaks
z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2)
- 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2)
- 1/3*exp(-(x+1).^2 - y.^2)
237
Hình 9.10 Đồ thị CONTOUR của hàm PEAKS và
tác dụng của CLABEL
Hình 9.11 Đồ thị SURF của hàm PEAKS
9.2.5 Các mặt tham số
Xét một mặt cong, trong đó toạ độ của các điểm trên mặt cong phụ thuộc
vào các tham số. Thí dụ một mặt cong được xác định như sau:
x = f(
,
có thể cấu trúc một mặt cong bằng cách xoay một đường cong quanh một điểm
cố định. Phương trình của Hình 3 lá có dạng:
r = a sin3
, [0,2
],
với r là khoảng cách tính từ gốc toạ độ và a là độ dài một lá. Các tham số toạ độ
cực này dễ dàng chuyển sang toạ độ Đề các:
x= r cos
= a sin3
cos
, y =r sin
= a sin3
sin
.
Tiếp theo ta chuyển Hình 3 lá xa gốc toạ độ một khoảng cách R và quay tròn
hình đó quanh trục z. Khi đó ta có:
x= (R + a sin3
cos
) sin
Thí dụ 11. Vẽ đồ thị mặt cong tham số của các phương trình trên:
% MATLAB code demontrating cropping surfaces
clear
colormap(aquamarine);
n=50;
phi=[ 0:2*pi/n:2*pi];
239
psi=[ 0:2*pi/n:2*pi];
R = 5 ; r = 2 ; a = 0.5 ;
for i=1:length(phi)
for j =1:length(psi)
z(i,j) = (r + a*sin(6*psi(j)))*sin(phi(i));
y(i,j) = R*sin(psi(j)) + (r + a*sin(6*psi(j)))*cos(phi(i))*sin(psi(j));
x(i,j) = R*cos(psi(j)) + (r + a*sin(6*psi(j)))*cos(phi(i))*cos(psi(j));
c(i,j) =0.8;
end;
end;
mesh(x,y,z,c);
axis([-7 7 -7 7 -7 7]);
axis('square');
Hình 9.12 Đồ thị dạng MESH của mặt cong 3 lá
9.2.6 Hàm SURF: Vẽ đồ thị màu dạng mặt cong 3-D
Các phương án sử dụng:
surf(X,Y,Z,C): vẽ đồ thị dạng mặt cong xác định bởi 4 ma trận X, Y, Z, C.
Điểm quan sát xác định bởi VIEW. Phạm vi của các trục toạ độ xác định bởi
phạm vi của X, Y, Z. Các ma trận X và Y phải có cùng cỡ với Z. Các điểm trên
mặt tương ứng bộ ba (X(i,j),Y(i,j), Z(i,j)). Thang màu xác định bởi C hoặc xác
định bởi giá trị hàm CAXIS hiện tại , như chỉ thị trong COLORMAP hiện tại.
R=9; r =1.5;
for i=1:length(phi)
for j=1: length(psi)
z(i,j)= r/10*sin(phi(i));
y(i,j)=R*sin(psi(j))+ r*cos(phi(i))*sin(psi(j));
x(i,j)=R*cos(psi(j))+ r*cos(phi(i))*cos(psi(j));
241
c(i,j) = 1;
end;
end;
hold on; surf(x,y,z,c); hold off;
view([120 25]); grid on;
xlabel(' X'); ylabel(' Y');zlabel('Z'); Hình 9.13 Minh họa đồ thị dạng SURF của mặt cong trong thí dụ 12
Thí dụ 13.
clear ;
colormap(gray);
n=65;
theta =pi*[-n:2:n]/n;
phi = [ 0:2*pi/n:2*pi];
psi=phi;
R = 5; a=1;
for i=1:length(phi)
for j=1: length(psi)
z(i,j)= -a*sin(3+phi(i))*sin(phi(i));;
y(i,j)=(R+a*sin(3*phi(i))*cos(phi(i)))*cos(psi(j));
Giải thích. Thủ tục MOVIE trình chiếu các khuôn hình (frame).
movie(M): biểu diễn dãy M một lần. M phải là dãy các khuôn hình thường
được tạo bởi lệnh GETFRAME.
movie(M,N): biểu diễn N lần. Nếu N<0 thì mỗi biểu diễn là một tiến và một
lần lùi. Nếu N là vector, phần tử đầu tiên là số lần biểu diễn và các phần tử còn
lại kết hợp thành một danh sách các khuôn hình để biểu diễn. Thí dụ nếu M có 4
khuôn hình thì N = [10 4 4 2 1] biểu diễn 10 lần và mỗi lần biểu diễn khuôn
hình 4, tiếp theo 4, rồi 2 và 1.
movie(M,N,fps): biểu diễn fps khuôn trong 1 giây. Mặc định của fps là 12.
Tuy nhiên tốc độ có thể chậm hơn nếu tính năng của PC kém.
Thủ tục getframe. Tạo khuôn hình cho thủ tục MOVIE. Thủ tục này lấy
1 khuôn hình từ đồ thị hiện tại và gán cho một biến. Thủ tục getframe thường
được sử dụng trong vòng lặp FOR để tạo thành dãy khuôn hình trình diễn trong
MOVIE.
Thí dụ 14.
for j=1:n
<plot_command>
M(j) = getframe;
end
movie(M);
Các chương trình minh hoạ:
Chương trình 1 (Chiếc vòng quay)
clear ;
n=32;
M=moviein(n);
phi=[0:0.1:2*pi];
R = 5; r =2 ; Rmax =R+r+1;
for j=1:n
x1 = R*cos(phi);
y1 = R*sin(phi);