Mục Lục
Lời nói đầu. 3
Phần I: Cơ sở về Matlab. 4
Chương I:Bắt đầu với Matlab. 5
1.1 Nhập dữ liệu qua dòng lệnh. 5
1.2 Sử dụng help trực tuyến. 6
1.3 Đường dẫn. 6
1.4 Lưu và tải dữ liệu. 7
Chương 2: Các cấu trúc cơ bản và biến. 7
2.1 tính toán với Matlab. 7
2.2 Giới thiệu dạng dữ liệu. 8
Chương 3: Tính toán với ma trận và vec tơ. 9
3.1 Vec tơ. 10
3.1.2 Vec tơ cột và sự chuyển vị11
3.1.3 Nhân, chia và mũ của vec tơ. 12
3.2 Ma trận. 14
3.2.1 Các ma trận đặc biệt15
3.2.2 Xây dựng ma trận và cách trích các phần tử của ma trận. 16
3.2.3 Các phép toán với ma trận. 19
Chương 4: Đồ họa. 21
4.1 Đồ thị đơn giản. 22
4.2 Vẽ đường. 22
4.3 Vẽ mặt26
Chương 5: Các luồng điều khiển. 29
5.1 Các toán tử logic. 29
5.2 Lệnh find. 29
5.3 Câu lệnh if. 31
5.4 Cấu trúc lặp. 33
Chương 6: Phương pháp số. 34
6.1 Đường cong hồi quy. 34
6.2 Phép nội suy. 34
6.3 Giá trị của hàm số. 35
6.3.1 Hàm ‘inline’. 36
6.4 Phép tính tích phân và tích phân. 37
6.5 Tính toán số học và cấu trúc điều khiển. 38
Chương 7: Viết chương trình trong Matlab. 38
7.1 Kịch bản và hàm m-file. 38
7.2 Hàm m-file. 38
7.2.1 Những biến đặc biệt của hàm số. 39
7.2.2 Biến địa phương và biến toàn cục. 40
7.2.3 Tính giá trị hàm số cách gián tiếp. 40
Chương 8: Văn bản. 42
8.1 Chuỗi kí tự. 42
8.2 Vào - ra dữ liệu. 43
8.2.1 Vào ra dữ liệu từ bàn phím43
8.2.2 Đưa dữ liệu ra màn hình. 44
8.2.3 Xử lí file văn bản. 46
Phần II: Ứng dụng của Matlab. 50
trong công nghệ hóa học. 50
Chương 1: Dẫn nhiệt và đối lưu. 51
1.1. Dẫn nhiệt51
1.1.1. Tóm tắt lí thuyết51
1.1.2. Ví dụ. 52
1.2. Đối lưu. 55
1.2.1. Tóm tắt lí thuyết55
1.2.2.Ví dụ. 58
Chương 2: Bức xạ nhiệt và truyền nhiệt. 63
2.1. Trao đổi nhiệt bức xạ giữa các vật63
2.1.1. Tóm tắt lí thuyết63
2.1.2. Ví dụ. 64
2.2. Truyền nhiệt và thiết bị trao đổi nhiệt66
2.2.1 Tóm tắt lí thuyết66
2.2.2. Ví dụ. 67
Chương 3: Kỹ thuật tách chất. 73
3.1 Cân bằng lỏng hơi73
3.1.1 Tóm tắt lý thuyết73
3.1.2 Ví dụ. 75
3.1.3. Bài tập. 79
3.2 Phương pháp McCabe Thiele. 80
3.2.1 Tóm tắt lý thuyết80
3.2.2 Ví dụ. 82
Chương 4: Kỹ thuật phản ứng. 89
4.1 Nhiệt động học. 89
4.1.1 Tóm tắt lý thuyết89
4.1.2 Ví dụ. 91
4.2 Các kỹ thuật tiến hành phản ứng. 94
4.2.1 Tóm tắt lý thuyết94
4.2.2 Ví dụ. 95
4.2.3Bài tập. 99
Phụ lục. 100
Tài liệu tham khảo. 125
Lời nói đầu
[IMG]file:///C:/DOCUME%7E1/domsang/LOCALS%7E1/Temp/msohtml1/01/clip_image002.gif[/IMG]
Các bài toán công nghệ hóa học trong thực tế là rất phức tạp, chúng ta cần có công cụ hỗ trợ để giải nó. Thực tế có rất nhiều phần mền, tuy nhiên, trong cuốn sách này, chúng tôi muốn giới thiệu đến các sinh viên nghành công nghệ hóa một công cụ rất mạnh, đó là matlab .
Mat lab là một công cụ toán học rất mạnh, ngoài ra nó còn hỗ trợ ngôn ngữ lập trình bậc 4 với cấu trúc đơn giản, gần gũi, dễ tiếp cận, có thể linh hoạt giải quyết các bài toán thực tế để đạt được yêu cầu mong muốn. Do đó, việc sử dụng nó làm công cụ để giải quyết các bài toán kĩ thuật là rất tốt .
Nội dung cuốn sách bao gồm:
· Phần I: Cơ sở về Matlab nhằm giới thiệu cho bạn đọc sơ lược về Matlab
· Phần II: Ứng dụng Matlab trong công nghệ hóa học gồm có các chương: Dẫn nhiệt và đối lưu; bức xạ và truyền nhiệt; kỹ thuật tách chất; kỹ thuật phản ứng .
Trong từng chương có tóm tắt cơ sở lí thuyết, kèm theo mỗi chương đó thì có các ví dụ và bài tập liên quan đi kèm, mỗi một ví dụ minh họa được giải bằng tay sau đó được giải lại bằng matlab một cách sinh động và dễ hiểu, có tính tổng quát cao .
Đưa matlab vào công nghệ hóa là mục đích của chúng tôi. Tuy nhiên, do được biên soạn lần đầu nên không thể tránh được những sai sót, rất mong nhận được đóng góp của bạn đọc để cuốn sách trở lên gần gũi hơn với các sinh viên công nghệ hóa cũng như những người quan tâm đến lĩnh vực này .
125 trang |
Chia sẻ: lvcdongnoi | Lượt xem: 3172 | Lượt tải: 2
Bạn đang xem trước 20 trang tài liệu Kỹ thuật tính toán trong công nghệ hóa học, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Mục Lục
Lời nói đầu 3
Phần I: Cơ sở về Matlab 4
Chương I:Bắt đầu với Matlab 5
1.1 Nhập dữ liệu qua dòng lệnh 5
1.2 Sử dụng help trực tuyến 6
1.3 Đường dẫn 6
1.4 Lưu và tải dữ liệu 7
Chương 2: Các cấu trúc cơ bản và biến 7
2.1 tính toán với Matlab 7
2.2 Giới thiệu dạng dữ liệu 8
Chương 3: Tính toán với ma trận và vec tơ 9
3.1 Vec tơ 10
3.1.2 Vec tơ cột và sự chuyển vị 11
3.1.3 Nhân, chia và mũ của vec tơ 12
3.2 Ma trận 14
3.2.1 Các ma trận đặc biệt 15
3.2.2 Xây dựng ma trận và cách trích các phần tử của ma trận 16
3.2.3 Các phép toán với ma trận 19
Chương 4: Đồ họa 21
4.1 Đồ thị đơn giản 22
4.2 Vẽ đường 22
4.3 Vẽ mặt 26
Chương 5: Các luồng điều khiển 29
5.1 Các toán tử logic 29
5.2 Lệnh find 29
5.3 Câu lệnh if 31
5.4 Cấu trúc lặp 33
Chương 6: Phương pháp số 34
6.1 Đường cong hồi quy 34
6.2 Phép nội suy 34
6.3 Giá trị của hàm số 35
6.3.1 Hàm ‘inline’ 36
6.4 Phép tính tích phân và tích phân 37
6.5 Tính toán số học và cấu trúc điều khiển 38
Chương 7: Viết chương trình trong Matlab 38
7.1 Kịch bản và hàm m-file 38
7.2 Hàm m-file 38
7.2.1 Những biến đặc biệt của hàm số 39
7.2.2 Biến địa phương và biến toàn cục 40
7.2.3 Tính giá trị hàm số cách gián tiếp 40
Chương 8: Văn bản 42
8.1 Chuỗi kí tự 42
8.2 Vào - ra dữ liệu 43
8.2.1 Vào ra dữ liệu từ bàn phím 43
8.2.2 Đưa dữ liệu ra màn hình 44
8.2.3 Xử lí file văn bản 46
Phần II: Ứng dụng của Matlab 50
trong công nghệ hóa học 50
Chương 1: Dẫn nhiệt và đối lưu 51
1.1. Dẫn nhiệt 51
1.1.1. Tóm tắt lí thuyết 51
1.1.2. Ví dụ 52
1.2. Đối lưu 55
1.2.1. Tóm tắt lí thuyết 55
1.2.2.Ví dụ 58
Chương 2: Bức xạ nhiệt và truyền nhiệt 63
2.1. Trao đổi nhiệt bức xạ giữa các vật 63
2.1.1. Tóm tắt lí thuyết 63
2.1.2. Ví dụ 64
2.2. Truyền nhiệt và thiết bị trao đổi nhiệt 66
2.2.1 Tóm tắt lí thuyết 66
2.2.2. Ví dụ 67
Chương 3: Kỹ thuật tách chất 73
3.1 Cân bằng lỏng hơi 73
3.1.1 Tóm tắt lý thuyết 73
3.1.2 Ví dụ 75
3.1.3. Bài tập 79
3.2 Phương pháp McCabe Thiele 80
3.2.1 Tóm tắt lý thuyết 80
3.2.2 Ví dụ 82
Chương 4: Kỹ thuật phản ứng 89
4.1 Nhiệt động học 89
4.1.1 Tóm tắt lý thuyết 89
4.1.2 Ví dụ 91
4.2 Các kỹ thuật tiến hành phản ứng 94
4.2.1 Tóm tắt lý thuyết 94
4.2.2 Ví dụ 95
4.2.3Bài tập 99
Phụ lục 100
Tài liệu tham khảo 125
Lời nói đầu
Các bài toán công nghệ hóa học trong thực tế là rất phức tạp, chúng ta cần có công cụ hỗ trợ để giải nó. Thực tế có rất nhiều phần mền, tuy nhiên, trong cuốn sách này, chúng tôi muốn giới thiệu đến các sinh viên nghành công nghệ hóa một công cụ rất mạnh, đó là matlab .
Mat lab là một công cụ toán học rất mạnh, ngoài ra nó còn hỗ trợ ngôn ngữ lập trình bậc 4 với cấu trúc đơn giản, gần gũi, dễ tiếp cận, có thể linh hoạt giải quyết các bài toán thực tế để đạt được yêu cầu mong muốn. Do đó, việc sử dụng nó làm công cụ để giải quyết các bài toán kĩ thuật là rất tốt .
Nội dung cuốn sách bao gồm:
Phần I: Cơ sở về Matlab nhằm giới thiệu cho bạn đọc sơ lược về Matlab
Phần II: Ứng dụng Matlab trong công nghệ hóa học gồm có các chương: Dẫn nhiệt và đối lưu; bức xạ và truyền nhiệt; kỹ thuật tách chất; kỹ thuật phản ứng .
Trong từng chương có tóm tắt cơ sở lí thuyết, kèm theo mỗi chương đó thì có các ví dụ và bài tập liên quan đi kèm, mỗi một ví dụ minh họa được giải bằng tay sau đó được giải lại bằng matlab một cách sinh động và dễ hiểu, có tính tổng quát cao .
Đưa matlab vào công nghệ hóa là mục đích của chúng tôi. Tuy nhiên, do được biên soạn lần đầu nên không thể tránh được những sai sót, rất mong nhận được đóng góp của bạn đọc để cuốn sách trở lên gần gũi hơn với các sinh viên công nghệ hóa cũng như những người quan tâm đến lĩnh vực này .
Phần I: Cơ sở về Matlab
Matlab là công cụ toán học, trước hết là các phép tính khoa học, ngoài ra nó còn cho phép vẽ các đồ thị, tính toán ma trận, làm việc với các đa thức và các hàm tích phân. Đồng thời,chúng ta có thể lập trình các chương trình tính toán một cách linh hoạt theo nhu cầu của mình. Đặc biệt Matlab tỏ ra rất mạnh mẽ trong việc thiết kế và tính toán vector và ma trận.
Khi khởi chạy Matlab thì xuất hiện một hoặc nhiều cửa sổ trên màn hình, trong đó quan trọng nhất là Command window, nó cho phép nhập lệnh và hiển thị kết quả.
Chương I:Bắt đầu với Matlab
1.1 Nhập dữ liệu qua dòng lệnh
*) Các lệnh sẽ được thực hiện ngay sau khi ấn phím Enter. Kết quả sẽ được hiển thị trên màn hình nếu muốn. Tuy nhiên, nó chỉ thực hiện khi các dòng lệnh là hợp lệ. Có thể tìm hiểu thêm từ menu Help.
Ví dụ :
>> 3 + 7.5
>> 18/4
>> 3 * 7
Chú ý : các dấu cách không quan trọng trong Matlab
*) Kết quả tính toán sẽ được tự động lưu vào biến ans
Ví dụ :
>> 14/4
ans =
3.5000
>> ans^(-6)
ans =
5.4399e-04
Chúng ta có thể định nghĩa biến cho riêng mình. Ví dụ:
>> a = 14/4
a =
3.5000
>> b = a^(-6)
b =
5.4399e-04
Dữ liệu sẽ được lưu vào biến a và b.
*) Khi kết thúc dòng lệnh kết thúc bằng dấu “;” thì sẽ không hiển thị kết quả ra màn hình, có thể kiểm chứng bằng hai biểu thức sau :
>> 3 + 7.5
>> 3 + 7.5;
*) Có thể thực thi nhiều lệnh cùng một lúc, các câu lệnh ngăn cách nhau bởi dấu phẩy hoặc dấu chấm phẩy.
>> sin(pi/4), cos(pi); sin(0)
ans =
0.7071
ans =
0
Chú ý : cos(pi) không được in ra màn hình
*) Mặc định Matlab chỉ hiển thị 5 chữ số. Do đó, muốn có kết quả chính xác hơn thì ta dùng lệnh format long thì có thể hiển thị được tới 15 chữ số
>> 312/56
ans =
5.5714
>> format long
>> 312/56
ans =
5.57142857142857
Có thể tìm hiểu thêm:
>> help format
*) Khi dòng quá dài có thể dùng dấu “…” để nối câu xuống dòng sau
>> sin(1) + sin(2) - sin(3) + sin(4) - sin(5) + sin(6) - ...
sin(8) + sin(9) - sin(10) + sin(11) - sin(12)
ans =
1.0357
*) Dòng kí tự đặt sau dấu “%” chỉ có tác dụng làm dòng chú thích
>> sin(pi) % dùng để tính giá trị của sin (pi)
1.2 Sử dụng help trực tuyến
Chúng ta có thể dùng cấu trúc
>> help
Vd: help ops
Hoặc
>> lookfor
Vd : lookfor inverse
1.3 Đường dẫn
Trong Matlab, các lệnh hay các chương trình được chứa trong m-file, cái mà được biên soạn từ file văn bản nhưng khi lưu với đuôi mở rộng là “.m”. M-file chỉ chạy được khi nó nằm ở thư mục current working directory
1.4 Lưu và tải dữ liệu
Rất dễ dàng lưu hoặc gọi 1 biến nào đó, ta chỉ cần click vào File- menu sau đó chọn Save Workspace as... hoặc Load Workspace...
Vd : khi save
>> s1 = sin(pi/4);
>> c1 = cos(pi/4); c2 = cos(pi/2);
>> str = ’hello world’; % đây là 1 chuỗi
>> save % lưu toàn bộ biến với định dạng matlab.mat
>> save data % lưu các biến với định dạng nhị phân data.mat
>> save numdata s1, c1 % lưu các biến số s1 và c1 tới numdata.mat
>> save strdata str % lưu biến chuỗi str vào strdata.mat
>> save allcos.dat c* -ascii % saves c1,c2 in 8-digit ascii format to allcos.dat
Còn khi load
>> load % tải tất cả các biến từ file matlab.mat
>> load data s1 c1 % chỉ tải riêng từng biến trong file data.mat
>> load str data % tải tất cả các biến từ file strdata.mat
Chương 2: Các cấu trúc cơ bản và biến
2.1 Tính toán với Matlab
Có 3 loại biến số học: Số nguyên, số thực, số phức. Matlab còn hỗ trợ thêm những loại không phải là số: Inf (giá trị vô cực, ví dụ : 1/0 sẽ cho kết quả như vậy) hoặc NaN (không phải là số, là kết quả của các phép tính như 0/0 hoặc vô cùng – vô cùng)
Chúng ta có thể viết các biểu thức trên dòng lệnh của Matlab :
>> (23*17)/7
Kết quả sẽ là :
ans =
55.8571
Matlab có 6 toán tử cơ bản là : +, - , * , \ , /(chia phải hoặc trái) và ^(hàm mũ)
Chú ý sự khác nhau của toán tử chia trái và chia phải :
>> 19/3 % thực hiện phép chia: 19/3
ans =
6.3333
>> 19\3, 3/19 % thực hiện phép chia: 3/19
ans =
0.1579
ans =
0.1579
Những hàm cơ bản về lượng giác, mũ … có thể tìm hiểu
>> help elfun
Bài tập:
Xác định giá trị các biểu thức dưới đây bằng tay và bằng Matlab để so sánh. Chú ý tới sự khác nhau giữa chia trái và phải, và dùng lệnh help để tìm hiểu về các hàm: round, floor, ceil …
• 2/2 - 3
• 8 - 5\4
• 8 - (5\4)
• 7 − 5 - 4\9
• 6 − 2/5 + 7^2 − 1
• 10/2\5 − 3 + 2 - 4
• 3^2/4
• 3^2^3
• 2 + round (6/9 + 3 - 2)/2
• 2 + floor (6/9 + 3 - 2)/2
• 2 + ceil (6/9 + 3 - 2)/2
• x = pi/3, x = x − 1, x = x + 5, x = abs(x)/x
2.2 Giới thiệu dạng dữ liệu
Mặc dù tất cả các tính toán số trong Matlab đều được tính toán với độ chính xác kép (double precision), nhưng khuôn dạng của dữ liệu đưa ra có thể định dạng lại nhờ các lệnh định dạng của Matlab. Các biến ngầm định cũng như các biến của người sử dụng định nghĩa đều có thể đưa ra nhiều định dạng khác nhau. Định dạng được chọn nhờ sử dụng lệnh format tiếp đến là chỉ định long hay short và cuối cùng có thể là dạng biểu diễn của dữ liệu, cụ thể là e đối với dạng hàm mũ, f đối dạng dấu phẩy động(ngầm định là f). Một khuôn dạng ít dùng hơn là rat để đưa dữ liệu ra dưới dạng phân số (chính xác hoặc gần đúng ).
Ví dụ:
>> 4*atan(1)
ans =
3.1416
>> format long e
>> ans
ans =
3.141592653589793e+000
>> format long f
>> ans
ans =
3.14159265358979
>> format short e
>> ans
ans =
3.1416e+000
>> format rat
>> ans
ans =
355/113
Chương 3: Tính toán với ma trận và vec tơ
Nền tảng của Matlab chính là ma trận (hay mảng). Trường hợp đặc biệt:
1 ma trận 11: là 1 số vô hướng;
1 ma trận chỉ có 1 dòng hoặc 1 cột: là 1 vec tơ
3.1 Vec tơ
Vec tơ hàng là 1 danh sách các số được ngăn cách nhau bởi dấu cách hoặc dấu phẩy. Số lượng phần tử của 1 vec tơ được gọi là length của vec tơ. Các phần tử nhập vào phải đặt trong dấu “[ ]”. Vd:
>> v = [-1 sin(3) 7]
v =
-1.0000 0.1411 7.0000
>> length(v)
ans =
3
Một số phép toán có thể thực hiện với vec tơ như nhân vô hướng, cộng hoặc trừ từ các vec tơ khác có số phần tử tương tự, hoặc giữa 1 số với vec tơ. Mọi phép toán đều được thực hiện trên từng phần tử. Các vec tơ cũng có thể được xây dựng từ các phần tử hữu hạn.
>> v = [-1 2 7]; w = [2 3 4];
>> z = v + w % cộng từng phần tử
z =
1 5 11
>> vv = v + 2 % cộng 2 vào tất cả các phần tử vào vec tơ
vv =
1 4 9
>> t = [2*v, -w]
ans =
-2 4 14 -2 -3 -4
Đồng thời 1 phần tử có thể được trích dẫn ra, hoặc chỉnh sửa:
>> v(2) = -1 % sửa phần tử thứ 2 của v
v =
-1 -1 7
>> w(2) % hiển thị phần tử thứ 2 của w
ans =
3
3.1.1 Kí tự hai chấm và trích các phần tử của vec tơ
Dấu hai chấm là phím tắt quan trọng dùng để tạo ra vec tơ hàng:
>> 2:5
ans =
2 3 4 5
>> -2:3
ans =
-2 -1 0 1 2 3
Dạng tổng quát “first:step:last”, khởi tạo vec tơ dòng bắt đầu từ phần tử first, kết thúc tại phần tử last và với độ dài bước là step. Nếu không chỉ ra step, thì giá trị mặc định nó là bằng một.
>> 0.2:0.5:2.4
ans =
0.2000 0.7000 1.2000 1.7000 2.2000
>> -3:3:10
ans =
-3 0 3 6 9
>> 1.5:-0.5:-0.5 % cũng có thể dùng bước nhảy âm
ans =
1.5000 1.0000 0.5000 0 -0.5000
Các phần tử có thể được lấy ra bởi dấu hai chấm
>> r = [-1:2:6, 2, 3, -2] % -1:2:6 => -1 1 3 5
r =
-1 1 3 5 2 3 -2
11
>> r(3:6) % lấy ra các phần tử của r có vị trí từ 3 đến 6
ans =
3 5 2 3
>> r(1:2:5) %lấy ra các phần tử của r có vị trí 1,3 và 5
ans =
-1 3 2
>> r(5:-1:2) % chuyện gì sẽ xảy ra với trường hợp này?
3.1.2 Vec tơ cột và sự chuyển vị
Để tạo 1 vec tơ cột, chúng ta phải tách các phần tử bởi phím ‘enter’ hoặc dấu chấm phẩy:
>> z = [1
7
7];
z =
1
7
7
>> u = [-1; 3; 5]
u =
-1
3
5
Các phép toán cũng được thực hiện 1 cách tương tự, và cũng có thể chuyển dạng thành vec tơ hàng:
>> u’ % u là vec tơ hàng còn u’ là vec tơ cột
ans =
-1 3 5
3.1.3 Nhân, chia và mũ của vec tơ
Chúng ta có thể tính tích vô hướng của 2 vec tơ có cùng độ dài:
>> u = [-1; 3; 5] % 1 vec tơ cột
>> v = [-1; 2; 7] % 1 vec tơ cột
>> u * v % chúng ta không thể nhân vec tơ cột với vecto cột
??? Error using ==> *
Inner matrix dimensions must agree.
>> u’ * v % đây mới là tích vô hướng
ans =
42
Một cách khác để tính tích vô hướng là sử dụng dấu “.*”:
>> u .* v %nhân từng phần tử cho nhau
1
6
35
>> sum(u.*v) % cách lấy tích vô hướng
ans =
42
>> z = [4 3 1]; % z là vec tơ hàng
>> sum(u’.*z) % tích vô hướng
ans =
10
Trong toán học, chúng ta không chia vec tơ cho vec tơ. Tuy nhiên, trong Matlab chúng ta có thể chia từng phần tử cho nhau của các vec tơ có cùng kích cỡ và cùng loại:
>> x = 2:2:10
x =
2 4 6 8 10
>> y = 6:10
y =
6 7 8 9 10
>> x./y
ans =
0.3333 0.5714 0.7500 0.8889 1.0000
>> z = -1:3
z =
-1 0 1 2 3
>> x./z % chia 4/0, kết quả ra Inf
Warning: Divide by zero.
ans =
-2.0000 Inf 6.0000 4.0000 3.3333
>> z./z % chia 0/0, kết quả ra NaN
Warning: Divide by zero.
13
ans =
1 NaN 1 1 1
Toán tử “./” có thể thực hiện bởi 1 đại lượng vô hướng với 1 vector:
>> x=1:5; 2/x % không thể thực hiện
??? Error using ==> /
Matrix dimensions must agree.
>> 2./x % nhưng thế này thì được!
ans =
2.0000 1.0000 0.6667 0.5000 0.4000
3.2 Ma trận
Một ma trận
A =
Được định nghĩa trong Matlab như sau:
>> A = [1 2 3; 4 5 6; 7 8 9] % nhập theo hàng
A =
1 2 3
4 5 6
7 8 9
Hoặc cũng có thể:
>> A2 = [1:4; -1:2:5]
A2 =
1 2 3 4
-1 1 3 5
>> A3 = [1 3
-4 7]
A3 =
1 3
-4 7
Phép toán chuyển vị ma trận cũng có thể thực hiện 1 cách dễ dàng:
>> A2
A2 =
1 2 3 4
-1 1 3 5
>> A2’ % chuyển vị A2
ans =
1 -1
2 1
3 3
4 5
>> size(A2) % lấy cỡ của A2
ans =
2 4
>> size(A2’)
ans =
4 2
3.2.1 Các ma trận đặc biệt
>> E = [] % tạo lập 1 ma trận rỗng !
E =
[]
>> size(E)
ans =
0 0
>> I = eye(3); % ma trận đơn vị 33
I =
16
1 0 0
0 1 0
0 0 1
>> x = [2; -1; 7]; I*x % I is such that for any 3-by-1 x holds I*x = x
ans =
2
-1
7
>> r = [1 3 -2]; R = diag(r) % tạo lập 1 ma trận chéo với r nằm trên đường chéo
R =
1 0 0
0 3 0
0 0 -2
>> A = [1 2 3; 4 5 6; 7 8 9];
>> diag(A) % trích dẫn đường chéo của ma trận A
ans =
1
5
9
>> B = ones(3,2)
B =
1 1
1 1
1 1
>> C = zeros (size(C’)) % một ma trận toàn phần tử toàn là số 0 với kích thước bằng ma trận C’
C =
0 0 0
0 0 0
>> D = rand(2,3) % tạo 1 ma trận với các phần tử là các số ngẫu nhiên
D =
0.0227 0.9101 0.9222
0.0299 0.0640 0.3309
>> v = linspace(1,2,4) % một vec tơ được sử dụng như 1 ma trận
v =
1.0000 1.3333 1.6667 2.0000
3.2.2 Xây dựng ma trận và cách trích các phần tử của ma trận
Người ta thường xây dựng một ma trận lớn hơn từ những cái nhỏ hơn:
>> x = [4; -1], y = [-1 3]
x =
4
-1
y =
-1 3
>> X = [x y’] % X gồm có cột x và y’
X =
4 -1
-1 3
>> T = [ -1 3 4; 4 5 6]; t = 1:3;
>> T = [T; t] % thêm hàng cho T, hàng đó là vec tơ t
T =
-1 3 4
4 5 6
1 2 3
>> G = [1 5; 4 5; 0 2]; % G là ma trận 2*3
>> T2 = [T G] % ghép 2 ma trận
T2 =
-1 3 4 1 5
4 5 6 4 5
1 2 3 0 2
>> T3 = [T; G ones(3,1)] % G là 3*2, T là 3*3
T3 =
-1 3 4
4 5 6
1 2 3
1 5 1
4 5 1
0 2 1
>> T3 = [T; G’];
>> [G’ diag(5:6); ones(3,2) T] % chúng ta cso thể nối nhiều ma trận
ans =
1 4 0 5 0
5 5 2 0 6
1 1 -1 3 4
1 1 4 5 6
1 1 1 2 3
Một phần có thể được trích từ 1 ma trận tương tự như cách lấy của vectơ. Mỗi phần tử trong ma trận được mang chỉ số bởi vị trí của nó trong hàng và cột. Ví dụ:
>> A = [1:3; 4:6; 7:9]
A =
1 2 3
4 5 6
7 8 9
>> A(1,2), A(2,3), A(3,1)
ans =
2
ans =
6
ans =
7
>> A(4,3) % this is not possible: A is a 3-by-3 matrix!
??? Index exceeds matrix dimensions.
>> A(2,3) = A(2,3) + 2*A(1,1) % sửa giá trị của phần tử A(2,3)
A =
1 2 3
4 5 8
7 8 9
Ta có thể dễ dàng mở rộng ma trận:
>> A(5,2) = 5 % gán 5 vào vị trí (5,2);
A =
1 2 3
4 5 8
7 8 9
0 0 0
0 5 0
>> A(4,:) = [2, 1, 2]; % gán vec tơ [2, 1, 2] cho hàng thứ 4 của A
>> A(5,[1,3]) = [4, 4]; % gán : A(5,1) = 4 và A(5,3) = 4
>> A
Lấy các phần tử khác của A:
>> A(3,:) % trích ra hàng thứ 3 của A
ans =
7 8 9
>> A(:,2) % trích ra cột thứ 2 của A
ans =
2
5
8
1
5
>> A(1:2,:) % trích ra hàng 1 và 2 của A
ans =
1 2 3
4 5 8
>> A([2,5],1:2) % trích ra các phần của A
ans =
4 5
4 5
Khái niệm về ma trận rỗng [] rất hữu ích trong Matlab. 1 số hàng hoặc cột của ma trận có thể được loại bỏ bằng cách gán nó bằng 1 ma trận rỗng:
>> C = [1 2 3 4; 5 6 7 8; 1 1 1 1];
>> D = C; D(:,2) = [] % copy C vào D, xóa cột thứ 2 của D
>> C ([1,3],:) = [] % xóa hàng 1 và hàng 3 của C
3.2.3 Các phép toán với ma trận
Các phép toán thực hiện với ma trận cũng tương tự với vec tơ:
>> B = [1 -1 3; 4 0 7]
B =
1 -1 3
4 0 7
>> B2 = [1 2; 5 1; 5 6];
>> B = B + B2’ % cộng 2 ma trận. Tại sao phải thay B2’ cho B2?
B =
2 4 8
6 1 13
>> B-2 % trừ các phần tử của B cho 2
ans =
0 2 6
4 -1 11
>> ans = B./4 % chia các phần tử của B cho 4
ans =
0.5000 1.0000 2.0000
1.5000 0.2500 3.2500
>> 4/B % đây là điều không thể
??? Error using ==> /
Matrix dimensions must agree.
>> 4./B % nhưng đây lại có thể ; tương đương với: 4.*ones(size(B)) ./ B
ans =
2.0000 1.0000 0.5000
0.6667 4.0000 0.3077
>> C = [1 -1 4; 7 0 -1];
>> B .* C % nhân từng phần tử
ans =
2 -4 32
42 0 -13
>> ans.^3 – 2 % thực hiện cho tất cả các phần tử
ans =
6 -66 327 66
74086 -2 -2199 20
>> ans ./ B.^2
ans =
0.7500 -1.0312 63.9961
342.9907 -2.0000 -1.0009
>> r = [1 3 -2]; r * B2
ans =
6 -7
Khi thực hiện nhân ma trận:
>> b = [1 3 -2];
>> B = [1 -1 3; 4 0 7]
B =
1 -1 3
4 0 7
>> b * B % không thể thực hiện: b là ma trận 1*3 và B là 2*3
??? Error using ==> *
Inner matrix dimensions must agree.
>> b * B’
ans =
-8 -10
>> B’ *ones(2,1)
ans =
5
-1
10
>> C = [3 1; 1 -3];
>> C * B
ans =
7 -3 16
-11 -1 -18
>> C.^3 % thực hiện trên từng phần tử
ans =
27 1
1 -27
>> C^3 % tương đương với C*C*C
ans =
30 10
10 -30
>> ones(3,4)./4 * diag(1:4)
ans =
0.2500 0.5000 0.7500 1.0000
0.2500 0.5000 0.7500 1.0000
0.2500 0.5000 0.7500 1.0000
Chương 4: Đồ họa
4.1 Đồ thị đơn giản
Đơn giản nhất, đồ thị có thể được vẽ nhờ nối các điểm được đánh dấu trên mặt phẳng tọa độ Đề các. Ví dụ:
>> x = 0:10;
>> y = 2.^x; % ta được y = [1 2 4 8 16 32 64 128 256 512 1024]
>> plot(x,y) % vẽ
>> semilogy(x,y)
Để đưa nhiều đồ thị lên cùng một cửa sổ ta dùng lệnh subpot, chính xác hơn, subplot(m,n,i) tạo mn bản vẽ, được sắp xếp trong mảng với m dòng và n cột. Lệnh này cũng bắt plot tiếp theo phải chuyển đến hệ tọa độ thứ i (đếm theo số dòng). Ví dụ:
>> t=(0:.1:2*pi);
>> subplot(2,2,1)
>> plot(t,sin(t))
>> subplot(2,2,2)
>> plot(t,cos(t))
>> subplot(2,2,3)
>> plot(t,exp(t))
>> subplot(2,2,4)
>> plot(t,1./(1+t.^2))
4.2 Vẽ đường
Hàm plot được sử dụng để vẽ dữ liệu trên mặt phẳng. Cho vec tơ x gồm các hoành độ x1,…,xn và vec tơ y gồm các tung độ y1,…yn, lệnh plot(x,y) sẽ vẽ các điểm từ (x1,y1) đến (xn,yn). Theo mặc định, các điểm này sẽ được nối theo thứ tự bởi các đoạn thẳng.
Câu lệnh tổng quát:
Mầu của đường vẽ
Ký tự hiển thị
Nét vẽ
y yellow
m magenta
c cyan
r red
g green
b blue
w white
k black
. dấu chấm(point)
O vòng tròn
X dấu x
+ dấu cộng
* dấu sao
s hình vuông
d kim cương
tam giác chỉ lên
tam giác chỉ xuống
< tam giác chỉ sang trái
> tam giác chỉ sang phải
p ông sao 5 cánh
h ông sao 6 cánh
- solid
: dotted
-. dashdot
-- dashed
Ví dụ:
Lệnh plot(x,y,’ro:’) vẽ đường nối bởi các chấm màu đỏ với điểm dữ liệu là vòng tròn nhỏ.
Lệnh plot(x,y,’y-’,x,y,’go’) vẽ dữ liệu 2 lần với đường nối liền nét màu vàng và các điểm dữ liệu là các vòng tròn xanh lá cây.
Để vẽ tứ giác với các đỉnh (0,0), (1,1), (4,2), và (5,-1) ta có thể dùng lệnh:
>> x=[0 1 4 5 0];
>> y=[0 1 2 -1 0];
>> plot(x,y)
Ta cũng có thể gần đúng đồ thị hàm số bằng cách lấy nhiều điểm. Ví dụ vẽ đồ thị hàm số / [-2;2]. Trước hết, ta lấy vec tơ dòng với các thành phần biến thiên từ -2 đến 2 với độ dài bước chia là 0.05
>> x=-2:.05:2;
Tiếp đó là xác định các giá trị của y bằng cách lấy lũy thừa từng phần tử của x.
>> y=x.^3;
Cuối cùng:
>> Plot(x,y)
Ta đặt tên cho hình vẽ nhờ đánh lệnh
>>title(‘Do thi cua ham f(x)=x^3’)
Hình 1: Đồ thị hàm số
Vẽ các đường cong tham số cũng tương tự:
với .
>> t=0:.1:4*pi;
>> x=2*t.*cos(t)./(t+1);
>> y=2*t.*sin(t)./(t+1);
>> plot(x,y);
>> title( '(2t cos t/ (t+1)),2t sin t/(t+1)' )
Chú ý: các phép toán nhân chia phải được thực hiện trên từng phần tử(nghĩa là .*, ./ hoặc .^).
Để có tỷ lệ chính xác ta dùng:
>> axis equal
Hình 2: Đồ thị hàm số cho bởi phương trình tham số
Để vẽ nhiều đường trên cùng 1 hình ta dùng lệnh “hold on”.
Ví dụ: vẽ 2 đường tròn và . Chuyển sang phương trình tham số:
và với .
>> t=0:pi/20:2*pi;
>> plot(2*cos(t),2*sin(t))
>> hold on
>> plot(1+cos(t),1+sin(t))
>> axis equal
>> title('Cac duong tron x^2+y^2=4 va (x-1)^2+(y-1)^2=1')
Hình 3: vẽ đồ thị nhiều hàm trên cùng một hình
Trong không gian 3 chiều thì thay lệnh plot bằng plot3. Ví dụ:
Để vẽ đường tham số với ta có thể làm như sau:
t=0:.1:8*pi;
>> plot3(cos(t),sin(t),t)
>> title('(cos t,sin t,t)')
Hình 4a: vẽ đồ thị đường cho bởi phương trình tham số trong không gian 3 chiều
Để vẽ đường trong tọa độ cực , với :
>> theta = 0:.2:5*pi;
>> rho=theta.^2;
>> polar(theta,rho,'hb')
Hình 4b: vẽ đồ thị trong hệ tọa độ cực
4.3 Vẽ mặt
Để đồ thị hàm số trên miền hình chữ nhật
Trước hết ta tạo lưới điểm trong miền khảo sát nhờ hàm meshgrid
Ví dụ: vẽ đồ thị hàm số trên miền chữ nhật . Ta sử dụng lưới vuông với độ dài bước chia 0.1
>> [x,y]=meshgrid(-2:.1:2,-1:.1:1);
Sử dụng phép toán vec tơ hóa để xác định Z.
>> z=(x.^2).*y-2*y;
Cuối cùng ta vẽ
>> surf(x,y,z)
>> title('Do thi cua ham so f(x,y)=x^2y-2y')
Hình 5: Vẽ mặt trong 3 chiều
Một trong những khó khăn khi vẽ mặt là phải đối mặt với phép chia cho 0. Chẳng hạn, ta muốn vẽ đồ thị của hàm số
trên lưới vuông . Thực hiện lệnh
>> [x,y]=meshgrid(-1:.1:1);
>> z=x.*y./sqrt(x.^2+y.^2);
Warning: Divide by zero.
Nếu ta cứ vẽ mặt như vậy điểm lưới tại (0,0) sẽ khuyết
Hình 6a: Vẽ mặt
Để tránh khỏi tình huống này, một cách đơn giản là hãy xác định lưới sao cho điểm (0,0) không thuộc điểm chia. Chẳng hạn:
>> surf(x,y,z)
>> [x,y]=meshgrid(-.99:.1:1);
>> z=x.*y./sqrt(x.^2+y.^2);
>> surf(x,y,z)
>> title('Do thi ham so f(x,y)=xy/\surd(x^2+y^2)')
>> axis equal
Hình 6b: Vẽ mặt trong 3 chiều tránh khuyết
Ví dụ. Vẽ z=sin(r)/r với .
>> x=-8:.5:8;y=-8:.5:8;
>> [x,y]=meshgrid(x,y);
>> r=sqrt(x.^2+y.^2)+eps;
>> z=sin(r)./r;
>> mesh(x,y,z)
Hình 7: vẽ mặt trong 3 chiều bởi mesh
Điểm khác nhau giữa hai lệnh surf và mesh là: surf tô màu bề mặt,còn mesh thì không.
Chương 5: Các luồng điều khiển
5.1 Các toán tử logic
Lệnh
Kết quả
A=(b>c)
A=1 nếu b>c, tương tự =, <=
A=(b=c)
A=1 nếu b=c
A=(b~=c)
A=1 nếu b khác c
A= ~b
A=1 nếu b=0
A=(b&c)
A=1 nếu b =true và c=true
A=(b|c)
A=1 nếu b=true hoặc c=true
Bảng 1: mối quan hệ giữa các phép toán logic
Chú ý : toán tử & và toán tử | có mức ưu tiên như nhau trong Matlab,điều đó có nghĩa là nó sẽ thực hiện từ trái qua phải.
5.2 Lệnh find
Chúng ta có thể trích các phần tử trong vec tơ và ma trận thỏa mãn những điều kiện nào đó, bằng toán tử xác định vị trí. Chẳng hạn như dùng lệnh xác định vị trí find
>> 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 =
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.
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
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
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;
>> 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])
Vẽ đồ thị hàm số trên đoạn [min_x max_x]
Fmin(‘f’,min_x, max_x)
Cho giá trị của x khi hàm số đạt cực tiểu /[min_x, max_x]
Fmax(‘f’, min_x, max_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
>> 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
Chẳng hạn xét hàm số , đ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à , 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í dụ:
>> f = ’1./((x-0.1).^2 + 0.1) + 1./((x-1).^2 + 0.1)’;
>> integral1 = quad(f,0,2)
>> integral2 = quadl(f,0,2)
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ố , với x=0.42
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 .
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)
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;
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)
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
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
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
>> 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
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 1.0000e+00
5.0e-01 1.6487e+00
1.0e+00 2.7183e+00
>>
>> x = 1:3:7;
>> y = [x; sin(x)];
>> fprintf(’%2d %10.4g\n’,y);
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’ 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 filename)
‘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
[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
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 =
1 2 3 4 5
6 7 8 9 10
>>frewind(4);
>> B = fscanf(4,’%i’,[5,2])
B=
6
7
8
9
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, 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
2.46 2.71828183
Phần II: Ứng dụng của Matlab
trong công nghệ hóa học
Trong thực tế, các bài toán công nghệ hóa học rất phức tạp, thiết kế và vận hành một quá trình thì luôn luôn đi kèm với tính kinh tế của nó. Do đó, tối ưu hóa quá trình thiết kế và vận hành là vô cùng cần thiết, việc mô phỏng và tính toán nhanh và chính xác luôn được đánh giá rất cao. Hiện nay, chiếc máy tính cùng với các phần mền tính toán và mô phỏng giúp chúng ta giải quyết những bài toán đó đơn giản hơn, thời gian được tiết kiệm triệt để.
Trong học tập, các bài toán công nghệ hóa cũng cần một khối lượng tính toán khá lớn, có rất nhiều hằng số phải tra cứu(khối lượng riêng, nhiệt hóa hơi, hằng số trong phương trình Antoine…) và cũng không ít những phương trình thực nghiệm phức tạp trong các trường hợp khác nhau( tính chuẩn Nuselt…), việc tính toán bằng tay trở nên mất thời gian và có khả năng sai rất lớn. Matlab bằng công cụ tính toán, và mô phỏng phong phú và rất mạnh có thể khắc phục điều đó.
Chương 1: Dẫn nhiệt và đối lưu
1.1. Dẫn nhiệt
1.1.1. Tóm tắt lí thuyết
dẫn nhiệt qua vách phẳng
W/m2
q mật độ dòng nhiệt q = const qua các lớp δi chiều dày của các lớp thứ i (m);λi là hệ số dẫn nhiệt của lớp thứ i (W/mK); tw1 nhiệt độ mặt trong ; tw(n+1) nhiệt độ mặt ngoài của lớp thứ n
dẫn nhiệt qua vách trụ
trong đó :
+ ql mật độ dòng nhiệt trên một mét chiều dài (W/m)
+ di đường kính của lớp thứ i (m)
+ λi hệ số dẫn nhiệt của lớp thứ i (W/mK)
dẫn nhiệt không ổn định
với tâm phằng dày 2δ
nhiệt độ tại tâm tấm
Nhiệt độ trên bề mặt tấm
Trong đó :
tiêu chuẩn Biot
tiêu chuẩn fourier (hệ số nhiệt độ )
: kích thước không thứ nguyên
1.1.2. Ví dụ
1. Ví dụ vách phẳng hai lớp có bề dày và hệ số dẫn nhiệt tương ứng là δ1 = 10 cm λ1= 2.5W/m độ δ2=0.3m λ2=1.5W/m độ. nhiệt độ mặt phải là tm2=250 C khi có dòng nhiệt q = 500W/m2 dẫn qua vách xác định
Các file đính kèm theo tài liệu này:
- Kỹ thuật tính toán trong công nghệ hóa học.doc