Bài 1: Biến và các phép toán
Theo bài giảng của Danilo Šćepanović - MIT Opencourseware
Nội dung
1. Làm quen với MATLAB
2. Scripts
3. Biến (Variable)
4. Các phép toán
5. Vẽ đồ thị cơ bản
1. Làm quen với MATLAB
Sau khi cài đặt, mở Matlab từ màn hình Desktop hoặc qua Start Menu.
Màn hình giao diện có dạng như sau:
Command Window là nơi người dùng gõ lệnh và cũng là nơi nhận kết quả tính toán của Matlab. Mỗi câu lệnh được thực hiện sau khi người dùng ấn nút Enter.
Workspace là nơi biểu diễn các dữ liệu đang sử dụng, giúp ta biết được loại, kích thước và nội dung các biến hiện có trong bộ nhớ của MATLAB.
Command History mọi câu lệnh Matlab thực hiện đều được lưu trong Command History. Nếu muốn thực hiện lại lệnh nào, chỉ cần click đúp vào câu lệnh được lưu trong Command History.
Tạo thư mục lưu trữ
- Sử dụng các thư mục gọn gàng để lưu trữ các file bạn thực hiện với Matlab.
- Để tạo một thư mục mới, click vào 'Browse' ở gần 'Current Directory'
- Click vào 'Make New Folder', và đặt tên cho Folder mới tạo. Lưu ý: Không được dùng các khoảng trắng (space) trong tên của Folder. Trong thư mục MATLAB, tạo 2 thư mục mới: IAPMATLAB\day1
- Đánh dấu thư mục bạn mới tạo và click 'OK'
- Lúc này, thư mục hiện hành là thư mục bạn vừa mới tạo
- Để xem một chương trình ở ngoài thư mục hiện hành, cần đưa chúng vào Path. MATLAB chỉ quản lý file được chứa trong Path. Để đặt một Folder vào Path, thực hiện như sau: VàoFile->>;Set Path để thêm Folder vào Path.
- Tùy chỉnh MATLAB: Bạn có thể tùy chỉnh Matlab theo ý mình trong việc biên dịch, soạn thảo,... bằng cách vào File -> Preferences.
-Tạm thời khi mới làm quen với MATLAB, bạn không nên chỉnh các lựa chọn trong phần này.
-Tạm thời khi mới làm quen với MATLAB, bạn không nên chỉnh các lựa chọn trong phần này.
Help/Docs
Command Window là nơi bạn gõ lệnh, Matlab sẽ lập tức thực hiện các câu lệnh của bạn sau khi bạn ấn Enter.
Để mở Helps của Matlab, trên Command Window bạn gõ:
>> help
Sau đó bạn ấn Enter. Khi đó, File Helps của Matlab sẽ hiện ra. (Tips: Nếu muốn sử dụng thành thạo Matlab, bạn bắt buộc phải tra cứu Helps rất nhiều lần)
Để có được thông tin hướng dẫn về một câu lệnh bất kì của MATLAB, ví dụ muốn tìm hướng dẫn của câu lệnh sin, sử dụng câu lệnh:
>> help sin
Để được một tài liệu dễ đọc hơn, dùng câu lệnh:
>> doc sin
Để tìm một hàm nào đó với một từ khóa cụ thể, dùng câu lệnh:
>> doc " từ cần tìm "
2. Scripts
Scripts là một tập các câu lệnh được thực hiện theo trình tự được viết trong MATLAB editor save dưới dạng MATLAB files (đuôi .m)
Để tạo một MATLAB file, từ Command Window gõ
>> edit helloWorld.m
hoặc click vào biểu tượng New
Comment:
mọi kí tự sau % được coi là comment
phần comment đầu tiên của script sẽ được MATLAB coi là phần help của script.
Nên tạo thói quen comment cho các lệnh khi lập trình để tránh lãng phí thời gian xem lại code của mình.
Chú ý: rằng các script là thủ tục static, bởi vì không có input và không có một biến ra được định nghĩa rõ ràng.
Mọi biến tạo và sửa đổi trong một script tồn tại trong workspace kể cả khi script đó đã được MATLAB thực hiện xong.
Bây giờ hãy viết Script đầu tiên của bạn: Helloworld.m
Khi được gọi script này chỉ làm nhiệm vụ là in ra trên Command Window dòng chữ:
Hello world!
I am going to learn MATLAB!
Để thực hiện, bạn cần dùng câu lệnh disp , ví dụ disp('This is a string') , đây là câu lệnh để in ra một chuỗi kí tự nằm trong dấu 2 dấu ' ', cụ thể với câu lệnh trên sẽ in ra dòng chữ This is a string
Thực hiện: Mở Editor và save một script với tên Helloworld.m và đánh các dòng lệnh sau:
% Helloworld.m
% My fiirst Hello World program in Matlab
disp('Hello world!');
disp('I am going to learn MATLAB!');
Save script vừa tạo, sau đó trên Command Window, gõ Helloworld.m rồi enter để MATLAB thực hiện các dòng lệnh trong script này. Bạn sẽ nhận được dòng chữ như mong muốn (Nếu như bạn không thành công, hãy xem lại xem thư mục hiện tại của MATLAB có phải là thư mục đang chứa file Helloworld.m hay không, nếu chưa thì bạn cần chuyển đến thư mục đó và thực hiện lại bước này).
3. Biến (Variable)
Với MATLAB, bạn không cần khai báo biến trước khi sử dụng. Mỗi khi bạn gán một biến mới, MATLAB sẽ giúp bạn định nghĩa dựa vào dữ liệu biến ấy chứa.
MATLAB hỗ trợ nhiều loại biến, thông thường bạn dùng MATLAB để tính toán với ma trận hoặc vector cả số học hay kí tự.
Để tạo một biến, chỉ cần gán một giá trị vào cho một tên biến
>> var1=3.14
>> myString='hello world'
Qui tắc đặt tên biến:
- kí tự đầu tiên phải là chữ cái
- các kí tự sau có thể là chữ cái hoặc số, hay _
- MATLAB phân biệt chữ hoa với chữ thường (var1 khác với Var1)
- Một số biến đã được MATLAB định nghĩa sẵn, không được dùng những tên biến này.
- i và j được dùng cho đơn vị phức
- pi : số pi, có giá trị 3.1415926...
- ans : lưu kết quả của phép toán vừa thực hiện
- Inf và -Inf là dương và âm vô cực
- NaN : thể hiện Not a Number, không là một số.
- Biến vô hướng:
- Một biến vô hướng có thể được định nghĩa bằng cách gán giá trị trực tiếp:
>> a = 10
(biến này sẽ lập tức xuất hiện trên Workspace!)
hay định nghĩa thông qua một biến đã có:
>> c = 1.3*45-2*a
Nếu không muốn MATLAB đưa ra kết quả trên Command Window, bạn thêm dấu ; vào cuối dòng lệnh.
>> d = 13/3;
Mảng (Array)
Mảng là một thành phần rất quan trọng của MATLAB.
Có 2 loại mảng:
- mảng số : ma trận số thực hoặc số phức.
- mảng cell : một cấu trúc dữ liệu trừu tượng, là mảng của các đối tượng.
Vector hàng: dùng dấu cách hoặc dấu phẩy để ngăn cách các phần tử trong dấu ngoặc vuông [ ] >> row = [1 2 5.4 -6.6] % hoặc sử dụng cách sau
>> row = [1,2,5.4,-6.6]
cả hai cách đều cho cùng một kết quả như sau:
Vector cột: dùng dấu chấm phẩy ngăn cách các phần tử trong dấu ngoặc vuông >> col = [4;2;7;4]
Kết quả như sau:
Để xem kích thước các biến có thể dùng 3 cách:
- xem biến trong Workspace
- gọi biến trong Command Window
- dùng hàm size để xác định kích thước biến
Để biết kích thước lớn nhất của biến, dùng hàm length
Ma trận: Khởi tạo ma trận như với vector hàng và vector cột:
có thể khởi tạo bằng cách liệt kê các phần tử của mảng >> a = [1 2; 3 4]
sẽ khai báo ma trận:
hoặc có thể bằng cách ghép các ma trận có sẵn:
Để lưu các biến đang có vào 1 file ta dùng lệnh save: >> save myFile a b
câu lệnh này sẽ lưu 2 biến a và b vào file myFile.m, file này được tạo trong thư mục hiện thời.
Để xóa các biến hiện có, dùng câu lệnh clear. Ví dụ muốn xóa hai biến a, b: >> clear a b
Để tải các biến đã lưu, dùng lệnh load >> load a b
Có thể dùng các lệnh trên cho toàn bộ các biến như sau:
>> save myenv; clear all; load myenv;
Để tránh nhàm chán, mời bạn thử làm một bài tập nhỏ sau đây với mục đích in ra thời gian hiện tại và lưu lại:
1. Tạo một biến start sử dụng hàm clock. Để biết hàm clock có chức năng gì, hãy dùng câu lệnh help.
2. Tìm kích thước của biến start, đây là một vector hàng hay vector cột?
3. Biến start gồm những thông tin gì?
4. Chuyển đổi vector start thành một biến string, sử dụng hàm datestr. Đặt tên biến này là startString.
5. Lưu biến start và startString vào một file tên là startTime.
4. Các phép toán
Các phép toán cơ bản
( + , - , * , / ). Ví dụ: >> 7/45
>> (1+i)*(2-1)
Phép lũy thừa (^). Ví dụ: >> 4^2
>>(3+e)^0.1
Với các biểu thức phức tạp, cần sử dụng các dấu ngoặc đơn. >> ((2+3)*3)^(e-1)
Chú ý để không bị thiếu dấu nhân, ví dụ: >> 3(1+0.7) % MATLAB sẽ báo lỗi
Các hàm toán học được định nghĩa sẵn (Built-in Functions) >> sqrt(2) % Căn bậc hai
>> log(2); log10(1.2) % Hàm loga
>> cos(1.2), atan(-.8) % Các hàm lượng giác
>> round(1.2), floor(3.3), ceil(4.23) % Làm tròn số
>> exp(2+4*i) % Hàm lũy thừa cơ số tự nhiên
>> angle(i); abs(1+i); % Các phép toán với số phức
Bài tập
1. Giả sử hằng số thời gian của việc học của bạn là 1.5 ngày. Tính thời gian theo giây của 1.5 ngày và gán giá trị này cho biến tau.
2. Khóa học MATLAB cơ bản này kéo dài 5 buổi. Tính thời gian theo giây của 5 ngày và gán giá trị này cho biến endofClass
3. Phương trình sau biểu thị mối quan hệ của lượng kiến thức bạn thu được theo thời gian t:
k = 1 - e^(-t/T)
Tính lượng kiến thức bạn sẽ học được tại thời điểm endofClass. Gán vào biến knowledgeAtEnd (sử dụng hàm exp)
4. Sử dụng giá trị của knowlegdeAtEnd, in ra dòng sau:
At the end of 6.094, I will know X% of MATLAB với X = num2str(knowlegdeAtEnd)*100. Hàm num2str là hàm chuyển một số sang một xâu kí tự.
Các phép toán trên vector
Phép chuyển vị (lưu ý: toán tử ' sẽ cho chuyển vị Hamilton, tức là chuyển vị và lấy số phức liên hợp) >> a = [1 2 3 4+i]
>> transpose(a)
>> a'
>> a.'
Cộng trừ ma trận: Thực hiện như với các biến đơn, yêu cầu các vector đó phải có cùng kích cỡ.
Để tính tổng hay tính tích tất cả các phần tử của vector dùng lệnh sum và lệnh prod
Các phép toán với từng phần tử: những hàm được định nghĩa sẵn sử dụng được với các phần tử vô hướng hầu như đều sử dụng được với vector
>> t = [1 2 3];
>> f = exp(t); % Cũng tương đương với
>> f = [exp(1) exp(2) exp(3)];
Nếu như không chắc chắn, nên sử dụng lệnh help để kiểm tra xem liệu hàm có hỗ trợ cho từng phần tử của mảng hay không.
Các toán tử (*/ ^) có hai cách sử dụng là cách sử dụng thông thường và cách sử dụng với từng phần tử của mảng.
Để sử dụng với từng phần tử của mảng, dùng dấu . ở trước toán tử (.* , .^, ./) . Cần chú ý tới kích thước của vector khi sử
dụng các toán tử này (trừ khi một trong hai toán hạng là một vô hướng).
>> a = [1 2 3]; b = [4; 2; 1];
>> a.*b, a./b, a.^b % Tất cả đều sai vì kích thước 2 vector không phù hợp
>> a.*b' , a./b' , a.^(b') % Đều được chấp nhận.
Các toán tử trên ma trận:
>> [1 2 3] * [4 2 1]'
ans =
11
>> [1 2; 3 4]^2 % Chú ý chỉ có ma trận vuông mới có thể nâng lên lũy thừa.
% Câu lệnh đó tương đương với [1 2; 3 4] * [1 2; 3 4]
>> [1 1 1; 2 2 2; 3 3 3]/[1 2 3; 1 2 3; 1 2 3] % Phép chia trái
>> [1 1 1; 2 2 2; 3 3 3]/[1 2 3; 1 2 3; 1 2 3] % Phép chia phải
Khởi tạo ma trận với giá trị mong muốn: sử dụng các lệnh ones, zeros, rand, eyes,...
>> o = ones(1,10) % vector hàng với 10 phần tử bằng 1
>> z = zeros(2,3) % ma trậnvới 2 cột, 3 hàng, các phần tử bằng 0
>> r = rand(1,45) % vector hàng với 45 phần tử lấy ngẫu nhiên (phân bố đều trong đoạn [0, 1])
>> e = eyes(3) % ma trận đơn vị 3x3
Khởi tạo một vector có các phần tử tăng tuyến tính
>> a = linspace( 0, 10 , 5) % Các phần tử bắt đầu tại 0, kết thúc tại 10, gồm 5 giá trị.
>> b = 0:2:10 %bắt đầu tại 0, mỗi phần tử tăng thêm 2, kết thúc khi bằng hoặc lớn hơn 10.
>> c=1:5 %nếu như giá trị tăng không được khai báo, giá trị default là 1.
Tương tự để khởi tạo một vector có các phần tử tăng theo logarith dùng lệnh logspace (các bạn tự tìm hiểu help).
Bài tập:
1. Tiếp theo bài tập trước, tạo một vector tuyến tính thời gian, tVec gồm 10000 phần tử từ 0 đến endOfClass.
2. Tính các giá trị của vector knowledgeVec tại mỗi điểm tương ứng của tVec theo công thức: k = 1 - exp(-t/tau)
Truy cập đến các phần tử trong vector (chỉ số)
MATLAB bắt đầu đánh số từ 1 (khác C đánh số mảng từ 0).
a(n) sẽ trả về phần tử thứ n của vector hàng.
Các chỉ số có thể cho dưới dạng vector, trong trường hợp này, kết quả trả về là một mảng có kích thước có tương đương với vector chỉ số.
>> x = [12 13 5 8];
>> a = x(2:3); % a = [13 5]
>> b = x(1:end-1); % b = [12 13 5], end = chỉ số cuối cùng của vector.
Truy cập đến các phần tử của ma trận
Các phần tử của ma trận có thể được đánh số dựa vào: 2 chỉ số hàng và cột (subscripts) hoặc dùng chỉ số tuyến tính (indices) giống như cách đánh chỉ số mảng nhiều chiều trong C (nhưng không bắt đầu từ (0,0)).
>> b = [14 33; 9 8] % Khi đó b(1,1)= 14 = b(1);b(1,2) = 33 =b(2);b(2,1)=9=b(3);b(2,2)=8=b(4)
% Để lấy được một ma trận con, đưa vào 1 mảng chỉ số.
>> A = rand(5) % Tạo một ma trận ngẫu nhiên 5x5
>> A(1:3,1:2) % Lấy một ma trận con từ 2 mảng chỉ số
>> A([1 5 3], [1 4]) % Cách khác để lấy 1 ma trận con
Truy cập đến từng phần tử của mảng (nâng cao)
MATLAB có sẵn các hàm để giúp lọc các phần tử mong muốn từ một ma trận.
Để tìm phần tử bé nhất và chỉ số của nó, dùng câu lệnh:
>> vec = [5 3 1 9 7]
>> [minVal, minInd] = min(vec) % Câu lệnh max sử dụng tương tự
Để tìm vị trí mọi phần tử có giá trị nhất định hay nằm trong một khoảng nhất định dùng lệnh find
>> ind = find(vec == 9) %Tìm chỉ số của các phần tử bằng 9
>> ind = find(vec>2 & vec <6 font="">6>
Để chuyển giữa 2 dạng: chỉ số hàng, cột (subscripts) và dạng đánh số tuyến tính (indices) dùng câu lệnh ind2sub, và sub2ind.
5. Vẽ đồ thị cơ bản
MATLAB giúp cho việc biểu diễn trực quan dữ liệu được đơn giản và hiệu quả. Khả năng biểu diễn dữ liệu trực quan của MATALAB là rất lớn( vẽ 2D, 3D, vẽ phối cảnh, vẽ các dạng biểu đồ). Trong phần này, ta sẽ tìm hiểu về cách vẽ một đồ thị 2D với lệnh plot.
Ví dụ: Vẽ đồ thị hàm sin trên đoạn [0, 4*pi]
>> x = linspace( 0, 4*pi, 10); %Chia đoạn [0, 4*pi] thành 10 điểm.
>> plot(y) ; % Vẽ đồ thị của y theo các giá trị chỉ số của y.
>> plot(x, y) % Vẽ đồ thị của y theo x
Hàm plot tạo các điểm tại mỗi cặp (x, y) rồi nối chúng lại với nhau.
Để cho đồ thị được "trơn" hơn, sử dụng nhiều điểm hơn để vẽ.
>> x = linspace( 0, 4*pi, 1000);
>> plot(x, sin(x));
Các vector x và y cần phải có cùng kích cỡ nếu không MATLAB sẽ báo lỗi. >> plot([1 2] , [1 2 3]) % error!
Bài tập
1. Tiếp theo bài tập trước, dùng lệnh figure để mở một màn hình đồ thị mới.
2. Vẽ đường biểu diễn kiến thức thu được sử dụng vector tVec và knowledgeVec. Khi vẽ, chuyển đổi tVec sang đơn vị ngày bằng cách dùng thêm lệnh secPerDay.
3. Zoom hình vẽ lên để kiểm tra đồ thị được nối từ các điểm phần biệt.
Hướng dẫn: Thêm vào file dòng lệnh sau:
>> figure
>> plot(tVec/secPerDay, knowledgeVec)
Vừa đọc và làm đến đây thì xem như bạn đã thành công bước đầu khi sử dụng Matlab rồi.
Để hiểu sâu hơn các bạn xem kế tiếp.
0 nhận xét:
Post a Comment