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 (3.47 MB, 125 trang )
Kỹ thuật tính toán trong công nghệ hóa học
biến ra đặt trong dấu [] và biến vào đặt trong dấu ()
Chú ý: tên của hàm và tên m-file lưu phải đồng nhất
Ví dụ: tạo hàm average có tên được lưu là average.m. Những dòng chú ý đặt sau
dòng function và trước các dòng lệnh nội dung là dòng chú thích về hàm, nó có thể
được hiển thị nhờ lệnh >>help average. Có thể gọi hàm average.m bằng cách
avr1 = average(1:10)
function avr = average (x)
%AVERAGE tính toán giá trị trung bình của các giá trị trong vec tơ
% và kết quả được gán vào avr
% Chú ý: đây là 1 ví dụ về hàm
n = length(x);
avr = sum(x)/n;
return;
Hay 1 ví dụ khác:
function [avr,sd] = stat(x)
%STAT thống kê đơn giản.
% tính toán giá trị trung bình và độ lệch tiêu chuẩn của vec tơ x.
n = length(x);
avr = sum(x)/n;
sd = sqrt(sum((x - avr).^2)/n);
return;
7.2.1 Những biến đặc biệt của hàm số
Mỗi hàm số đều có 2 biến bên trong: Số lượng đối số vào được gọi trong hàm là
nargin và nargout là số biến ra. Việc sử dụng nargin cho phép ta đặt giá trị ngầm
định cho các biến vào vắng mặt.
function [out1,out2] = checkarg (in1,in2,in3)
%CHECKARG mô tả cách sử dụng biến nargin và nargout.
if (nargin == 0)
disp(’no input arguments’);
43
return;
elseif (nargin == 1)
s = in1;
p = in1;
39
Kỹ thuật tính toán trong công nghệ hóa học
disp(’1 input argument’);
elseif (nargin == 2)
s = in1+in2;
p = in1*in2;
disp(’2 input arguments’);
elseif (nargin == 3)
s = in1+in2+in3;
p = in1*in2*in3;
disp(’3 input arguments’);
else
error(’Too many inputs.’);
end
if (nargout == 0)
return;
elseif (nargout == 1)
out1 = s;
else
out1 = s;
out2 = p;
end
7.2.2 Biến địa phương và biến toàn cục
Các biến thông thường đều được mặc định là biến địa phương, nó chỉ được tham
chiếu trong hàm chứa nó. Còn các biến cục bộ được khai báo sau từ ‘global’, nó sẽ
được tham chiếu trong toàn bộ modun.
7.2.3 Tính giá trị hàm số cách gián tiếp
Việc tính hàm số gián tiếp giúp cho việc lập trình trở lên tổng quát hơn. Trong
Matlab ta sử dụng lệnh ‘feval’.
[y1,..,yn] = feval (F,x1,...,xn),
Trong đó F là tên hàm số được định nghĩa , x1,…,xn là biến vào và y1,…,yn có
thể là biến ra. Xem ví dụ:
>> x = pi; y = cos(x);
>> z = feval(’cos’,x);
Dòng lệnh cuối có thể được thay bởi 2 dòng lệnh
>> F = ’cos’;
>> z = feval(F,x)
40
Kỹ thuật tính toán trong công nghệ hóa học
Việc tính giá trị hàm gián tiếp sẽ là 1 công cụ tốt để xây dựng 1 chương trình với
hàm số được coi như là tham số.
Ví dụ tạo hàm có tên là funplot
function funplot (F, xstart, xend, col);
%FUNPLOT makes a plot of the function F at the interval [xstart, xend].
% The plot should be made in one of the standard Matlab colors, so
% ’col’ is one of the following value: ’b’,’k’,’m’,’g’,’w’,’y’ or ’r’.
% default values:
% [xstart,xend] = [0,10]
% col = ’b’
% Note: illustrates the use of feval command
if (nargin == 0)
error (’No function is provided.’);
end
if (nargin < 2)
xstart = 0;
xend = 10;
end
if (nargin == 2)
error (’Wrong number of arguments. You should provide xstart and xend.’);
end
if (nargin < 4)
col = ’b’;
end
if (xstart == xend),
error (’The [xstart, xend] should be a non-zero range.’);
elseif (xstart > xend),
exchange = xend;
xend = xstart;
xstart = exchange;
end
switch col
case {’b’,’k’,’m’,’g’,’w’,’y’,’r’}
; % do nothing; the right color choice
41
Kỹ thuật tính toán trong công nghệ hóa học
otherwise
error (’Wrong col value provided.’)
end
x = linspace(xstart, xend);
y = feval(F,x);
plot (x,y,col);
description = [’Plot of ’, F];
title (description);
return;
Chương 8: Văn bản
8.1 Chuỗi kí tự
Matlab hầu như làm việc với số, nhưng khi cần thiết ta có thể xử lý văn bản. Văn
bản được lưu dưới dạng các kí tự chuỗi. Chuỗi là vec tơ mà phần tử là các giá trị
ASCII được hiển thị dưới dạng chuỗi kí tự. Do đó, các thao tác trên chuỗi giống như 1
vec tơ
>> t = ’This is a character string’
t=
This is a character string
>> size(t)
ans =
1 27
>> whos
Name Size Bytes Class
t 1x27 54 char array
>> t(10:19)
ans =
47
42
Kỹ thuật tính toán trong công nghệ hóa học
character
>> t([2,3,10,17])
ans =
hi t
Để chuyển đổi dạng chuỗi về dạng số ta dùng double
>> double(t(1:12))
ans =
84
104
105
115
32 105
115
32
97
32
99
104
Và hàm char được cung cấp để biến đổi ngược lại
>> t([16:17])
ans =
ct
>> t([16:17])+3
% thực hiện các thao tác toán học với mã ASCII
ans =
102 119
>> t([16:17])-3
%gọi lại mã ASCII
ans =
96 113
>> char(t([16:17])-2) % chuyển mã ASCII ra thành kí tự
ans =
ar
8.2 Vào - ra dữ liệu
Các lệnh liên quan đến nhập dữ liệu từ bàn phím: input, keyboard, menu, pause
8.2.1 Vào ra dữ liệu từ bàn phím
8.2.1.1 Lệnh ‘input’
Lệnh này đưa ra thông báo nhắc nhở người sử dụng nhập dữ liệu từ bàn phím.
Lệnh có dạng: r= input(string)
Trong đó r là tên biến, string là sâu ký tự chứa thông báo nhắc người dùng biết về
dữ liệu cần nạp. Dữ liệu đó có thể là biểu thức bất kỳ. Nếu người sử dụng ấn ‘Enter’
ngay thì r sẽ là 1 ma trận rỗng.
Ví dụ:
>> m=input('nhap so dong cua ma tran: ')
nhap so dong cua ma tran: 3
m=
3
43
Kỹ thuật tính toán trong công nghệ hóa học
>> n=input('nhap so cot cua ma tran: ')
nhap so cot cua ma tran: 5
n=
5
8.2.2 Đưa dữ liệu ra màn hình
8.2.2.1 lệnh ‘disp’
Lệnh disp để hiển thị nội dung của 1 mảng ra màn hình mà không hiển thị tên
mảng. Lệnh này luôn thực hiện cho dù có dấu ‘;’ ở cuối dòng lệnh hay không, ngoại
trừ trường hợp mảng rỗng. Lệnh có dạng:
Disp(x)
Trong đó x có thể là tên biến mảng hoặc biểu thức bất kì.
>> disp(’This is a statement.’)
% 1 chuỗi
This is a statement.
>> disp(rand(3))
% 1 ma trận
0.2221
0.0129
0.8519
0.4885
0.0538
0.5039
0.2290
0.3949
0.4239
8.2.2.2 lệnh ‘fprintf’
Lệnh có cấu trúc
Fprintf(dialog_format, danh_sách_biến)
Trong đó dialog_format là biến(hằng) xâu ký tự chứa thông báo và các ký tự định
khuôn dạng dữ liệu ra.
Ví dụ:
>> a=rand(3,3)
a=
0.8462 0.6721 0.6813
0.5252 0.8381 0.3795
0.2026 0.0196 0.8318
>> fprintf('Do dai cua ma tran A: %i%i',length(a))
Do dai cua ma tran A: 3
>> fprintf('A binh phuong: \n %i%i%i\n%i%i%i\n%i%i%i\n',a^2)
A binh phuong:
1.207124e+0009.614361e-0013.503595e-001
1.145488e+0001.062870e+0001.690032e-001
1.398258e+0009.914752e-0018.373965e-001
44
Kỹ thuật tính toán trong công nghệ hóa học
Hay một ví dụ khác:
>> str = ’life is beautiful’;
>> fprintf(’My sentence is: %s\n’,str);
% chú ý định dạng \n
My sentence is: life is beautiful
>> fprintf(’My sentence is: %30s\n’,str);
My sentence is: life is beautiful
>> fprintf(’My sentence is: %30.10s\n’,str);
My sentence is: life is be
>> fprintf(’My sentence is: %-20.10s\n’,str);
My sentence is: life is be
>>
>> name = ’John’;
>> age = 30;
50
>> salary = 6130.50;
>> fprintf(’My name is %4s. I am %2d. My salary is f %7.2f.\n’,name, age,
salary);
>> My name is John. I am 30. My salary is f 6130.50.
>>
>> x = [0, 0.5, 1];
>> y = [x; exp(x)];
>> fprintf(’%6.2f %12.8f\n’,y);
0.00
1.00000000
0.50
1.64872127
1.00
2.71828183
>>
>> fprintf(’%6.1e %12.4e\n’,y);
0.0e+00
5.0e-01
1.0e+00
1.0000e+00
1.6487e+00
2.7183e+00
>>
>> x = 1:3:7;
>> y = [x; sin(x)];
>> fprintf(’%2d %10.4g\n’,y);
45
Kỹ thuật tính toán trong công nghệ hóa học
1
0.8415
4
-0.7568
7
0.657
8.2.3 Xử lí file văn bản
8.2.3.1 Lệnh ‘fopen’
fileID = fopen(filename, permission)
Lệnh được sử dụng để mở một file văn bản có tên được cho bởi filename ở chế độ
được chỉ ra bởi permission. Permission có thể là:
‘rt’
đọc
‘wt’
ghi (sẽ ghi 1 file mới nếu không tìm thấy file với tên chỉ ra bởi filename)
‘at’
filename)
nối đuôi(sẽ ghi 1 file mới nếu không tìm thấy file với tên chỉ ra bởi
‘rt+’ đọc và ghi (không tạo file)
Biến nhận dạng fileID sẽ nhận các giá trị nguyên và ta sẽ thâm nhập vào file sử
dụng biến nhận dạng này.
Khi kiểm tra lỗi mở file có thể sử dụng
[fid, message] = fopen(filename, permission)
8.2.3.2 Lệnh đóng file ‘fclose’
St = fclose(fid)
Lệnh này sẽ đóng file ứng với biến nhận dạng fid. Fclose sẽ trả biến st giá trị 0
nếu nó là thành việc đóng file và trả lại giá trị -1 nếu gặp lỗi.
Lệnh st = fclose(‘all’) đóng tất cả các file đang mở ngoại trừ 0, 1 và 2.
8.2.3.3 Lệnh ‘frewind’
Frewind(fid)
Đặt con trỏ file có tên fid vào đầu file.
8.2.3.4 Lệnh ‘fscanf’
[A, count] = fscanf(fid, format, size)
Lệnh này đọc dữ liệu từ file tương ứng với biến nhận dạng fid, chuyển đổi dữ liệu
về dạng được xác định bởi xâu biến format, và gán vào ma trận A. Biến count là biến
ra tùy chọn dùng để chứa số lượng phần tử đọc được.
Fid là biến nhận dạng tương ứng với file nhận dạng được từ lệnh fopen.
Size là tùy chọn; giới hạn số đối với số phần tử được đọc từ file, nếu không có
biến này thì toàn bộ file sẽ được xét. Các giá trị của biến có thể là:
•
N: đọc không quá N phần tử từ file vào vec tơ cột
•
Inf: đọc không quá kết thúc file
46
Kỹ thuật tính toán trong công nghệ hóa học
•
[M,N] : đọc không quá M*N phần tử và đưa vào ma trận kích thước
không quá M*N theo từng cột. N có thể là inf còn M thì phải là hữu hạn
Nếu ma trận A là kết quả của việc chuyển định dạng kí tự và biến size không có
dạng [M,N] thì vec tơ dòng sẽ được trả lại.
Format là biến xâu chứa các kí tự chuyển đổi định dạng của ngôn ngữ C. Các kí
tự định khuôn dạng bao gồm : %, các kí tự thay thế, độ dài trường, và các kí tự chuyển
đổi dạng: d, i, o, u, x, e, f, g, s, c and […](liệt kê tập hợp).
Nếu %s được sử dụng thì khi đọc 1 phần tử có thể dẫn tới 1 loạt các thành phần
của ma trận được sử dụng, mỗi thành phần giữ 1 kí tự.
Sử dụng %c để đọc kí tự trắng; định dạng %s bỏ qua các kí tự trắng.
Nếu chỉ thị định dạng gồm lẫn lộn cả số lẫn kí tự thì ma trận kết quả sẽ là ma trận
số và mỗi kí tự sẽ chuyển thành 1 số chính bằng giá trị mã ASCII của nó.
Fscanf khác với lệnh này trong ngôn ngữ C ở chỗ nó là lệnh được vec tơ hóa để
trả lại đối số là ma trận. Biến xâu định dạng sẽ được lặp lại cho đến khi gặp kết thúc
file hoặc đọc đủ số lượng phần tử chỉ ra bởi size.
Ví dụ:
Lệnh
S = fscanf(fid,’%s’)
Đọc(và trả lại) một xâu
Lệnh
A = fscanf(fid,’%5d’)
Đọc các số có 5 chữ số thập.
Ví dụ: giả sử có file văn bản với tên ‘kq.txt’ chứa xâu ‘Day la ket qua dua ra’. Khi
đó ta có thể đọc dữ liệu vào như sau:
>> fid = fopen(‘kq’,’rt’)
Fid =
3
>> x= fscanf(fid,’%s’)
X=
Daylaketquaduara
>> frewind(fid)
>>x=fscanf(fid,’%s%c’)
X=
Day la ket qua dua ra
Ví dụ: giả sử file văn bản Matrix.txt chứa 2 dòng
1
2
3
4
5
6
7
8
9
10
47
Kỹ thuật tính toán trong công nghệ hóa học
Hãy theo dõi sự tác động của lệnh fscanf
>>fopen(‘matrix.txt’,’rt’)
Ans =
4
>> A= fscanf(4,’%i’,[2,5])
A=
12
3
4
5
67
8
9
10
>>frewind(4);
>> B = fscanf(4,’%i’,[5,2])
B=
1
6
2
7
3
8
4
9
5
10
>>Frewind(4);
>> C= fscanf(4,’%i’,6)
C=
1
2
3
4
5
6
8.2.3.5 Lệnh FPRINTF
Count = fprintf(fid,format,A,…)
Lệnh này sẽ định dạng các thành phần của ma trận A( và các biến tiếp theo trong
danh sách) theo định dạng được xác định bởi xâu format, và ghi ra file tương ứng với
các biến nhận dạng fid. Biến count sẽ đếm số byte của dữ liệu được ghi ra. Fid là số
nguyên nhận dạng tên file thu được từ lệnh fopen. Có thể dùng số 1 nếu sử dụng thiết
bị ra chuẩn(màn hình). Nếu trong lệnh này không chỉ ra biến fid thì kết quả sẽ đưa ra
màn hình.
Format là biến xâu chứa các kí tự mô tả định dạng dữ liệu giống như trong ngôn
ngữ C. Các kí tự \n, \r, \t, \b, \f có thể dùng để tạo ra linefeed, carriage return, tab,
48
Kỹ thuật tính toán trong công nghệ hóa học
backspace, và formfeed characters tương ứng. Sử dụng \\ để tạo dấu \ và %% để tạo ra
kí tự %.
Ví dụ:
>> x=0:.1:1; y=[x,exp(x)];
>> fid=fopen('exp.txt','w');
>> fprintf(fid,'%6.2f
%12.8f\r',y);
>> fclose(fid);
Để tạo ra file văn bản có tên là ‘exp.txt’ chứa bảng giá trị hàm mũ:
0.00
0.10000000
0.20
0.30000000
0.40
0.50000000
0.60
0.70000000
0.80
0.90000000
1.00
1.00000000
1.11
1.22140276
1.35
1.49182470
1.65
1.82211880
2.01
2.22554093
2.46
2.71828183
In nội dung file đó ra màn hình:
>> fprintf('**** Day la bang gia tri ham exp ****\n x
exp(x)\n');
**** Day la bang gia tri ham exp ****
x
exp(x)
>> fprintf('%6.2f %12.8f\n',y);
0.00
0.10000000
0.20
0.30000000
0.40
0.50000000
0.60
0.70000000
0.80
0.90000000
1.00
1.00000000
1.11
1.22140276
1.35
1.49182470
1.65
1.82211880
2.01
2.22554093
49