Tải bản đầy đủ (.pdf) (49 trang)

Bài giảng Giải tích mạch và mô phỏng trên máy tính: Phần 2 ĐH Phạm Văn Đồng

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.8 MB, 49 trang )

Chương 4. CÁC LỆNH ĐIỀU KHIỂN TRONG MATLAB
4.1. Các lệnh rẽ nhánh:
4.1.1. Lệnh if … end

if ... end, switch ... end

Nhiều khi chúng ta cần những câu lệnh được thực hiện theo một điều kiện nào đó.
Trong ngôn ngữ lập trình, logic này được cung cấp bởi cấu trúc if … end. Cú pháp của
cấu trúc này như sau:
If < biểu thức điều kiện>
khối các lệnh...
end
Khối các lệnh giữa hai trạng thái if và end được thực hiện khi tất biểu thức điều kiện
là đúng. Trong trường hợp điều kiện bao gồm các điều kiện con, thì tất cả các điều kiện
con được tính và trả về một trạng thái logic của điều kiện.
Ví dụ:
apple = input('nhap vao so tao:')
cost = apple*25;
if apple > 5
cost = (1-20/100)*cost;
end

Trong trường hợp có hai điều kiện thay đổi, cấu trúc if-else-end là:
Biểu thức điều kiện

if

Khối các lệnh được thực hiện nếu điều kiện là đúng
else
Khối các lệnh được thực hiện nếu điều kiện là sai
end


Khi có ba hoặc nhiều điều kiện thay đổi, cấu trúc của nó sẽ là:
if

Biểu thức điều kiện 1
Khối các lệnh được thực hiện nếu điều kiện 1 là đúng

elseif Biểu thức điều kiện 2
Khối các lệnh được thực hiện nếu điều kiện 2 là đúng
elseif Biểu thức điều kiện 3
Khối các lệnh được thực hiện nếu điều kiện 3 là đúng
elseif Biểu thức điều kiện 4
31


.

.

.
else
Khối các lệnh được thực hiện nếu không có điều kiện nào đúng.
End
Trong mẫu dạng này thì khi biểu thức điều kiện đầu tiên đúng thì các câu lệnh sau
không được kiểm tra nữa, các cấu trúc if-else-end còn lại được bỏ qua. Hơn nữa câu lệnh
else ở cuối có thể không cần cho vào.
Ví dụ 1: Giải phương trình bậc nhất dạng tổng quát sau: ax + b = 0
Nhận xét:
Khi a ≠ 0 thì phương trình có nghiệm x = -b/a
Khi a = 0 thì xét hệ số b
Nếu


b ≠ 0: phương trình vô nghiệm
b = 0: phương trình có vô số nghiệm

Từ đó ta xây dựng chương trình matlab như sau:
a=input('nhap a=');
b=input('nhap b=');
if a~=0
x=-b/a;
fprintf('nghiem so x=%9.5g\n',x);
else
if b~=0
disp('ptvn')
else
disp('ptvsn')
end
end

Tương tự ta xét ví dụ 2: Giải phương trình bậc 2 có dạng tổng quát sau:
ax2 + bx + c = 0 (a ≠ 0).
Lập luận và đưa tới chương trình sau:
disp('giai phuong trinh bac hai')
a=input('nhap a=');
b=input('nhap b=');
c=input('nhap c=');
delta=b^2-4*a*c;
d=delta;
if d<0

32



disp('phuong trinh co hai nghiem phuc')
x1=(-b-j*sqrt(d))/(2*a);
x2=(-b+j*sqrt(d))/(2*a);
fprintf('nghiem so x1=%9.5g\n',x1);
fprintf('nghiem so x2=%9.5g\n',x2);
else
if d==0
disp('phuong trinh co hai kep')
x1=-b/(2*a);
x2=x1;
fprintf('nghiem kep x1=x2=%9.5g\n',x1);
else
x1=(-b-sqrt(d))/(2*a);
x2=(-b+sqrt(d))/(2*a);
fprintf('nghiem so x1=%9.5g\n',x1);
fprintf('nghiem so x2=%9.5g\n',x2);
end
end

4.1.2. Lệnh switch ... end
Khi một chuỗi các lệnh đánh giá dựa trên một biểu thức thử hoặc biểu thức điều
kiện với nhiều giá trị thử khác nhau, người ta thường dùng cấu trúc switch-end. Cấu trúc
switch-end có dạng như sau:
switch biểu thức điều kiện
case giá trị thử 1
khối lệnh 1
case { giá trị thử 2, giá trị thử 3, giá trị thử 4}
khối lệnh 2

otherwise
khối lệnh 3
end
Ở đây biểu thức điều kiện phải là dạng số hoặc dạng chuỗi, nếu biểu thức điều kiện
là dạng số thì lệnh case sẽ thử xem giá trị của biểu thức đó có bằng giá trị thử i hay không.
Nếu biểu thức điều kiện là một chuỗi thì lệnh case sẽ so sánh chuỗi đó với giá trị thử i.
Trong ví dụ trước, biểu thức điều kiện được đem so sánh với giá trị thử 1, nếu chúng bằng
nhau thì khối lệnh đầu tiện được thực hiện, mà các khối lệnh tiếp theo cho đến trước trạng
thái end được bỏ qua, nếu chúng không bằng nhau thì điều kiện tiếp tục được đem so sánh
với giá trị thử 2, giá trị thử 3, giá trị thử 4, nếu một trong các giá trị này bằng biểu thức
điều kiện thì khối lệnh 2 được thực hiện. Nếu tất cả các lệnh so sánh của case đều không
33


đúng thì khối lệnh 3 được thực hiện. Chú ý rằng trong cấu trúc switch-end có ít nhất một
nhóm lệnh phải được thực hiện. Sau đây là một ví dụ về cấu trúc switch-end.
Ví dụ: Bài toán phân loại học sinh: điểm 9-10 xếp loại giỏi, điểm 7-8 xếp loại khá,
điểm 5-6 xếp loại trung bình; điểm 1,2,3,4 xếp loại yếu; nếu điểm vào không phải số
nguyên nằm giữa 1 và 10 thì thông báo điểm không hợp lệ.
n = input ('nhap diem: ');
disp('phan loai:');
switch n
case {0,1,2,3,4}
disp('loai yeu');
case {5,6}
disp('loai trung binh');
case {7,8}
disp('loai kha');
case {9,10}
disp('loai gioi');

otherwise
disp('diem khong hop le');
end

Nhận xét: Cấu trúc IF…END chỉ hữu ích trong trường hợp chỉ có một vài lựa chọn.
Còn khi có một số lượng lớn các lựa chọn khả dĩ, thông thường ta sử dụng cấu trúc
SWITCH …END để thay thế.
4.2. Các lệnh lặp: for ... end, while ... end
4.2.1. Lệnh lặp for … end
MATLAB có phiên bản riêng của nó về vòng lặp "FOR" tìm thấy trong các ngôn
ngữ máy tính. Nó cho phép một câu lệnh, một nhóm lệnh, được lặp lại một số lần cố định
xác định trước.
Cú pháp:
for chỉ số = biểu thức
nhóm lệnh A;
end
Diễn đạt : Nếu thỏa điều kiện thì sẽ thực hiện lệnh của vòng lặp. Đến khi không thỏa điều
kiện thì sẽ thoát ra khỏi vòng lặp.
Qui tắc thực hiện:
- Chỉ số của vòng lặp phải là biến.
- Nếu ma trận biểu thức là rổng thì không thực hiện vòng lặp.

34


- Nếu biểu thức là một đại lượng vô hướng vòng lặp thực hiện 1 lần và chỉ số nhận
giá trị của đại lượng vô hướng.
- Nếu biểu thức là một vector hàng, số lần lặp bằng số phần tử trong vector. Sau mỗi
lần lặp chỉ số nhận giá trị tiếp theo của vector.
- Nếu biểu thức là một ma trận thì số vòng lặp bằng số cột của ma trận, sau mỗi vòng

lặp thì chỉ số sẽ nhận giá trị cột tiếp theo của ma trận.
- Khi kết thúc vòng lặp chỉ số nhận giá trị cuối cùng.
- Có thể dùng toán tử: Trong vòng lặp for i = chỉ số đầu : gia số : chỉ số cuối. Và số
vòng lặp được tính = (chỉ số cuối – chỉ số đầu)/ số gia + 1.
Ví dụ xét chương trình sau:
n=input('nhap vao n= ')
for k=n
s=1;
s=s+k
end
Chạy chương trình:
nhap vao n= 2
n=
2
s=
3
nhap vao n= [3 4 5]
n=
3 4 5
s=
4
s=
5
s=
6
nhap vao n= [1 2 3,4 5 6]
n=
1 2 3 4 5 6
s=
2

s=
3
s=
4
s=
5
s=

35


6
s=
7

Một điểm quan trong là: mỗi vòng lặp for phải gắn với từ khóa end. Nếu đơn giản
vào lệnh
for i = 1:n, x(i) = 0
thì hệ thống sẽ kiên nhẫn chờ nhập các lệnh còn lại trong thân vòng lặp. Không có gì xảy
ra đánh vào end.
Ví dụ :Thực hiện hàm .m file tính tổng
S = 1 + 2 + 3 + …+ n
disp('tinh tong');
n=input('nhap so hang can tinh tong n=');
s=0;
for i=1:n
s=s+i;
end
fprintf('tong so s=%2.5g\n',s);


4.2.2. Lệnh lặp while … end
MATLAB cũng có phiên bản về vòng lặp "WHILE", cho phép một lệnh hoặc
nhóm lệnh lặp lại với số lần không xác định, dưới điều khiển của một điều kiện logic.
Được sử dụng khi số lần lặp không được biết trước. Quá trình lặp sẽ chấm dứt khi
một điều kiện xác định nào đó được thỏa. Cấu trúc của vòng lặp while như sau:
while expression
statements
end
Trong đó:
expression : Điều kiện của vòng lặp
statements : Lệnh hoặc nhóm lệnh thực thi của vòng lặp.
Diễn đạt: Nếu thỏa điều kiện thì sẽ thực hiện lệnh của vòng lặp. Hàm while được sử dụng
khi chưa biết số lần lặp, trong khi hàm for được sử dụng khi đã biết rõ số lần lặp.
Ví dụ: tính n!
n! = 1.2.3.4.5…….n
Chương trình:
disp('tinh giai thua');

36


n=input('nhap so hang can tinh giai thua n=');
GT=1;
i=1;
while i<=n
GT=GT*i;
i=i+1;
end
fprintf('tong so s=%2.5g\n',GT);


4.3. Các lệnh chuyển trong vòng lặp
Hai lệnh hữu ích rất hay được sử dụng để điều khiển chu trình tính toán là continue
và break. Trong vòng lặp for hay while, khi gọi continue ngay lập tức chu trình tính
chuyển sang bước lặp kế tiếp, mọi lệnh chưa thực hiện của vòng lặp (thuộc về bước lặp
hiện tại) sẽ bị bỏ qua.
Lệnh break còn mạnh hơn: Ngừng vòng lặp đang tính. Lệnh break có tác dụng
trong cả các cấu trúc rẻ nhánh dùng if, switch.
Ví dụ sau sẽ minh họa các nội dung vừa đề cập đến trong mục này với nội dung:
Cần kiểm tra xem trong các số nguyên thuộc khoảng 3-7, số nào là số nguyên tố. Việc
kiểm tra này được thực hiện ở mạch vòng bên ngoài.
for m = 3 : 1 : 7,
for n = 2: 1 : m-1,
if mod(m,n)~= 0, continue, end
fprintf(' %2d khong phai la so nguyen to!\n', m)
break
end
if n == m-1,
fprintf('!! %2d la so nguyen to!\n', m)
end
end

Mạch vòng có nhiệm vụ: Lần lượt chia số cần kiểm tra m cho tất cả các số trong
khoảng từ 2 đến (m-1), sau đó kiểm tra xem số dư mod(m,n) của phép chia có khác 0 hay
không. Nếu số dư bằng 0, khi ấy m chia hết cho n và lệnh continue không được gọi, lệnh
fprintf xuất thông báo lên màn hình. Nếu số dư khác 0, khi ấy m không chia hết cho n và
lệnh continue có hiệu lực, lệnh fprintf và break bị bỏ qua để chuyển sang kiểm tra vòng
lặp mới với n lớn hơn. Nếu m không chia hết cho các số trong khoảng từ 2 đến (m-1), mà
chỉ chia hết cho 1 và bản thân m, khi ấy m là số nguyên tố, và vì vậy vòng lặp phía trong
đã được rời bỏ bởi lệnh break để tiếp tục các lệnh thuộc vòng lặp phía ngoài. Matlab đưa
ra kết quả ngoài màn hình như sau:

!! 3 la so nguyen to!
4 khong phai la so nguyen to!
!! 5 la so nguyen to!

37


6 khong phai la so nguyen to!
!! 7 la so nguyen to!

Lệnh chuyển đến cuối m-file
Nếu break được sử dụng ngoài vòng for, while trong phạm vi một script hay
function của Matlab, khi ấy script file và function sẽ bị ngừng tại vị trí của break.
Ví dụ: Viết chương trình nhập vào một số n (n>=0) với các trường hợp sau:
a) Nếu n < 0 thì in thông báo bạn nhập sai
b) Nếu n > 0 và lẽ thì tính tổng s1=1+3+5+...+n, n là số lẽ.
c) Nếu n > 0 và chẵn thì s2=2+4+6+...+n, n chẵn.
d) Nếu n = 0 dừng chương trình lại.
Giải:
n=input('nhap n= ');
% nhap so n
du=rem(n,2);
% kiem tra so n la chan hay le
% neu n le =1, n chan du = 0
if n<0
fprintf('Ban nhap sai') % xuat ra thong bao
end
if (n>0) & (du==1)
% neu n>0 và le
i=1;

% gan i=1;
s1=1;
%gan tong s1=1
while i% thuc hien vong lap
i=i+2;
% tang i len 2 sau moi vong lap
s1=s1+i;
% tinh tong s1 voi gia tri i moi
end
s1
% in ra ket qua sau khi ket thuc vong lap
end
if (n>0) & (du==0)
i=0;
s2=0;
while ii=i+2;
s2=s2+i;
end
s2
end
if n==0
% neu n=0
break
% lenh ket thuc
end

Khi chạy chương trình:
» vidu


38


nhap n= 5
s1 =
9
» vidu
nhap n= 4
s2 =
6
» vidu
nhap n= -6
Ban nhap sai
» vidu
nhap n= 0

4.4. Hàm tạm dừng
Lệnh PAUSE
a) Công dụng:
Dừng chương trình theo ý muốn.
b) Cú pháp:
pause on
pause off
pause (n)
c) Giải thích:
pause on: dừng chương trình, và chờ nhấn 1 phím bất kỳ (trừ các phím điều khiển)
chương trình thực hiện tiếp.bre
pause off: tắt chức năng pause.
pause (n): dừng chương trình tại n giây.

d) Ví dụ:
for n = 1 : 3;
disp(‘Press any key to continue…’)
pause
end
Chạy chương trình:
Press any key to continue…
Press any key to continue…
Press any key to continue…

39


Câu hỏi ôn tập chương 4
Câu 1: Trình bày nội dung của lệnh if … end trong trường hợp bài toán có hai điều kiện
thay đổi và có nhiều điều kiện thay đổi?
Câu 2: Trình bày nội dụng của lệnh Switch … end?
Câu 3: Viết và giải thích cấu trúc của lệnh vòng lặp for … end?
Câu 4: Viết và giải thích cấu trúc của lệnh vòng lặp while … end?
----------------------------------

40


Chương 5. ĐỒ HỌA TRONG MATLAB
5.1. Cơ sở đồ họa Matlab
Khuôn khổ của mọi thao tác xuất đồ hoạ trên nền Matlab là Figure. Có thể tạo ra cửa
sổ như hình 2.2 bằng cách gọi lệnh figure và mỗi figure sẽ tự động được đánh số.
>> figure
Có thể gọi một figure đã có số bằng lệnh figure(number). Số của figure sẽ hiển thị

nếu ta gọi gcf (Get hendle to Current figure).
>> gcf
ans =
1

Bằng lệnh subplots (row, column, counter), có thể chia đều một figure thành
nhiều subplots (đồ hoạ con) được counter (bộ đếm) đánh số ở phía trên bên trái. Nếu việc
đánh số chỉ cần một chữ số, chúng sẽ được viết tuần tự không cần dấu phẩy hay dấu cách.
Có thể xoá nội dung của một figure bằng lệnh clf (clear current figure), và
lệnh delete figure(number) sẽ xoá chính figure. Tương tự, lệnh close(number) sẽ đóng
figure mang số number còn lệnh close all sẽ đóng tất cả các figures đang mở. Có thể xem
đặc điểm của một figure bằng lệnh get, với lệnh set ta lại có thể lập đặc điểm cho figure.
Việc lập trình đồ hoạ trong Matlab luôn phụ thuộc vào đối tượng cụ thể và vô cùng
phong phú. Một công cụ làm nhẹ bớt công việc là trình soạn thảo đặc tính đồ hoạ
(property editor) với cửa sổ giới thiệu ở hình sau:

41


Việc phân chia thang bậc của trục thường được Matlab tự động thực hiện. Tuy
nhiên, ta có thể phân chia thủ công trong trường hợp hai chiều (2-D) bằng lệnh
axis([x_min,x_max,y_min,y_max]) và trong trường hợp ba chiều (3-D)
axis([x_min,x_max,y_min,y_max,z_min,z_max]). Lệnh axis(’auto’) sẽ trao quyền chia trục
lại cho Matlab. Lệnh grid on sẽ tạo ra một lưới toạ độ ứng với cách chia trục đã xác
định. Đối với đồ hoạ 3-D ta có thêm lệnh box on để tạo khung bao cho 3-D-Plot.
Để điền ký tự vào một đồ hoạ ta có nhiều khả năng khác nhau: Dùng
xlabel(string), ylabel(string), zlabel(string) để điền tên cho trục; dùng title(string) để
điền tên cho figure. Ngoài ra ta còn có thể viết các ký tự lên cao, tụt thấp hay các ký tự
Hy Lạp.
Bằng lệnh legend(string_1,string_2,…, [position]) ta có thể điền thêm một số lời

ghi chú vào đồ hoạ. Vị trí của lời ghi chú được xác định bởi số ghi trong [position],
với ý nghĩa: 1…4 sẽ đặt lời ghi chú vào 4 góc, 0 đặt tự động và -1 đặt vào bên phải, cạnh
đồ hoạ. Lệnh text(x_value,y_value,string) cho phép ta điền một đoạn văn bản với nội
dung string vào toạ độ bất kỳ x_value, y_value trong đồ hoạ.
Sử dụng lệnh zoom on | off để dùng chuột cắt và co dãn mảng đó. Ngoài ra,
cửa sổ figure còn có một vài nút cho phép dùng chuột điền đoạn văn bản, vẽ thêm
nét hoặc mũi tên, và mở Property Editor.
Có thể thêm thông tin chi tiết về xuất đồ hoạ ra mà hình bằng cách gọi help
graph2d, help graph3d và help specgraph.
5.2. Đồ họa 2 chiều
Lệnh plot (x_value,y_value …[,plotstyle]) vẽ đồ thị nối các điểm cho bởi cặp giá trị
x_value, y_value. Thông thường các điểm đó được nối bởi một nét liền.
Nếu ta nạp luân phiên nhiều vector x/y, ta sẽ thu được nhiều nét nối độc
lập với nhau. Nếu thiếu x_value, khi ấy các giá trị của y_value sẽ được vẽ theo thứ tự chỉ
số của chúng. Nếu y_value là các giá trị phức, khi ấy đồ thị vẽ với hai trục ảo và trục thực.
Lệnh stars cũng được viết với cú pháp tương tự nhưng sẽ tạo ra đồ thị bậc thang.

42


Chuỗi ký tự plotstyle cấu tạo bởi hai thành phần: Thành phần thứ nhất là
một chữ cái để chọn mầu và thành phần thứ hai là chuỗi ký hiệu đặc trưng cho
dạng chấm/ gạch nối tạo nên nét đồ thị.

Mỗi lần gọi mới lệnh plot, các đồ thị đã có trong Figure (hoặc trong Subplot) hiện
tại sẽ bị xoá. Có thể ngăn chặn các điều đó bằng cách gọi lệnh hold on sau lệnh plot đầu
tiên.

43



Lệnh fplot(function, range) trong ví dụ trên minh họa khả năng vẽ trực tiếp các
hàm tường minh.
Hai lệnh semilogx và semilogy cũng có cú pháp giống như plot với điểm khác duy
nhất: Hai trục x và y được chia thang logarithm. Lệnh loglog có tác dụng chia đồng thời cả
hai trục x và y theo thang logarithm.
Đồ thị BODE vẽ bằng lệnh bode:

5.3. Đồ họa 3 chiều
5.3.1. Các lệnh Plots
Lệnh plot3 có tác dụng tương tự như lệnh plot, điểm khác duy nhất là plot3 có thêm
vector số liệu thứ ba dành cho trục z.
44


Để biểu diễn các hàm 2 chiều dưới dạng mặt trong không gian ta sử dụng lệnh
surf(x_value, y_value, z_value… [, color]). Nếu x_value, y_value, z_value là các ma trận
có số hàng và số cột giống nhau, khi ấy các điểm của đồ hoạ sẽ được vẽ và nối liền thành
mặt.
Nếu các điểm có một khoảng cách đều đặn về phía hai trục x và y, khi ấy x_value
và y_value có thể chỉ là vector. Trong trường hợp này, các giá trị x_value được chuẩn theo
cột và y_value chuẩn theo hang của ma trận z_value.
Hai lệnh mesh và waterfall có cú pháp giống như surf, nhưng lại tạo ra mặt lưới
không điền đầy và đồ hoạ kiểu thác nước. Ngược lại contour lại vẽ nên các đường “đẳng
mức” (đường nối các điểm có cùng z_value).
Ngoài ra ta còn có thể thêm một ma trận color để xác định màu cho đồ hoạ. Mỗi
phần tử của color ứng với một phần tử của z_value. Các giá trị màu sẽ được sử dụng
trong một bảng màu, và ta có thể thay đổi bảng đó nhờ lệnh colormap(name). Nếu
không khai báo ma trận màu, Matlab sẽ tự động gán color = z_value. Dải màu có thể
được co dãn thang nhờ lệnh caxis (color_min, color_max).

45


5.3.2. Phối cảnh trong đồ hoạ 3 chiều
Có thể dùng lệnh view(horizontal,vertical) để phối cảnh cho đồ hoạ 3 chiều
bằng cách khai các góc theo phương nằm ngang và phương thẳng đứng tính bằng độ (o,
Degree). Góc chuẩn cho trước là (-37.5o, 30o). Ngoài ra, cũng có thể tạo dựng hay
thay đổi phối cảnh bằng cách nháy và kéo thả chuột, sau khi đã gọi lệnh rotate3d.
5.3.3. Nhập, xuất và in đồ hoạ
Nếu cần phải gán một File đồ hoạ có sẵn vào khuôn hình của Figure, ta có thể sử
dụng hai lệnh variable = imread(file,fmt) và image(variable).

Bằng lệnh imread ta gán File đồ hoạ với định dạng fmt cho biến variable. Nếu
variable nhận hình ảnh chỉ bao gồm gam màu xám, variable sẽ là một biến 2 chiều. Nếu
đó là hình ảnh mầu RGB, variable sẽ là một mảng 3 chiều. Định dạng của đồ hoạ được
khai báo bởi fmt. Lệnh image (variable) sẽ xuất đồ hoạ mới gán cho variable ra màn hành
Figure có chứa ảnh với định dạng .jpg
Đồ hoạ Figure của Matlab cũng có thể được xuất sang các định dạng khác. Lệnh
print –fnumber sẽ in Figure mang số number ra máy in. Lệnh print –fnumber -dfmt file
sẽ xuất Figure thành file với các định dạng đồ hoạ khác. Ví dụ: bmp (Windows
bitmap), emf (Enhanced meta), eps (EPS level 1),
jpg (JPEG image), pcx
(Paintbrush 24-bit) hay tif (TIFF image, compressed). Để biết chi tiết hãy gọi lệnh help
print.
Nếu cần phải lưu lại để sau này xử lý, có thể cất các đồ hoạ đã thu được
thành File với định dạng fig của Matlab. Để cất hoặc ta đi theo menu File / Save as, hoặc
gọi lệnh saveas(handle, ‘file’ [,format]).
Lệnh saveas cất handle (Figure hiện tại, có thể dùng gcf để hỏi) thành tệp có
tên file với một trong các định dạng: ‘fig’ (File nhị phân), ‘m’ (gồm một File fig và một
File Script).

5.4. Thiết kế giao diện đồ họa
Tạo GUI bằng công cụ đồ hoạ: Trên đây ta đã xem xét cách tạo GUI bằng phương
pháp thủ công. Ta có thể tạo GUI bằng công cụ đồ hoạ. Khi nhập lệnh guide ta gọi trình
đồ hoạ (Graphics User Interface Development Environment) để soạn thảo layout. Kết quả
đầu tiên là ta có một layout rỗng.
46


Hình 5.1 Giao diện ban đầu của cửa sổ thiết kế GUI
Việc đầu tiên là ta thiết kế giao diện mong muốn. Ta sẽ dùng chuột kéo các phần tử
cần dùng từ bên trái và thả vào layout rỗng bên phải. Ta có thể dịch chuyển các phần tử
này đế các vị trí mong muốn và cân chỉnh bằng công cụ Alignment. Với mỗi phần tử ta
cấn xác định thuộc tính cho nó bằng cách bấm đúp vào phần tử hay bấm vào công cụ soạn
thảo thộc tính
Sau khi thiết kế xong ta lưu nó lại. Lúc này MATLAB tự động tạo ra file *.fig dùng
lưu giao diện vừa tạo và file *.m chưa các mã lệnh cần thực hiện. Việc cuối cùng là viết
các mã lệnh vào file *.m. Trong quá trình thiết kế ta có thể chạy thử xem sau mỗi bước
thiết kế đã đạt yêu cầu chưa bằng cách bấm vào ô chạy thử
Ví dụ tạo GUI: Giải phương trình bậc 2, Ta thiết kế một giao diện như sau:

47


Hình 5.2 Cửa sổ giao diện giải phương trình bậc 2
Trước hết ta gọi guide và có được một layout rỗng. Vào Property Inspector (ô soạn
thảo thuộc tính) và ghi vào Name chuỗi ‘giaiphuongtrinhbac2’ và chấp nhận thuộc tích
Tag mặc định của nó là figure1; dùng Font chữ mặc định, cỡ chữ 12, bold. Ta dùng ô Edit
Text để ghi lại các hệ số a, b, c nhập vào. Ta vào Property Inspector rồi chọn ô Tag, đặt
tên lần lượt là hesoa, hesob, hesoc và cũng dùng Font chữ mắc định, cỡ chữ 12 và bold.
Tương tự như vậy là cũng tạo tiếp một Static text để hiển thị kết luận phương trình có

nghiệm phân biệt, nghiệm kép hay vô nghiệm với thuộc tính Tag là ketluan, Font chữ mắc
định, cỡ chữ 12 và bold. Tiếp tục tạo 2 Static text để hiển thị kết quả hai nghiệm tương tự
như trên. Như vậy là ta đã thiết kế xong. Bây giờ ta lưu lại với tên là
giaiphuongtrinhbac2.fig và giaiphuongtrinhbac2.m.
Nhiệm vụ tiếp theo là ghi các lệnh cần thiết vào file giaiphuongtrinhbac2.m. File
này đã được MATLAB tự động tạo ra. Ta phải thêm vào đó các mã lệnh để khi bấm chuột
thì kết quả hiển thị trên ô kết luận và hai nghiệm X1 và X2. Ta sẽ ghi các mã lệnh này
vào phần:
function GIAIPT_Callback(hObject, eventdata, handles)

Do lệnh cần được
giaiphuongtrinhbac2.m là:

thực

hiện

48

khi

gọi

pushbutton.

Nội

dung

của



Chạy chương trình ta có kết quả sau:

49


Câu hỏi ôn tập chương 5
Câu 5.1: Trình bày cách tạo cửa sổ đồ họa để thực hiện thiết kế?
Câu 5.2: Hãy giải thích cách sử dụng các lệnh sau: gcf, subplots, clf, delete
figure(number), set?
Câu 5.3: Trình bày cách chèn kí tự vào một đồ họa như tên cho trục, tên cho figure?
Câu 5.4: Trình bày cấu trúc lệnh legend?
Câu 5.5: Trình bày cấu trúc lệnh zoom on | off ?
Câu 5.6: Đồ họa 2D là gì? Cấu trúc vẽ đồ họa 2D như thế nào? Cho ví dụ minh họa?
Câu 5.7: Trình bày cấu trúc lệnh plot3 trong đồ họa 3D?
Câu 5.8: Hãy nêu cách phối cảnh trong đồ họa?
Câu 5.9: Hãy viết các lệnh để nhập, xuất, in đồ họa?
Câu 5.10: Trình bày phương pháp tạo GUI bằng công cụ đồ họa?
Câu 5.11: Hãy tạo giao diện GUI và lập trình giải mạch điện với giao diện dưới đây:

Với yêu cầu:
- Nhập thông số các nhánh
- Lập trình cho kết quả dòng điện trên các nhánh.
-------------------------

50


Chương 6. CÁC BÀI TOÁN ĐẠI SỐ TUYẾN TÍNH VÀ


PHƯƠNG TRÌNH VI PHÂN
6.1 Tính toán với vectơ và ma trận
6.1.1 Khái niệm
Các dữ liệu đưa vào xử lý trong MATLAB đều dưới dạng ma trận. Ma trận A có n
hàng, m cột được gọi là ma trận cỡ nxm. Được ký hiệu Am x n, phần tử aij của ma trận Am x n
là phần tử nằm ở hàng thứ i, cột j. Ta chú ý một số ma trận sau:
- Ma trận đơn (số đơn lẻ) là ma trận 1 hàng 1 cột.
- Ma trận hàng (1 x m) số liệu được bố trí trên một hàng.
- Ma trận cột (n x 1) số liệu được bố trí trên 1 cột.
a. Qui định để định nghĩa một ma trận trong Matlab
Tên ma trận (có thể đến 31 ký tự), bắt đầu phải bằng chữ cái sau đó có thể là số, chữ
cái, các ký tự đặc biệt ... Tên đặt bên trái dấu bằng, bên phải dấu bằng là các phần tử của
ma trận, các phần tử của ma trận được đóng bằng dấu ngoặc vuông ([]), các phần tử trong
trong cùng một hàng được cách nhau bởi ký tự trống hoặc dấu phẩy (, ), các phần tử thuộc
các hàng khác nhau cách nhau bởi dấu (;).
b. Các phương pháp nhập một ma trận
- Liệt kê trực tiếp, ví dụ lệnh:
>> A = [1 2 3; 4 5 6; 7 8 9] 
Kết quả cho ra một ma trận có 3 hàng, 3 cột
- Nhập thông qua lệnh input, ví dụ lệnh:
>> input('Nhap gia tri cho ma tran A = ') 
Nhap gia tri cho ma tran A = [1 2 3; 4 5 6; 7 8 9] 
ans =
1

2

3


4

5

6

7

8

9

c. Hiển thị lại ma trận
Để hiển thị lại ma trận ta gõ tên ma trận sau ấn  , ví dụ:
>> A  sẽ cho ta ma trận A
A=
51


1

2

3

4

5

6


7
8
9
6.1.2 Xử lý trong ma trận
a. Tạo ma trận véctơ
Việc tạo ma trận véc tơ được thực hiện theo công thức sau:
Biến = giới hạn đầu : bước chạy : gới hạn cuối
Trong đó: Giới hạn đầu, giới hạn cuối, bước chạy: Là các số thực, bước chạy có thể
dương hoặc âm.
Ví dụ:
Tạo 1 vectơ a chạy từ 0 đến 0.6 với bước chạy tiến là 0.1
>> t = 0: 0.1:0.6 
a=
0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000
b. Gọi các phần tử trong ma trận
MATLAB cho phép ta xử lý đến từng phần tử của ma trận, để truy cập đến từng
phần tử của ma trận ta gọi chúng thông qua chỉ số của từng phần tử với các nội dung:
Tên của ma trận (chỉ số hàng, chỉ số cột), ví dụ:
>> A = [1:3; 4:6; 7:9]  (Tạo ma trận A có kích thước 3x3)
A=
1

2

3

4

5


6

7

8

9

>> B = A (1, 1) (xuất phần tử ở hàng 1, cột1)
B=
1
Chú ý:
Trong trường hợp ta muốn gọi tất cả các phần tử trong một hàng hoặc tất cả
các phần tử trong một cột ta dùng toán tử hai chấm (:), ví dụ:
>> C = A (2, :) (xuất các phần tử thuộc dòng 2 của ma trận A)
52


C=
4

5

6

>> D = A (:, 2) (xuất các phần tử thuộc cột 2 của ma trận A)
D=
2
5

8
6.2 Hệ phương trình đại số tuyến tính
Trong toán học (cụ thể là trong đại số tuyến tính), một hệ phương trình đại số tuyến
tính hay đơn giản là hệ phương trình tuyến tính là một tập hợp các phương trình tuyến
tính với cùng những biến số. Ví dụ:

Là hệ gồm ba phương trình với ba biến số x, y, z. Một nghiệm của hệ là một hệ
thống tuyến tính thỏa mãn các phương trình đã cho.
Dạng tổng quát:
Hình thức tổng quát của hệ phương trình đại số tuyến tính gồm n phương trình tuyến
tính với k biến số:

Hệ phương trình trên có thể được viết theo dạng phương trình ma trận: Ax=b
Với A là ma trận chứa các hệ số ai,j (ai,j là phần tử ở hàng thứ i, cột thứ j
của A); x là vector chứa các biến xj; b là vector chứa các hằng số bi. Tức là:

Nếu các biến số của hệ phương trình tuyến tính nằm trong các trường đại số vô
hạn (ví dụ số thực hay số phức), thì chỉ có ba trường hợp xảy ra:


Hệ không có nghiệm (vô nghiệm)
53




Hệ có duy nhất một nghiệm

Hệ có vô số nghiệm
Như vậy việc giải hệ phương trình tuyến tính thực chất là thực hiện phép toán về ma

trận, ta có:


Để giải hệ phương trình này ta lần lượt thực hiện các bước sau:
- Lập ma trận A, B;
- Lấy ma trận nghịch đảo A-1 ;
- Nghiệm X= A-1.B;
6.3 Giải thuật giải phương trình vi phân
Phương trình vi phân là biểu thức liên hệ giữa một biến độc lập, hàm phải tìm và
các đạo hàm của nó.
Nếu phương trình chứa nhiều biến độc lập cùng với hàm của các biến này cần phải
tìm và các đạo hàm riêng của hàm theo các biến thì ta gọi đó là các phương trình vi phân
đạo hàm riêng (gọi tắt là phương trình đạo hàm riêng).
6.3.1 Phương trình vi phân cấp 1
- Đối với phương trình vi phân không có điều kiện đầu ta sử dụng cú pháp:
>> y = dsolve('phương trình')

6.3.2 Phương trình vi phân cấp 2
54


6.3.3 Áp dụng
Cho mạch điện như hình vẽ khóa k ở vị trí 1 trong thời gian rất lâu, tại t = 0 chuyển
khóa k sang vị trí 2. Tìm dòng điện i(t) tại t > 0.

55


×