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