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

Chương 5: Các luồng điều khiển

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



>> x = [1 1 3 4 1];

>> i = (x == 1)

i=

1



1



0



0



1



>> y = x(i)

y=

1



1



1



>> j = find(x = = 1)



% j là chỉ số của phần tử thỏa mãn x = = 1



j=

1



2



5



>> z = x(j)

z=

1



1



1



Một ví dụ khác :

>> x = -1:0.05:1;

>> y = sin(x) .* sin(3*pi*x);

>> plot (x,y, ’-’); hold on

>> k = find (y <= -0.1)

k=

9



10



11



12



13



29



30



31



32



33



>> plot (x(k), y(k), ’ro’);

>> r = find (x > 0.5 & y > 0)

r=

35



36



37



38



39



40



41



>> plot (x(r), y(r), ’r*’);

Dùng toán tử find trong ma trận một cách tương tự:

>> A = [1



3



-3



-5;



-1



2



-1



0;



3



-7



2



7];



>> k = find (A >= 2.5)

k=

3

4

12

>> A(k)

ans =

30



Kỹ thuật tính toán trong công nghệ hóa học



3

3

7

Chúng ta cũng có thể xác định vị trí theo hàng cột.

>> [I,J] = find (A >= 2.5)

I=

3

1

3

J=

1

2

4

>> [A(I(1), J(1)), A(I(2), J(2)), A(I(3),



J(3))] % danh sách các giá trị



ans =

3



3



7



5.3 Câu lệnh if

*) If …. End.



*) If … else …end



*) If … elseif … else … end.

31



Kỹ thuật tính toán trong công nghệ hóa học



Chú ý: bài tập dưới đây có thể sử dụng m-file Script. Đó là tập tin được lưu ở

ngoài. Chúng ta có thể sử dụng bất kì chương trình soạn thảo nào nhưng phải lưu với

đuôi mở rộng là “.m” (sẽ được tìm hiểu kĩ trong chương sau).

Bài tập

Hãy cho biết kết quả của : m, t, h, y

1. if n > 1 a) n = 7 m = ?

m = n + 2 b) n = 0 m = ?

else c) n = -7 m = ?

m=n-2

end

2. if s <= 1 a) s = 1 t = ?

t = 2z b) s = 7 t = ?

elseif s < 10 c) s = 57 t = ?

t = 9 - z d) s = 300 t = ?

elseif s < 100

t = sqrt(s)

else

t=s

end

3. if t >= 24 a) t = 50 h = ?

z = 3t + 1 b) t = 19 h = ?

elseif t < 9 c) t = -6 h = ?

z = t^2/3 - 2t d) t = 0 h = ?

else

z = -t

32



Kỹ thuật tính toán trong công nghệ hóa học



end

4. if 0 < x < 7 a) x = -1 y = ?

y = 4x b) x = 5 y = ?

elseif 7 < x < 55 c) x = 30 y = ?

y = -10x d) x = 56 y = ?

else

y = 333

end

Một loại cấu trúc điều kiện khác là switch. Câu lệnh này cho phép thực hiện rẽ

nhánh dựa trên các giá trị biểu thức.



Cấu trúc này sẽ tránh sự dài dòng và khó hiểu của cấu trúc if…end khi sử dụng

quá nhiều điều kiện.



5.4 Cấu trúc lặp

*) vòng lặp for



Chỉ số của phép lặp có thể là vec tơ:



*) Vòng lặp while

33



Kỹ thuật tính toán trong công nghệ hóa học



Các câu lệnh trong thân của vòng lặp while sẽ được lặp lại chừng nào biểu thức

expression còn là true:



Chương 6: Phương pháp số

6.1 Đường cong hồi quy

Với lệnh polyfit bất kỳ đa thức nào có thể khớp nhau đối với dữ liệu. polyfit ( x,

y, n) để tìm thấy các hệ số của một đa thức với bậc n mà phù hợp với dữ liệu nhất(tìm

mối quan hệ tuyến tính giữa x và y). Chúng ta hãy bắt đầu làm việc với hồi quy tuyến

tính của dữ liệu nào đó:

>> x = 0:10;

>> y = [-.10 .24 1.02 1.58 2.84 2.76 2.99 4.05 4.83 5.22 7.51]

>> p = polyfit (x, y, 1) % tìm đa thức hồi quy bậc 1

p = 0.6772



-0.3914



Biến ra của lệnh polyfit là 1 vec tơ hàng các hệ số của đa thức hồi quy. Như ở ví

dụ trên, hàm hồi quy tìm được là: y = 0.6772x − 0.3914.

6.2 Phép nội suy

Cách đơn giản nhất để khảo sát một phép nội suy là vẽ đồ thị hàm số bằng hàm

plot. Các số liệu lân cận được nối với nhau bởi đoạn thẳng:

>> x1 = linspace(0,2*pi,2);

>> x2 = linspace(0,2*pi,4);

>> x3 = linspace(0,2*pi,16);

>> x4 = linspace(0,2*pi,256);

>> plot(x1,sin(x1),x2,sin(x2),x3,sin(x3),x4,sin(x4))

>> legend(’2 points’,’4 points’,’16 points’,’256 points’)

Trong Matlab cũng có những hàm nội suy như: interp1(hồi quy 1 chiều), interp2,

spline. Ta thực hiện lệnh sau:

>> N = 50;

34



Kỹ thuật tính toán trong công nghệ hóa học



>> x = linspace(0,5,N);

>> y = sin(x) .*sin(6*x);

>> subplot(2,1,1); plot(x,y);

>> hold on

>> p = randperm(N);

>> pp = p(1:round(N/2));



% chọn ngẫu nhiên N/2 số trong [0,5]



>> pp = sort(pp); % phân loại phần tử

>> xx = x(pp); % chọn điểm

>> yy = y(pp);

>> plot(xx,yy,’ro-’)

>> yn = interp1(xx,yy,x,’nearest’);

>> plot(x,yn,’g’)

>> axis tight

>> legend(’Original’,’Crude version’,’Nearest neighbor interpolation’)

>>

>> subplot(2,1,2); plot(xx,yy,’ro-’);

>> hold on

>> yc = interp1(xx,yy,x,’linear’);

>> plot(x,yc,’g’)

>> ys = spline(xx,yy,x); % hồi quy spline

>> plot(x,ys,’k’)

>> axis tight

>> legend(’Crude version’,’Linear interpolation’,’Spline interpolation’)

>> [X,Y,Z] = peaks(10);

>> [Xi,Yi] = meshgrid(-3:.25:3,-3:.25:3);

>> Zi = interp2(X,Y,Z,Xi,Yi);

>> mesh(Xi,Yi,Zi);



6.3 Giá trị của hàm số

Các hàm khảo sát hàm số

Lệnh



Kết quả



Fplot(‘f’,[min_x

max_x])

Fmin(‘f’,min_x,



Vẽ đồ thị hàm số trên đoạn [min_x



max_x]



Cho giá trị của x khi hàm số đạt cực tiểu /[min_x,

35



Kỹ thuật tính toán trong công nghệ hóa học



max_x)

Fmax(‘f’,

max_x)



max_x]

min_x,



Cho giá trị của x khi hàm số cực đại /[min_x,

max_x]



Ví dụ:

>> x = 0:pi/8:2*pi;

>> y = sin(8*x);

>> plot(x,y,’b’)

>> hold on

>> fplot(’sin(8*z)’,[0 2*pi],’r’)

>> title(’sin(8*z)’)

>> hold off

Chúng ta cũng có thể định nghĩa hàm

>> f = ’sin(8*z)’;

>> fplot(f,[0 2*pi],’r’)

>> title(f)



6.3.1 Hàm ‘inline’

Nó có thể rất hữu ích khi ta định nghĩa 1 hàm trong suốt thời gian chạy Matlab.

>> f = inline(’cos(x).*sin(2*x)’)

f=

Inline function:

f(x) = cos(x).*sin(2*x)

>> g = inline(’sqrt(x.^2+y.^2)’,’x’,’y’)

g=

Inline function:

g(x,y) = sqrt(x.^2+y.^2)

Chúng ta có thể xác định giá trị của hàm số một cách thông thường:

>> f(-2)

ans =

-0.3149

>> g(3,4)

ans =

5

36



Kỹ thuật tính toán trong công nghệ hóa học



>> A = [1 2; 3 4];

>> B = [2 3; 4 5];

>> g(A,B) % hàm cũng có thể thực hiện với mảng

ans =

2.2361



3.6056



5.0000



6.4031

1



1



Chẳng hạn xét hàm số f ( x ) = ( x − 0.1) 2 + 0.1 + ( x −1) 2 + 0.1 , điểm cực tiểu của

hàm f có thể tìm nhờ hàm ‘fmin’. Theo mặc định sai số tương đối là 10 −4 , tuy nhiên,

ta có thể thực hiện với độ chính xác hơn.

>> format long



% thay đổi định dạng để tăng thêm độ chính xác



>> f = inline (’1./((x-0.1).^2 + 0.1) + 1./((x-1).^2 + 0.1)’);

>> fplot(f,[0 2]);

>> xm1 = fmin(f,0.3,1); fm1 = f(xm1);

>> xm2 = fmin(f,0.3,1,[0,1e-8]); fm2 = f(xm2);

>> [xm1, xm2] % so sánh 2 kết quả



6.4 Phép tính tích phân và tích phân

Để lấy tích phân, ta có thể dùng hàm trapz :

>> x = 0:0.5:10; y = 0.5 * sqrt(x) + x .* sin(x);

>> integral1 = trapz(x,y)

integral1 =

18.1655

>> x = 0:0.05:10; y = 0.5 * sqrt(x) + x .* sin(x);

>> integral2 = trapz(x,y)

integral2 =

18.3846

Có thể thu được kết quả chính xác nếu sử dụng hàm quad, hoặc quadl, vẫn lấy ví

1



1



dụ: f ( x) = ( x − 0.1) 2 + 0.1 + ( x −1) 2 + 0.1

>> f = ’1./((x-0.1).^2 + 0.1) + 1./((x-1).^2 + 0.1)’;

>> integral1 = quad(f,0,2)

>> integral2 = quadl(f,0,2)



37



Kỹ thuật tính toán trong công nghệ hóa học



6.5 Tính toán số học và cấu trúc điều khiển

Chúng ta có thể gặp những bài toán như khai triển Taylor. Chúng ta có thể khai

triển hàm số



1

=1 + x + x 2 + x 3 + ... + 0( x 4 ) , với x=0.42

1− x



s = 0; x = 1; s = 0; x = 1;

x0 = 0.42; x0 = 0.42;

while (x > 1e-6)

hoặc

while (x > (1e-6)*s)

s = s + x; s = s + x;

x = x * x0; x = x * x0;

end

Sẽ cho ta kết quả gần đúng của hàm f =



1

.

1− x



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

7.1 Kịch bản và hàm m-file

Kịch bản m-file

Các lệnh của Matlab được nhập sau dấu nhắc lệnh trong Matlab. Khi bài toán trở

lên phức tạp hơn thì cách này tỏ ra không hiệu quả. Có 1 cách giải quyết, đó là sử dụng

m-file. Lưu ý là m-file phải được đặt ở một trong những thư mục mà Matlab sẽ tự

động tìm kiếm m-file trong đó; danh mục các thư mục như thế có thể xem nhờ lệnh

path. Thư mục mà Matlab luôn khảo sát đó chính là ‘Current Directory’, người dùng

có thể thay đổi.

Một m-file có thể được biên soạn như sau:

Chẳng hạn chúng ta lưu file sinplot.m có nội dung:

x = 0:0.2:6;

y = sin(x);

plot(x,y);

title(’Plot of y = sin(x)’);

và để khởi chạy nó ta dùng lệnh

>> sinplot



7.2 Hàm m-file

Cấu trúc

function [outputArgs] = function_name (inputArgs)

38



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



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

×