1. Trang chủ >
  2. Khoa học tự nhiên >
  3. Hóa học >

Chương 7: Viết chương trình trong Matlab

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



Xem Thêm
Tải bản đầy đủ (.pdf) (125 trang)

×