I. GIỚI THIỆU CHUNG VỀ MATLAB
1. Giới thiệu về Matlab, phạm vi ứng dụng
1.1. Phần mềm Matlab
MATLAB là phần mềm ứng dụng của tập đoàn Mathworks (Mỹ). Đây là phần mềm xử lý toán học rất mạnh, thông qua việc thực hiện các phép toán trên ma trận (MAT), được các chuyên gia toán học và máy tính đã lập trình các thuật giải thông qua các thư viện công cụ xử lý toán học (LAB - Laboratories). Phần mềm cũng cung cấp nhiều module khác nhau, phục vụ cho các lĩnh vực, các chuyên ngành cụ thể.
- Định hướng của phần mềm Matlab là dùng cho những cán bộ nghiên cứu, thiết kế và lập trình.
- Đối với ngôn ngữ lập trình thông thường để giải bài toán người ta phải thực hiện qua các bước sau:
Xây dựng mô hình cơ học ®Xây dựng mô hình toán học ® áp dụng phương pháp toán ® Xây dựng thuật toán® Lập trình
- Trong Matlab ta không cần quan tâm nhiều đến việc sử dụng phương pháp toán
1.2. Phạm vi ứng dụng
Ø Matlab đóng vai trò như một công cụ tính toán mạnh cho phép nhanh chóng tính ra trị số của biểu thức phức tạp và lưu giữ trị số của biểu thức vào bộ nhớ của máy tính
Ø Malab cung cấp các công cụ xử lý các mảng dữ liệu : véc tơ và ma trận, cho phép tính toán ra kết quả của các biểu thức với dữ liệu đầu vào là các véc tơ
Ø Matlab cung cấp các hàm để giải quyết các vấn đề thường gặp trong kỹ thuật như:
Ø Xử lý các đa thức (nhân, chia, tìm điểm 0 của đa thức)
Ø Giải các phương trình tổng quát
Ø Giải hệ phương trình tuyến tính
Ø Giải hệ phương trình vi phân
Ø Xử lý các tín hiệu đo bằng phép khai triển furier nhanh
Ø Các phép nội suy để xử lý dữ liệu trong bảng
Ø Thuật giải bài toán tối ưu
Ø Phép tích phân vi phân
Ø Công cụ đồ hoạ
Ø Mat lab cung cấp công cụ lập trình để xây dựng các chương trình ứng dụng
Ø Ngoài ra còn có các modul ứng dụng riêng phục vụ cho nghiên cứu sâu như
o Giải các phương trình vi phân đạo hàm riêng phục vụ để giải quyết các bài toán bền dùng phương pháp phần tử hữu hạn
o Simulink cho phép mô phỏng các cơ cấu máy
o Stateflow: để nghiên cứu các dòng chảy khí hay chất lỏng
II. Giao diện đồ hoạ của Matlab, các phím chức năng
1. Giao diện đồ hoạ của Matlab
Để khởi động Matlab ta nháy đúp chuột vào biểu tượng của Matlab, trên màn hình sẽ hiện ra cửa sổ giao diện của Matlab
Trên các Menu lệnh ta cần chú ý các vấn đề sau:
Ø Lệnh Edit/Clear Session: để làm sạch màn hình, xoá các kết quả được xuất ra màn hình
Ø Lệnh Edit/Select All: để lựa chọn toàn bộ văn bản có trên cửa sổ dung cho copy, xoá
Ø Trên màn hình luôn có dấu nhắc: chờ ta nhập các câu lệnh vào
Ø Nếu ta gõ: helpwin, helpdesk Matlab sẽ cho hiện ra cửa sổ trợ giúp hướng dẫn thực hiện câu lệnh
Ø Nếu gõ demo. máy cho hiện ra cửa sổ demo cho giới thiệu người dùng các ứng dụng của Matlab
Ø Để xem cách dùng các câu lệnh của Matlab ta gõ help tên lệnh ¿
Ø Để thoát khỏi môi trường Matlab ta vào File/Exit
2. Cách thức sử dụng phần mềm Matlab
a. Tính toán trực tiếp
Có hai cách thực hiện:
Ø Gõ trực tiếp biểu thức hoặc các lệnh vào trong cửa sổ lệnh, kết quả sẽ hiện ra màn hình sau khi ấn Enter
Ø Đưa các câu lệnh, biểu thức vào trong tệp văn bản script file (ghi dưới dạng mã ASCII) tệp này cần có phần mở rộng là .m (nên còn được gọi là m file). khi cần thực hiện việc tính toán ta chỉ cần gọi tệp này vào Matlab
b. Lập trình ứng dụng
Ø Chương trình cần được ghi vào trong tệp m. file khi cần chạy chương trình ta gọi vào môi trường Matlab
Ø Để kiểm nghiệm từng dòng lệnh có thể đưa thử trực tiếp trong cửa sổ của Matlab
Ø Để biên tập các tệp chương trình ta có thể dùng một trình biên tập bất kỳ hoặc dùng trực tiếp chương trình Matlab-Editor của matlab với các tiện ích hỗ trợ cho lập trình
3. Các thức viết biểu thức, sử dụng biến, các phím chức năng
a. Tính toán biểu thức số:
Ø Các biểu thức số có thể nhập trực tiếp vào cửa sổ lệnh của Matlab, sau khi ấn Enter kết quả của biểu thức sẽ hiện ra màn hình
Ø Các phép tính: Cộng +, Trừ -, Nhân *, Chia /, Luỹ thừa ^ và dấu ngoặc ưu tiên phép tính
Ø Các dòng lệnh dài có thể được phân ra nhiều dòng (bằng cách ấn Enter), tuy nhiên cuối mỗi dòng (trừ dòng cuối cùng) ta phải thêm dấu ...
b. Sử dụng các hàm, hằng và biến
Ø Các hàm: abs, sqrt, sin, cos, tan, cot, exp, log, log10, asin, acos, atan, acot
Ø Các hằng số đã định nghĩa: eps, realmax, realmin, pi, inf
Ø Khi viết biểu thức, kết quả tính toán sẽ được lưu trữ vào trong biến có tên mặc định là ans.
Thông thường để lưu kết quả tính ta thường dùng phép gán với cú pháp sau:
<tên biến>=<biểu thức>, hoặc <tên biến>=<biểu thức>;
Trong đó:
Ø Tên biến do người dùng đặt, không có khoảng trống và phân biệt chữ cái hoa, thường.
Ø ở cú pháp 1: kết quả tính của biểu thức sẽ hiện ra màn hình và lưu trữ dưới tên biến,
Ø ở cú pháp 2 kết quả không hiện ra màn hình
o Để kiểm tra giá trị hiện thời của biến ta chỉ cần gõ tên biến
o Trong biểu thức thay cho việc nhập giá trị cụ thể ta có thể gõ tên biến
o Để kiểm tra các biến tồn tại trong môi trường matlab ta gõ who, hoặc whos, hay dùng menu File\Show Work Space
o Để xoá biến khỏi mô trường ta có thể dùng các lệnh:
o clear, clear <tên biến1>, <tên biến2> ...
c. Các phím chức năng
Ø Để biên tập các dòng lệnh ta dùng các phím mũi tên hoặc dùng chức năng cắt dán
Ø Phím xoá lùi, phím del, end, pageup, pagedown ..
Ø Phím ctrl +C
d. Quy định việc hiển thị kết quả số ra màn hình
Dùng lệnh format:
các chế độ chính sau đây:
FORMAT Chế độ mặc định có ý nghĩa như FORMAT SHORT
FORMAT SHORT Ghi chế độ thập phân với 5 chữ số sau dấu phẩy
FORMAT LONG Ghi chế độ thập phân với 15 chữ số sau dấu phẩy
FORMAT SHORT E Chế độ ghi số e với 5 chữ số thập phân.
FORMAT LONG E Chế độ ghi số e với 15 chữ số thập phân..
FORMAT + Sử dụng dấu +, - ghi trước số
III. Thao tác với các tệp trong Matlab
1. Các loại tệp được dùng trong Matlab
Trong Matlab, ta thường dùng 4 loại tệp chính:
a. Tệp *.mat
(có phần mở rộng là mat) dùng để ghi lại các biến có trong môi trường làm việc của Matlab. Tệp này được ghi dưới mã nhị phân.
b. Tệp *.m (m. file) :
Tệp này có nhiều chức năng:
Ø Có thể chứa các biểu thức của Matlab (script file) để gọi vào môi trường của matlab khi cần thiết
Ø Là chương trình ứng dụng dùng ngôn ngữ lập trình của Matlab
Ø Là một hàm mới của Matlab do người dùng định nghĩa
M. file được lưu trữ dưới mã ASCII
c. Diary file: Đây là tệp văn bản (dạng mã ASCII) dùng để ghi lại tất cả các thông tin được nhập từ bàn phím vào môi trường của Matlab và các kết quả tính được xuất ra màn hình.
d. Tệp đồ thị Fig. file: Tệp lưu trữ các đồ thị tạo ra trong Matlab
2. Các lệnh sử lý tệp .mat
a. Lệnh Save hoặc File/Save Work Space As
Cú pháp:
Ø Save('filename'): ghi các biến có trong môi trường làm việc của matlab vào tệp <filename>
Ø Save('filename', 'biến 1', 'biến 2',...): ghi các <biến 1>, <biến 2>,... vào tệp <filename>
Ø Nếu dùng menu lệnh : File/Save Work Space as máy sẽ cho hiện ra bảng chọn Save as cho phép ta đặt tên tệp, vị trí thư mục sẽ lưu trữ tệp ghi các biến trong môi trường làm việc của Matlab
b. Lệnh Load hoặc File\Load Work Space
Ø Lệnh Load('Filename') sẽ tải các biến lưu trữ trong tệp <Filename> vào môi trường làm việc của Matlab
Ø File\Load Work Space: Sẽ hiện ra hộp thoại Open cho phép ta tìm kiếm và mở tệp để tải các biến lưu trữ trong nó vào môi trường làm việc của Matlab.
3. Đường dẫn
Thông thường để làm việc với các tệp (ghi hoặc tải các tệp) ta cần chỉ rõ đường dẫn đến tệp cần thao tác.
Trong môi trường làm việc của Matlab đã quy định trước một số đường dẫn đến thư mục của Matlab, nếu các tệp đưa ra không có đường dẫn, máy sẽ tự tìm kiếm trong các thư mục này, các thư mục này được gọi là "thư mục mặc định".
Để thao tác với các thư mục mặc định của Matlab ta dùng lệnh:
path, addpath, rmpath hoặc dùng menu lệnh File\Set Path
a. Lệnh path:
Cú pháp: path¿ cho hiện ra danh sách các đường dẫn đến thư mục mặc định của Matlab
b. Lệnh addpath
Cú pháp: addpath('đường dẫn 1', 'đường dẫn 2',...): Thêm các đường dẫn thường trực vào môi trường của Matlab
c. Lệnh rmpath
Cú pháp rmpath('đường dẫn 1', 'đường dẫn 2'..): Loại bỏ các đường dẫn chỉ định khỏi môi trường của Matlab
d. Sử dụng menu lệnh: File\Set Path
Lệnh File\Set Path Cho hiện ra hộp thoại thể hiện danh sách các đường dẫn thường trực đồng thời giúp người dùng thực hiện việc thêm vào, bớt đi các đường dẫn thường trực một cách trực quan.
Để thêm vào đường dẫn thường trực ta thực hiện các thao tác sau:
Ø Nháy chuột vào Path/ Add to Path,
Ø Nháy chuột vào nút ... trong hộp thoại vừa mở ra để tìm đến thư mục lựa chọn
Ø Nháy vào OK
Ø Vào Menu File\Save Path
Ø Vào Menu File\Exit Browser để thoát khỏi hộp thoại
Để loại bỏ một đường dẫn thường trực ta thực hiện các bước sau:
Ø Nháy chuột vào thư mục cần loại bỏ trong danh sách các thư mục mặc định của Matlab
Ø Nháy chuột vào Path\Remove From path
Ø Vào Menu File\Exit Browser để thoát khỏi hộp thoại
4. Lệnh diary
Lệnh Diary cho phép người dùng ghi lại toàn bộ các dữ liệu xuất ra màn hình và những dòng lệnh, biểu thức do người dùng nhập vào sau dấu nhắc của Matlab
Ø Lệnh diary 'filename' sẽ mở tệp <filename> để ghi dữ liệu vào
Ø Lệnh diary on¿: bật chế độ ghi
Ø Lệnh diary off¿: tắt chế độ ghi
5. Các lệnh sử lý m. file
Để tạo ra, biên tập và sửa chữa các tệp M. File ta có thể sử dụng bất kỳ một trình biên tập nào có thể tạo ra tệp mã ASCII, tuy nhiên Matlab cung cấp một trình soạn thảo hết sức tiện lợi đó là chương trình Matlab Debugger.
Ø Để tạo file mới từ cửa sổ của Matlab ta gọi: File/New/M.file, Hoặc nháy vào biểu tượng New trên thanh công cụ
Ø Để mở tệp đã có ra để hiệu chỉnh, ta nháy chuột vào biểu tượng Open hoặc chọn File/Open, Máy sẽ hiện ra hộp thoại Open cho ta tìm đến tệp cần mở và gọi Matlab Debugger ra để đưa tệp cần mở vào biên tập.
Bài 2: Xử lý dữ liệu dạng mảng trong Matlab
và các ứng dụng
I. Các phương pháp tạo mảng dữ liệu
1. Phương pháp nhập trực tiếp từ bàn phím
1.1. Các nguyên tắc chung
· Các phần tử của mảng được bao trong dấu ngoặc vuông: [ ]
· Các phần tử trên một hàng được cách nhau bằng dấu cách (bước trống)
· Các cột được phân cách bằng dấu ";" hoặc dấu "Enter"
1.2 Các ví dụ
Nếu ta gõ : C=[3.5 4.3 5.0]¿, ta sẽ nhận được véc tơ hàng có ba phần tử là 3.5, 4.3 và 5.0 và trên màn hình của Matlab sẽ hiện ra:
C =
3.5000 4.3000 5.0000
Nếu ta nhập vào: V=[3.5; 4.3; 5.0] , hoặc
V=[3.5000¿
4.3000¿
5.0000] ¿
Ta sẽ nhận được véc tơ cột có ba phần tử là 3.5, 4.3 và 5.0 và trên màn hình của matlab sẽ hiện ra:
V =
3.5000
4.3000
5.0000
Câu lệnh :
M=[1 3 4;5 3 7;2 1 4]
Sẽ cho kết quả ma trận 3 hàng, 3 cột
M =
1 3 4
5 3 7
2 1 4
Chú ý: Các phần tử trong mỗi hàng khi nhập vào phải như nhau
2. Dùng toán tử " : "
Cú pháp:
<Tên biến>=<Begin>: <Step>: <Limit>
Sẽ tạo ra véc tơ hàng có phần tử đầu tiên là giá trị <Begin>, gia số giữa các phần tử là <Step>, giá trị phần tử cuối cùng không vượt quá <Limit>
Chú ý : Nếu bỏ qua trị số của <Step>, máy sẽ nhận gia số =1
Ví dụ:
Nếu nhập vào sau dấu nhắc dòng lệnh Y=1:2:10
Ta nhận được véc tơ hàng:
Y =
1 3 5 7 9
Nếu nhập vào sau dấu nhắc dòng lệnh: Y=1:9
Ta nhận được véc tơ:
Y =
1 2 3 4 5 6 7 8 9
1.3. Dùng hàm linspace và logspace:
Cú pháp:
<tên biến>=linspace(<MinVal>, <MaxVal>, <Num>)
Hàm sẽ tạo ra véc tơ hàng có số phần tử bằng <Num>, gia số giữa các phần tử như nhau và bằng (MaxVal-MinVal)/(Num-1), phần tử đầu tiên có giá trị bằng MinVal, phần tử cuối cùng có giá trị bằng MaxVal
Ví dụ:
Dùng hàm : linspace(1,11,6)
Ta nhận được véc tơ
ans =
1 3 5 7 9 11
ứng dụng: Hàm linspace rất tiện dụng trong việc xác định véc tơ các giá trị trên trục hoành khi vẽ đồ thị
Hàm logspace
Có cú pháp tương tự như hàm linspace, tuy nhiên các phần tử biến thiên theo quy luật hàm số mũ với gia số của các số mũ tăng đều và bằng:
(MaxVal-MinVal)/(Num-1).
Ví dụ : logspace(1,6,6)
Sẽ cho kết quả:
ans =
10 100 1000 10000 100000 1000000
4. Sử dụng các mảng chuẩn
4.1: Ma trận có các phần tử bằng 0
ứng dụng: Ma trận có các phần tử bằng 0 thường dùng trong các trường hợp sau:
· Dùng làm ma trận mồi trong phép tính tổng nhiều ma trận (dùng vòng lặp)
· Dùng để tạo ma trận có nhiều phần tử bằng 0 rất thường gặp trong kỹ thuật
Sử dụng hàm zeros:
Cú pháp : <Tên biến>=zeros(<RowNum>, <ColumnNum>)
Tạo ra ma trận với các phần tử 0, có số hàng là <RowNum>, số cột là <ColumnNum>.
Ví dụ: Hàm M=zeros(2,3)
Sẽ cho kết quả
M =
0 0 0
0 0 0
4.2: Ma trận có các phần tử bằng 1
ứng dụng: Ma trận có các phần tử bằng 1 thường dùng trong các trường hợp sau:
· Dùng làm ma trận mồi trong phép tính tích các phần tử tương ứng của nhiều ma trận (dùng vòng lặp)
· Dùng để tạo ma trận có các phần tử bằng nhau (dùng khi thực hiện phép tính cộng hoặc trừ từng phần tử của ma trận với cùng một số).
Sử dụng hàm ones:
Cú pháp : <Tên biến>=ones (<RowNum>, <ColumnNum>)
Tạo ra ma trận với các phần tử 1, có số hàng là <RowNum>, số cột là <ColumnNum>.
Ví dụ: Ví dụ: M=ones(3,4)
Sẽ cho kết quả
M =
1 1 1 1
1 1 1 1
1 1 1 1
M=3.5*ones(3,2)
Sẽ cho kết quả
M =
3.5000 3.5000
3.5000 3.5000
3.5000 3.5000
4.3: Ma trận đơn vị
Để tạo ma trận đơn vị, ta dùng hàm eye;
Cú pháp :
<Tên biến>=eye(<RowNum>, <ColumnNum>); hoặc
<Tên biến>=eye(<Size>)
Cú pháp thứ nhất sẽ tạo ra ma trận đơn vị chữ nhật, có số hàng bằng <RowNum> và số cột bằng <ColumnNum>.
Cú pháp thứ hai sẽ tạo ra ma trận đơn vị có số hàng bằng số cột bằng <Size>
Ví dụ: I=eye(3,4)
Sẽ tạo ra ma trận
I =
1 0 0 0
0 1 0 0
0 0 1 0
I=eye(4)
Sẽ tạo ra ma trận
I =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
4.4 Tạo các mảng đường chéo,
ứng dụng:
Mảng đường chéo thường gặp ở các ma trận độ cứng và ma trận khối lượng trong tính toán bền
Dùng hàm diag
Cú pháp :
<tên biến>=diag(v)
<tên biến>=diag(v,n)
ở đây:
· V là một véc tơ hàng, hoặc cột. hoặc có thể là ma trận
· n là số nguyên chỉ đường chéo nào của ma trận sẽ đặt các phần tử của véc tơ V.
· Nếu V là một véc tơ, hàm sẽ cho kết quả là ma trận vuông có các phần tử trên đường chéo chỉ định là các phần tử của véc tơ V
· Nếu V là một ma trận, sẽ trả kết quả là véc tơ cột của các phần tử nằm trên đường chéo của ma trận V
· Nếu không chỉ ra n, các phần tử của V sẽ nằm trên đường chéo chính
Ví dụ:
V=[1 3 5 3]; M=diag(V)
Sẽ cho kết quả
M =
1 0 0 0
0 3 0 0
0 0 5 0
0 0 0 3
M=diag(V,1)
Sẽ cho kết quả
M =
0 1 0 0 0
0 0 3 0 0
0 0 0 5 0
0 0 0 0 3
0 0 0 0 0
M=diag(V,-1)
Cho kết quả
M =
0 0 0 0 0
1 0 0 0 0
0 3 0 0 0
0 0 5 0 0
0 0 0 3 0
V=[3 4 6;5 6 7;8 9 6]; M=diag(V)
Cho kết quả:
M =
3
6
6
4.5. Mảng các số ngẫu nhiên
ứng dụng:
Mảng các số ngẫu nhiên dùng nhiều trong đồ hoạ hoặc tạo các nhiễu trong mô phỏng và sử lý số liêụ thực nghiệm
Sử dụng lệnh rand:
<tên biến>= rand(số hàng, số cột)
Tạo ra mảng các số ngẫu nhiên với số hàng, cột chỉ định
4.6. Mảng tạo từ tệp
Nếu ta ghi các mảng trong một tệp dạng m.file (theo đúng quy cách tạo mảng trong Matlab như trình bày ở trên), ta hoàn toàn có thể gọi mảng vào môi trường làm việc của Matlab bằng cách nhập tên của m.file sau dấu nhắc của Matlab và ấn Enter.
Điều này rất thuận tiện khi ta dữ liệu dạng mảng được xuất ra từ một chương trình tính toán khác
II. Tham chiếu tới các phần tử của mảng, tạo các mảng con
1. Nguyên tắc tham chiếu tới các phần tử của mảng
· Để tham chiếu đến một phần tử của mảng, ta cần chỉ ra chỉ số hàng và cột của phần tử (đặt trong dấu ngoặc đơn)
Ví dụ: để tham chiếu đến phần tử nằm ở hàng số 2 và cột số 3 của ma trận M ta viết M(2,3)
· Để tham chiếu đến một nhóm các phần tử của mảng, thay cho việc chỉ ra chính xác chỉ số của phần tử như trên ta phải chỉ ra được mảng các chỉ số của các phần tử cần tham chiếu tới
Ví dụ:
M1= M([1 2],[3 2])
sẽ cho ta một ma trận mới:
M1= M1,3 M2,3
M1,2 M2,2
· Dấu : để chỉ toàn bộ các chỉ số của hàng và cột
Ví dụ
M1=M(:,1)
sẽ cho ra véc tơ bao gồm các phần tử trên cột thứ nhất của ma trận M
M1=M(2,:)
sẽ cho ra véc tơ bao gồm các phần tử trên hàng thứ hai của ma trận M
· Từ khoá end là chỉ số cuối cùng của hàng hoặc cột của mảng
Ví dụ:
M1=M([2 4],[3:end])
Sẽ tạo ra ma trận M1 từ hàng 2 và 4 của ma trận M, mỗi hàng lấy ra từ phần tử thứ 3 đến phần tử cuối cùng
2. các ứng dụng của việc truy cập các phần tử của mảng
2.1. Lấy các phần tử của mảng ra để tính toán
Ví dụ:
S=V(2)^2+V(5)^2
Sẽ tính tổng bình phương các giá trị của phần tử thứ 2 và thứ 5 của véc tơ V
S=M(1,2)-M(2,3)
Sẽ tìm ra hiệu của hai phần tử ở hàng 1 cột 2 và hàng 2 cột 3 của ma trận M
2.2. Thay đổi giá trị của từng phần tử của mảng
Ví dụ:
Để tạo ra ma trận , ta thực hiện theo các bước sau:
· Tạo ma trận với các phần tử 0: M=zeros(3,3);
· Sau đó gán lại các phần tử khác 0 của ma trận: M(1,1)=1;M(3,2)=3;
2.3. Tạo các mảng con từ mảng cơ sở
Ví dụ:
Để lấy ra hàng đầu tiên của ma trận M ta dùng lệnh:
V=M(1,:)
Để tạo ra véc tơ mới bằng cách bỏ đi phần tử đầu tiên của véc tơ V, ta dùng lệnh:
V1=V(2:end);
2.4. Loại bỏ bớt các phần tử của mảng:
Để loại bỏ các phần tử khỏi mảng ta chỉ cần gán giá trị của các phần tử cần loại trị số rỗng: "[ ]"
Ví dụ: nếu ta có ma trận M =
2 3 4
5 3 7
3 2 8
Sau khi dùng phép gán: M(:,1)=[ ]
Ta nhận được:
M =
3 4
3 7
2 8
2.5. Hợp mảng mới từ các mảng thành phần (nối mảng)
Để tạo mảng từ các mảng thành phần ta dùng dấu "[ ]" bên trong cần chỉ rõ các phần tử đưa vào mảng, nếu các phần tử nằm trên 1 hàng, chúng cách nhau bằn dấu cách (bước trống), để xuống dòng ta dùng dấu ;
Ví dụ:
Nếu ta có 2 véc tơ: V1=[3 5 7 9], V2=[4 6 8 2 7 3]
Khi dùng lệnh:
V=[V1(2:end) V2([1 3 4])]
Ta sẽ nhận được:
V =
5 7 9 4 8 2
III. Các phép tính thực hiện trên mảng
1. Các phép toán thông thường
1.1: Phép cộng
Cú pháp :
M=M1 + M2 + M3+...
ý nghĩa:
tạo ra mảng mới M có cùng kích thước với mảng M1, M2 ..., các phần tử của mảng mới sẽ bằng tổng từng phần tử tương ứng của các mảng thành phần
Điều kiện:
Các mảng M1, M2,... phải có cùng kích thước
1.2: Phép trừ
Cú pháp:
M=M1 - M2 - M3-...
ý nghĩa: Tạo ra mảng M với các phần tử M(i,j)=M1(i,j)-M2(i,j)-M3(i,j)-..
Điều kiện:
Các mảng M1, M2,... phải có cùng kích thước
1.3. Phép nhân
Cú pháp:
M=A*B
ý nghĩa: Nếu A là ma trận có kích thước (i x k) và B là ma trận có kích thước (k x j), ta sẽ nhận được ma trận M có kích thước là (i x j)
với:
Điều kiện:
Số cột của ma trận A phải bằng số hàng của ma trận B
1.4 Phép luỹ thừa
Cú pháp:
M=A^n, trong đó n là số nguyên dương
Có kết quả như là phép nhân n ma trận A với nhau:
Điều kiện: Các ma trận A phải là ma trận vuông
1.5 Phép chia hai ma trận
Cú pháp: M=A/B
ý nghĩa:
Phép chia ma trận hoàn toàn giống như phép nhân với ma trận nghịch đảo: M=A/B Û M=A*B-1
Điều kiện:
Các ma trận A, B phải là các ma trận vuông cùng kích thước.
2. Sử dụng các toán tử với dấu "."
2.1. ý nghĩa:
Các toán tử có dấu "." (xem bảng dưới ) sẽ cho phép thao thác trên từng phần tử của mảng
+
Cộng (không có toán tử .+)
-
Trừ (không có toán tử .-)
.*
Nhân từng phần tử
./
Chia từng phần tử
.^
Luỹ thừa từng phần tử
'
Phép chuyển vị
2.2 Các ví dụ:
VD1: Xác định véc tơ S, với các phần tử được xác định bằng quan hệ:
S(i)=Y(i+1)-2*Y(i); i=1 đến n-1, với Y =[3.5 6.2 7.0 5.4 6.2]
ở đây ta sử dụng biểu thức véc tơ:
S=Y(2:end)-2*Y(1:end-1)
VD2: tính giá trị của véc tơ V mà các phần tử của nó được xác định bằng biểu thức: V(i)=2*Y(i)-b, với Y =[3.5 6.2 7.0 5.4 6.2], b=1.5
ở đây ta sử dụng biểu thức véc tơ:
S=2*Y-b*ones(1,5)
VD3: giải hệ phương trình:
Ta tạo ra các ma trận: M=[4 0 7; 3 5 -4;2 5 1]; Y=[5;12;4]
nghiệm của hệ được xác định bằng biểu thức:
X=eye(3,3)/M*Y
X =
3.0000
-0.2000
-1.0000
3. Các hàm dùng trên mảng
3.1 Các hàm dùng chung:
Tất cả các hàm tính toán trên dữ liệu số đều có thể thực hiện trên dữ liệu mảng, và cho kết quả là mảng có cùng kích cỡ
Ví dụ:
Để vẽ đồ thị của hàm số:
, X=0 đến Pi
Ta sử dụng các lệnh sau:
X=linspace(0,pi,20);
Y=(sin(X).^2+2*cos(2*X))./(ones(1,20)+cos(X).^2);
plot(X,Y)
3.2 Các hàm dùng cho việc xử lý dữ liệu
a. Hàm sum
Cú pháp : sum(A)
· Nếu A là một véc tơ, hàm sẽ trả kết quả là tổng các phần tử của véc tơ
· Nếu A là một ma trận, hàm sẽ trả kết quả là một véc tơ hàng với các phần tử là tổng các phần tử của mỗi cột trong ma trận A
b. Các hàm lật ma trận
· Hàm flipud(A), chuyển các hàng từ dưới lên trên
· Hàm fliplr(A) , chuyển các hàng từ phải sang trái
Ví dụ: Nếu ta có ma trận M =
4 0 7
3 5 -4
2 5 1
Hàm flipud(M)
Sẽ đưa ra két quả
ans =
2 5 1
3 5 -4
4 0 7
Hàm fliplr(M)
Sẽ đưa ra kết quả
ans =
7 0 4
-4 5 3
1 5 2
c. Hàm lấy ra ma trận đường chéo
· Hàm triu(A), lấy ra ma trận đường chéo phía trên
· Hàm tril(A), lấy ra ma trận đường chéo phía dưới
Ví dụ: Nếu có ma trận M ở trên
Khi dùng hàm triu(M), Ta nhận được:
ans =
4 0 7
0 5 -4
0 0 1
Nếu dùng hàm: tril(M), ta sẽ nhận được:
ans =
4 0 0
3 5 0
2 5 1
d. Hàm size
cú pháp :
· S=size(A) : đưa ra véc tơ hàng chỉ số lượng hàng và cột của ma trận
· [r,c]=size(A) gán số hàng cho r, số cột cho c
Ví dụ: Nếu có ma trận M ở trên
Nếu gọi lệnh : S=size(M), ta nhận được:
S = 3 3
e. Hàm cumsum
Cú pháp:
B = cumsum(A)
B = cumsum(A,dim)
Mô tả:
· Nếu A là một véc tơ, B = cumsum(A) sẽ đưa ra kết quả là véc tơ B có các phần tử là tổng tích luỹ của các phần tử của véc tơ A: được xác định bằng công thức:
· Nếu A là một ma trận, cumsum(A) Sẽ đưa ra kết quả là ma trận có cùng kích cỡ với A và các phần tử của nó tương ứng là tổng tích luỹ của các phần tử trên từng cột của ma trận A .
· B = cumsum(A,dim) Sẽ đưa ra kết quả là ma trận B có cùng kích thước với A, các phần tử của véc tơ B sẽ là tổng tích luỹ của các phần tử dọc theo hàng hoặc cột của ma trận A, tuỳ thuộc vào trị số của <dim>. Ví dụ cumsum(A,1) sẽ tính dọc theo các cột, cumsum(A,2) sẽ tính dọc theo các hàng.
Thí dụ
cumsum(1:5) = [1 3 6 10 15]
A = [1 2 3; 4 5 6];
cumsum(A)
1 2 3
5 7 9
cumsum(A,2)
1 3 6
4 9 15
f. Hàm diff
Tính toán độ lệch giữa các phần tử trong mảng
Cú pháp
Y = diff(X)
Y = diff(X,n)
Mô tả:
Y = diff(X) tính ra độ lệch giữa các phần tử kề nhau của véc tơ X.
· Nếu X là véc tơ kết quả đưa ra là véc tơ ít hơn X 1 phần tử:
[X(2)-X(1) X(3)-X(2) ... X(n)-X(n-1)]
· Nếu X là ma trận , hàm diff(X) đưa ra kết quả là ma trận cột các độ lệch :
[X(2:m,:)-X(1:m-1,:)]
Y = diff(X,n) Đưa ra véc tơ độ sai lệch bậc n :
như vậy diff(X,2) cho ra cùng kết quả với diff(diff(X)).
Ví dụ:
x = [1 2 3 4 5];
y = diff(x)
y =
1 1 1 1
z = diff(x,2)
z =
0 0 0
4. Các ví dụ ứng dụng
4.1. Tính toán độ cứng của nhíp:
Trong đó:
a là hệ số thực nghiệm: =0.85, E là mô đul đàn hồi của vật liệu
ak+1=l1- lk+1 , với lk là 1/2 chiều dài lá nhíp thứ k (tính từ quang treo đến đầu mút của lá)
Dữ liệu đã biết
Chỉ số của lá
Bề rộng b, Cm
Bề dầy lá nhíp h, Cm
Mô men quán tính J, Cm4
1-6
45
0,70
4,5.0,703/12=0,128
7-9
45
0,575
4,5.0,5753/12=0,0713
1/2 Chiều dài các lá nhíp (tính từ quang treo đến đầu mút của lá)
l(1)=68.5;l(2)=67.2;l(3)=57.6;l(4)=50.4;l(5)=43.0;l(6)=35.0;l(7)=28.0;l(8)=20.6;l(9)=13.0
Các lệnh Matlab dùng để tính độ cứng của nhíp
%% Nhập dữ liệu
h(1)=0.7;h(2)=0.7;h(3)=0.7;h(4)=0.7;h(5)=0.7;h(6)=0.7;
h(7)=0.575;h(8)=0.575;h(9)=0.575;
b=4.5;al=0.85;E=2100000;
l(1)=68.5;l(2)=67.2;l(3)=57.6;l(4)=50.4;l(5)=43.0;l(6)=35.0;l(7)=28.0;
l(8)=20.6;l(9)=13.0;l(10)=0;
%% Tính toán các đặc tính hình học của lá nhíp
Jk=b*h.^3/12;Jk=cumsum(Jk);
Yk=1./Jk;Yk(10)=0;DYk=-diff(Yk);
a=l(1)*ones(1,10)-l;a=a(2:10);
%% Tính độ cứng của nhíp
C=al*6*E/sum(a.^3.*DYk)
4.2. Tính toán bền các lá nhíp
Phản lực tác động tại các đầu mút của lá nhíp được xác định từ hệ phương trình:
Trong đó Ak, Bk, Ck được xác định từ các biểu thức:
, ,
ở đây:
lk là 1/2 chiều dài của lá nhíp thứ k (tính từ quang treo đến đầu mút của lá)
Jk là mô men quán tính mặt cắt ngang của lá nhíp thứ k :
Ví dụ : Tính ứng xuất tác dụng lên các lá nhíp có số liệu cho trong bảng dưới đây
Dữ liệu các lá nhíp và tải trọng
Số hiệu lá nhíp
1
2
3
4
5
6
Chiều dày lá nhíp
0.7
0.7
0.8
0.8
0.8
0.8
Bề rộng lá nhíp
6.5
6.5
6.5
6.5
6.5
6.5
Nửa chiều dài lá
50.0
48.5
37.5
28.0
20.0
13.0
Khoảng cách giữa bu lông ngàm nhíp: 12 cm
Tải trọng đặt lên nhíp 900 Kg
%% Nhập dữ liệu
h=0.8*ones(1,6); h(1)=0.7;h(2)=0.7; b=6.6; Q=900; d=12;
l(1)=50;l(2)=48.5;l(3)=37.5;l(4)=28.0;l(5)=20.0;l(6)=13.0;
%% Tính các hệ số
Jk=b*h.^3/12;Jk1=Jk(2:6);Jk=Jk(1:5);
Lk=l(1:5);Lk1=l(2:6);
A=0.5*Jk1./Jk.*(3*Lk./Lk1-ones(1,5));
Bk=-(1+Jk1./Jk);
C=0.5*(Lk1./Lk).^3.*(3*Lk./Lk1-ones(1,5));
p=zeros(5,1);p(1)=-Q/2*A(1);
Ak=A(2:5);Ck=C(1:4);
%% Thiết lập ma trận hệ số
M=diag(Ak,-1)+diag(Bk)+diag(Ck,1);
%% Tính toán các phản lực
X=inv(M)*p
Bài 3: Các công cụ toán học thông thường của Matlab
I. Các công cụ xử lý đa thức
1. Định nghĩa đa thức trong MATLAB
- Malab sử dụng một véc tơ hàng để định nghĩa các hệ số của đa thức
· Số phần tử của véc tơ bằng số bậc của đa thức +1 (ví dụ đa thức bậc 3 có 4 hệ số)
· Phần tử đầu tiên là hệ số bậc cao nhất của đa thức
· Những phần tử khuyết có hệ số bằng 0
- Giá trị của đa thức xác định bằng hàm polyval: polyval(p,x)
Ví dụ: Xác định trị số của đa thức P=X4+3X3-2X+5 tại điểm X=4.5 ta dùng các lệnh sau:
p=[1 3 0 -2 5];
v=polyval(p,4.5)
2. Các phép tính trên đa thức
2.1 Giải các phương trình đại số bậc cao
Dùng lệnh roots:
Cú pháp:
r = roots(c)
Mô tả
r = roots(c) Đưa ra kết quả là véc tơ r có các phần tử là nghiệm của đa thức C.
Véc tơ hàng C chứa các hệ số của đa thức, nếu C chứa n+1 phần tử, đa thức có dạng:
Chú ý: hàm ngược của roots là hàm poly: P=poly(r) sẽ đưa ra véc tơ hệ số của đa thức có nghiệm là véc tơ r.
Các thí dụ:
Đa thức được mô tả trong Matlab bằng véc tơ :
p = [1 -6 -72 -27]
Nghiệm của đa thức được xác định bằng lệnh:
r = roots(p)
r =
12.1229
-5.7345
-0.3884
2.2 Cộng (trừ ) các đa thức
Cộng trừ trực tiếp các hệ số, các đa thức phải cùng cỡ hoặc được biến đổi cho cùng cỡ
2.3 Nhân hai đa thức:
Dùng hàm conv
Cú pháp:
w = conv(u,v)
Mô tả:
Nếu số phần tử của véc tơ u là m, số phần tử của véc tơ v là n, véc tơ w sẽ có chiều dài là n +m -1 phần tử với phần tử thứ k được xác định bằng biểu thức:
w(1) = u(1)*v(1)
w(2) = u(1)*v(2)+u(2)*v(1)
w(3) = u(1)*v(3)+u(2)*v(2)+u(3)*v(1)
...
w(n) = u(1)*v(n)+u(2)*v(n-1)+ ... +u(n)*v(1)
...
w(2*n-1) = u(n)*v(n)
2.4 Chia hai đa thức
Dùng hàm deconv
Cú pháp
[q,r] = deconv(v,u)
Mô tả:
[q,r] = deconv(v,u) Hàm deconv sẽ thực hiện phép chia đa thức v cho đa thức u kết quả nhận được là 2 véc tơ: véc tơ q sẽ mô tả đa thức kết quả và véc tơ r mô tả phần dư của phép chia, có nghĩa là v = conv(u,q)+r.
Thí dụ
Nếu
u = [1 2 3 4]
v = [10 20 30]
Tích của hai đa thức sẽ là:
c = conv(u,v)
c =
10 40 100 160 170 120
Nếu sử dụng hàm chia đa thức ta nhận được
[q,r] = deconv(c,u)
q =
10 20 30
r =
0 0 0 0 0 0
2.5 Đạo hàm các đa thức
Dùng hàm polyder
Cú pháp
k = polyder(p)
k = polyder(a,b)
[q,d] = polyder(b,a)
Mô tả
Hàm polyder tính ra đạo hàm của một đa thức, của tích hai đa thức hay thương hai đa thức. p, a, b là các véc tơ mà phần tử của nó là hệ số của các đa thức.
k = polyder(p) đưa ra kết quả là véc tơ hệ số của đạo hàm đa thức p.
k = polyder(a,b) đưa ra kết quả là véc tơ hệ số của đạo hàm tích hai đa thức a,b.
[q,d] = polyder(b,a) đưa ra kết quả là đa thức tử số (véc tơ q) và đa thức mẫu số (véc tơ d) của đạo hàm thương hai đa thức b/a.
Thí dụ:
Đạo hàm của tích
có thể nhận được bằng lệnh
a = [3 6 9];
b = [1 2 0];
k = polyder(a,b)
k =
12 36 42 18
Kết quả này đại diện cho đa thức :
Nếu dùng lệnh:
[q,r] = polyder(a,b)
Ta sẽ nhận được
q =
-18 -18
r =
1 4 4 0 0,
có nghĩa là đạo hàm biểu thức: sẽ là:
II. Công cụ nội suy
1. Hàm nội suy một biến:
Hàm interp1
Cú pháp:
yi = interp1(x,Y,xi)
yi = interp1(x,Y,xi,method)
Trong đó:
· x, Y là hai véc tơ có cùng kích thước xác định các điểm (xi, yi)
· véc tơ x phải tăng dần hoặc giảm dần
· điểm xi cần nằm trong khoảng từ x(1) đến x(n)
· method quy định phương pháp nội suy: các giá trị của nó là:
· 'linear' chế độ nội suy tuyến tính (default)
· 'nearest' chế độ nội suy sử dụng giá trị ở nút gần nhất
· 'spline' nội suy hàm spline bậc 3
· 'cubic' chế độ nội suy đa thức bậc 3
Ví dụ ta có các dữ liệu dân số của nước mỹ ở các thời điểm cách nhau 10 năm như sau
t = 1900:10:1990;
p = [75.995 91.972 105.711 123.203 131.669...
150.697 179.323 203.212 226.505 249.633];
hàm: interp1(t,p,1975) sẽ cho ta giá trị nội suy về dân số vào năm 1975: với kết quả là:
ans =
214.8585
2. Hàm nội suy hai biến:
2.1 Dùng hàm interp2
Cú pháp
ZI = interp2(X,Y,Z,XI,YI)
ZI = interp2(Z,XI,YI)
ZI = interp2(X,Y,Z,XI,YI,method)
Mô tả
· ZI = interp2(X,Y,Z,XI,YI) đưa ra ma trận ZI chứa các phần tử tương ứng với các phần tử quy định trong ma trận XI, YI và được xác định bởi phép nội suy của hàm hai biến xác định bởi các ma trận X, Y và Z. X, Y cần phải tăng hoặc giảm dần và có cùng kích cỡ, được cung cấp bởi lệnh meshgrid.
· XI và YI có thể là các ma trận, khi đó interp2 sẽ đưa ra các giá trị tương ứng với các điểm (XI(i,j),YI(i,j)). Ngoài ra ta cũng có thể đưa vào các véc tơ hàng và cột xi và yi. Trong trường hợp này, interp2 sẽ chuyển đổi các véc tơ này thành các ma trận giống như ta sử dụng lệnh meshgrid(xi,yi).
· ZI = interp2(Z,XI,YI) sẽ coi như các véc tơ X = 1:n và Y = 1:m, ở đây [m,n] = size(Z).
· ZI = interp2(X,Y,Z,XI,YI,method) cho phép sử dụng các phương pháp nội suy khác nhau:
· 'linear' chế độ nội suy tuyến tính (default)
· 'nearest' chế độ nội suy sử dụng giá trị ở nút gần nhất
· 'spline' nội suy hàm spline bậc 3
· 'cubic' chế độ nội suy đa thức bậc 3
Để có thể nội suy nhanh hơn khi các mốc nội suy cách đều, chúng ta hãy dùng các chế độ '*linear', '*cubic', '*spline', hoặc '*nearest'.
Thí dụ:
Ta có dữ liệu về tiền lương của công nhân ở các năm từ 1950 đến 1999 theo thời gian phục vụ như sau:
years = 1950:10:1990;
service = 10:10:30;
wage = [150.697 199.592 187.625
179.323 195.072 250.287
203.212 179.092 322.767
226.505 153.706 426.730
249.633 120.281 598.243];
Từ cơ sở dữ liệu này ta có thể xác định được tiền lương của công nhân ở năm 1975 với 15 năm phục vụ:
w = interp2(service,years,wage,15,1975)
w =
190.6287
2.2. Sử dụng hàm meshgrid
Tạo ra ma trận x và y dùng cho đồ thị ba chiều và xác định giá trị của hàm 2 biến
Cú pháp
[X,Y] = meshgrid(x,y)
[X,Y] = meshgrid(x)
[X,Y,Z] = meshgrid(x,y,z)
Mô tả
[X,Y] = meshgrid(x,y) Chuyển các véc tơ x và y thành các ma trân X và Y dùng để tính giá trị của hàm 2 biến và đồ thị lưới ba chiều. Các hàng của ma trận X là copy của véc tơ x và các cột của ma trận Y là copy của véc tơ y.
[X,Y] = meshgrid(x) có ý nghĩa giống như [X,Y] = meshgrid(x,x).
[X,Y,Z] = meshgrid(x,y,z) Tạo ra các mảng 3 chiều dùng để xác định giá trị hàm 3 biến hoặc để vẽ đồ thị khối 3 chiều.
Chú ý
Hàm meshgrid tương tự như hàm ndgrid ngoại trừ trật tự hai tham số đầu vào và ra của hai hàm được đổi lẫn cho nhau, có nghĩa là câu lệnh
[X,Y,Z] = meshgrid(x,y,z)
sẽ cho cùng kết quả như câu lệnh
[Y,X,Z] = ndgrid(y,x,z)
meshgrid chỉ dùng trong không gian hai hoặc 3 chiều.
Thí dụ
[X,Y] = meshgrid(1:3,10:14)
X =
1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
Y =
10 10 10
11 11 11
12 12 12
13 13 13
14 14 14
3. Phép nội suy 3 biến và n biến
3.1 Sử dụng hàm interpn
Cú pháp
VI = interpn(X1,X2,X3,...,V,Y1,Y2,Y3,...)
VI = interpn(V,Y1,Y2,Y3,...)
VI = interpn(V,ntimes)
VI = interpn(...,method)
Mô tả
VI = interpn(X1,X2,X3,...,V,Y1,Y2,Y3,...) Nội suy để tìm giá trị VI của hàm nhiều biến V tại các điểm đưa ra bằng các véc tơ Y1, Y2, Y3.. . Để định nghĩa V ta cần dùng các mảng X1, X2, .. Xn. để định nghĩa các điểm mà tại đó dữ liệu của hàm được đưa ra.
Y1, Y2, Y3,... Có thể là các ma trận, trong trường hợp này hàm interpn sẽ đưa ra véc tơ VI với các giá trị tương ứng với các điểm (Y1(i,j) ,Y2(i,j),Y3(i,j),...). Ta có thể thay các mảng Y1, Y2, Y3... bằng các véc tơ y1, y2, y3 ... Trong trường hợp này interpn sẽ thông dịch các véc tơ thành các ma trận giống như dùng hàm ndgrid(y1,y2,y3,...).
VI = interpn(V,Y1,Y2,Y3,...) Nội suy như trên và coi X1 = 1:size(V,1), X2 = 1:size(V,2), X3 = 1:size(V,3), ...
VI = interpn(...,method) xác định phương pháp nội suy.
'linear' đối với nội suy tuyến tính (mặc định)
'cubic' nội suy đa thức bậc 3
'spline' nội suy spline bậc ba
'nearest' . nội suy lấy giá trị nút gần nhất
2.2. Sử dụng hàm ndgrid
Tạo ra mảng n chiều dùng để xác định giá trị của hàm nhiều biến và nội suy.
Cú pháp
[X1,X2,X3,...] = ndgrid(x1,x2,x3,...)
[X1,X2,...] = ndgrid(x)
Mô tả
[X1,X2,X3,...] = ndgrid(x1,x2,x3,...) Chuyển các véc tơ x1, x2, x3... thành các mảng X1, X2, X3 ... dùng để xác định giá trị của hàm nhiều biến hoặc nội suy hàm nhiều biến. Chiều thứ i của mảng Xi là copy của các phần tử véc tơ xi.
[X1,X2,..] = ndgrid(x) có cùng kết quả như [X1,X2,...] = ndgrid(x,x,...).
Thí dụ
Sử dụng hàm ngrid để vẽ đồ thị lưới hàm : .
[X1,X2] = ndgrid(-2:.2:2, -2:.2:2);
Z = X1 .* exp(-X1.^2 - X2.^2);
mesh(Z)
Chú ý
Hàm ndgrid được dùng gần giống như hàm meshgrid ngoại trừ hai đối số đầu của các biến vào, ra được tráo đổi cho nhau. Có nghĩa là câu lệnh
[X1,X2,X3] = ndgrid(x1,x2,x3)
cho kết quả cũng giống như câu lệnh
[X2,X1,X3] = meshgrid(x2,x1,x3).
4. Nội suy bằng hàm polyfit
Cú pháp:
p = polyfit(x,y,n)
[p,s] = polyfit(x,y,n)
Mô tả:
Hàm p = polyfit(x,y,n) tìm ra các hệ số của đa thức p(x) bậc n phù hợp với dữ liệu x, y trong ý nghĩa của độ lệch quân bình bình phương bé nhất. kết quả là véc tơ p có chiều dài n+1 chứa các hệ số của đa thức theo trật tự giảm dần của số mũ:
[p,s] = polyfit(x,y,n) đưa ra đa thức hệ số p, s dùng để ước lượng sai số.
4. Nội suy bằng hàm spline
Cú pháp
yy = spline(x,y,xx)
pp = spline(x,y)
Mô tả
Hàm spline Tạo ra hàm spline nhận các giá trị y(:,j) tại điểm x(j) với mọi j yy = spline(x,y,xx) đưa ra các giá trị của hàm tại các điểm chỉ ra bằng véc tơ xx.
pp = spline(x,y) đưa ra dạng pp của hàm nội suy bậc 3, mà có thể sử dụng với lệnh ppval.
Thí dụ
Hai véc tơ
t = 1900:10:1990;
p = [ 75.995 91.972 105.711 123.203 131.669 ...
150.697 179.323 203.212 226.505 249.633 ];
Thể hiện dữ liệu về dân số của mỹ (tính bằng đơn vị triệu người), biểu thức
spline(t,p,2000)
Sử sụng hàm spline bậc 3 để ngoại suy và dự đoán dân số năm 2000. kết quả sẽ là:
ans =
270.6060
III. Tối ưu các hàm số
1. Xây dựng các hàm người dùng trong Matlab
1.1 Một số nguyên tắc cơ bản
· Tên của hàm và tên của M-file cần phải trùng nhau
· Tên của hàm có thể chứa tới 31 ký tự, không có khoảng trống và bắt đầu bằng chữ cái
· Dòng đầu tiên của hàm cần bắt đầu bằng từ khoá Function, sau đó là các biến chứa kết quả đưa ra của hàm, tên hàm và các biến chứa dữ liệu nhập vào
· Các dòng hướng dẫn (sẽ được hiện ra khi dùng lệnh help trong matlab) được đưa vào ngay sau dòng đầu tiên, ở cột thứ nhất cần có dấu %
· Tất cả các dòng lệnh tiếp theo tạo thân của hàm, các lệnh trong thân hàm sẽ sử dụng dữ liệu đầu vào và đưa ra dữ liệu xuất ra
· Hàm sẽ dừng lại khi đến cuối tệp hoặc gặp từ khoá return
· Hàm có thể ngừng hoạt động và trả điều khiển về cửa sổ lệnh khi ta dùng lệnh error
· Hàm có thể gọi các scrript file, tuy nhiên các biến trong tệp này chỉ tồn tại trong môi trường làm việc của hàm
· Nhiều hàm có thể tồn tại trong một tệp, các hàm con thường đặt sau hàm chính theo bất kỳ trật tự nào
· Các hàm con có thể được gọi từ hàm chính hoặc bất kỳ hàm con nào
1.2 Biến cục bộ và biến tổng thể
Để định nghĩa biến tổng thể ta dùng lệnh global
Cú pháp
global X Y Z
Mô tả
global X Y Z định nghĩa X, Y, và Z là các biến tổng thể .
Thông thường mỗi hàm của Matlab, được định nghĩa bởi tệp M-file, có các biến cục bộ, những biến này tách rời với các hàm khác (có nghĩa là trong các hàm khác không thể gọi ra giá trị của các biến này). Tuy nhiên trong nhiều trường hợp ta cần phải gọi một biến được định nghĩa trong những hàm khác, những biến có thể dùng chung trong nhiều hàm được gọi là biến tổng thể (global variable).
Khi định nghĩa biến tổng thể (dùng lệnh global) nhưng chưa gán giá trị, các biến này có giá trị bằng 0
Nếu trong môi trường làm việc của matlab có một biến trùng tên với biến tổng thể mà ta định nghĩa, Matlab sẽ đưa ra lời cảnh báo và đưa giá trị hiện thời của biến nối kết với biến tổng thể.
Chú ý
Hãy dùng hàm clear global <variable> để xoá các biến tổng thể khỏi môi trường làm việc, còn clear variable dùng để xoá biến khỏi môi trường làm việc hiện thời mà không ảnh hưởng đến giá trị của biến tổng thể.
2. Tìm điểm 0 của hàm số
Sử dụng hàm fzero
Cú pháp
z = fzero('fun',x,tol)
Mô tả
Hàm fzero('fun',x, tol) tìm điểm mà tại đó hàm fun nhận giá trị 0
Trong lệnh này :
· fun là một chuỗi chỉ ra tên của tệp dùng để định nghĩa hàm số thực
· Nếu x là một giá trị vô hướng thì fzero sẽ tìm ra điểm 0 gần với giá trị của x của hàm được định nghĩa
· Nếu x là một véc tơ có 2 phần tử, fzero sẽ tìm ra điểm không nằm trong khoảng giá trị giữa hai phần tử đó
· tol : quy định sai số tương đối của nghiệm tìm ra. Nếu không quy định giá trị tol, máy sẽ nhận giá trị sai số tương đối mặc định
Thí dụ
Tìm nghiệm của phương trình X3-2X-5=0 ở gần điểm x=2
Trước hết ta phải viết một M.file định nghĩa hàm f:
function y = f(x)
y = x.^3-2*x-5;
Để xác định nghiệm gần x=2 ta gọi lệnh sau trong môi trường Matlab:
z = fzero('f',2)
z =
2.0946
Chú ý:
hàm fzero xác định điểm mà tại đó đồ thị hàm số cần khảo sát cắt trục hoành, không phải là khi đồ thị tiếp xúc với trục hoành
3. Sử dụng hàm fmin
Dùng để xác định cực tiểu của hàm 1 biến
Cú pháp
x = fmin('fun',x1,x2)
x = fmin('fun',x1,x2,options)
Mô tả
x = fmin('fun',x1,x2)
Trong đó fun là chuỗi chỉ tên hàm khảo sát được định nghĩa trong tệp M.file sẽ đưa ra giá trị x tại đó hàm fun sẽ đạt giá trị cực tiểu cục bộ trong khoảng khảo sát x1<=X<=x2 . trong trường hợp này chúng ta không đưa vào tuỳ chọn option, chế độ tính toán sẽ dựa trên các giá trị mặc định của thông số điều khiển.
x = fmin('fun',x1,x2,options) Cho phép chúng ta xác định các thông số điều khiển quá trình tính toán . option là một véc tơ có 3 thành phần:
· options(1) -- Nếu giá trị của nó khác 0, máy sẽ hiển thị các kết quả tính trong quá trình tìm cực tiểu, giá trị mặc định bằng 0.
· options(2) -- quy định sai số tương đối. Giá trị mặc định là 1.e-4.
· options(14) -- quy định số bước tính tối đa. Giá trị mặc định là 500.
Ví dụ
Xác định cực tiểu của hàm f= X3-2X-5=0 ở trong khoảng từ 0 đến 2.
Trước hết ta phải viết một M.file định nghĩa hàm f:
function y = f(x)
y = x.^3-2*x-5;
Để xác định cực tiểu ta gọi hàm
x = fmin('f', 0, 2)
Sẽ đưa ra kết quả
x =
0.8165
Và giá trị của hàm tại điểm cực trị là
y = f(x)
y =
-6.0887
4. Sử dụng hàm fmins
Cú pháp
x = fmins('fun',x0)
x = fmins('fun',x0,options)
Mô tả
x = fmins('fun',x0) Trong đó x0 là một véc tơ các giá trị thực sẽ trả kết quả là véc tơ x xác định cực tiểu cục bộ cuả hàm nhiều biến định nghĩa bằng Mfile 'fun' gần điểm x0 . Các thông số điều khiển quá trình tính toán sẽ nhận giá trị mặc định
x = fmins('fun',x0,options) Cho phép ta ấn định giá trị của các thông số điều khiển quá trình tính toán. ý nghĩa của các thông số này cũng tương tự như ở hàm fmin
Thí dụ
Xác định cực trị của hàm số Rosenbrock:
Hàm có cực tiểu tại (1,1) và giá trị cực tiểu =0. Điểm ước lượng ban đầu là (-1.2,1). M-file banana.m sẽ dùng để định nghĩa hàm trên.
function f = banana(x)
f = 100*(x(2)-x(1)^2)^2+(1-x(1))^2;
Câu lệnh
[x,out] = fmins('banana',[-1.2, 1]);
x
out(10)
Sẽ cho kết quả là
x =
1.0000 1.0000
ans =
165
Các chú ý:
để quá trình tìm kiếm cực trị hội tụ, hàm nhiều biến phải thoả mãn các yếu tố sau:
· Hàm không có điểm gián đoạn
· Hàm không trả ra các giá trị phức, inf hoặc NaN
· Cần chọn điểm xuất phát tìm kiếm hợp lý
· Các biến của hàm cần chuyển đổi sao cho các giá trị của biến gần tương đương nhau về độ lớn
· Để giải các bài toán tìm cực trị có ràng buộc ta phải sử dụng các hàm 'penalty'
V. Tích phân và đạo hàm các hàm số:
1.Tích phân các hàm số :
1.1 Sử dụng hàm trapz
Tích phân số các hàm số bằng phương pháp hình thang
Cú pháp
Z = trapz(X,Y)
Z=trapz(Y)
Mô tả
· Z = trapz(X,Y) tính tích phân của hàm đưa ra bởi véc tơ y phụ thuộc vào x.
· Z = trapz(Y) tính tích phân của hàm đưa bới véc tơ y với trục hoành có khoảng chia là đơn vị. Trong trường hợp trục hoành được chia đều với khoảng cách khác đơn vị, giá trị của tích phân sẽ là giá trị của hàm nhân với trị số của chiều dài khoảng chia.
Thí dụ
Giá trị chính xác của hàm là 2.
Để tính gần đúng tích phân này bằng phương pháp số ta sử dụng các câu lệnh sau:
X = 0:pi/100:pi;
Y = sin(x);
Sau đó 2 câu lệnh sau:
Z = trapz(X,Y) Và Z = pi/100*trapz(Y)
Sẽ đưa ra cùng kết quả:
Z =
1.9998
1.2 Sử dụng hàm cumtrapz
Cú pháp
Z = cumtrapz(Y)
Z = cumtrapz(X,Y)
Mô tả
· Z = cumtrapz(Y) Tính toán tích phân số tích luỹ của hàm đưa ra bởi véc tơ y với đối số là các khoảng chia đơn vị cách đều.
· Z = cumtrapz(X,Y) Tính toán tích phân số tích luỹ của hàm đưa ra bởi véc tơ y với đối số đưa ra bởi véc tơ x . X và y cần có cùng chiều dài. Hoặc x là véc tơ cột và y là mảng 2 chiều
Ví dụ
Nếu Y = [0 1 2; 3 4 5]
cumtrapz(Y,1)
Cho kết quả là
ans =
0 1.0000 2.0000
1.5000 2.5000 3.5000
và
cumtrapz(Y,2)
ans =
0 0.5000 2.0000
3.0000 3.5000 8.0000
1.3 Sử dụng hàm quad, quad8
Cú pháp:
q = quad('fun',a,b)
q = quad('fun',a,b,tol)
q = quad8(...)
Mô tả
· Các hàm Quad cho phép tính diện tích bên dưới đồ thị của hàm số bằng các phương pháp số. Đó chính là tích phân:
· q = quad('fun',a,b) trả kết quả của phép tích phân số của hàm 'fun' trong khoảng giới hạn giữa a và b. 'fun' cần phải trả ra các giá trị một véc tơ khi giá trị đầu vào là một véc tơ.
· q = quad('fun',a,b,tol) cho phép quy định sai số tương đối của phép tích phân. Giá trị mặc định của nó là 1.e-3. Hãy sử dụng véc tơ 2 phần tử tol = [rel_tol abs_tol], để quy định đồng thời cả sai số tương đối và tuyệt đối.
Chú ý: Hàm Quad và Quad8 đều sử dụng phương pháp simson để tính tích phân, Trong đó hàm quad8 sử dụng phương pháp bậc cao.
3. Đạo hàm các hàm số
Sử dụng hàm diff
Tính toán độ lệch và xấp xỉ các đạo hàm
Cú pháp
Y = diff(X)
Y = diff(X,n)
Y = diff(X,n,dim)
Mô tả
Y = diff(X) tính ra độ lệch giữa các phần tử kề nhau của véc tơ X.
Nếu X là véc tơ kết quả đưa ra là véc tơ ít hơn X 1 phần tử:
[X(2)-X(1) X(3)-X(2) ... X(n)-X(n-1)]
Nếu X là ma trận , hàm diff(X) đưa ra kết quả là ma trận cột các độ lệch :
[X(2:m,:)-X(1:m-1,:)]
Y = diff(X,n) Đưa ra véc tơ độ sai lệch bậc n : như vậy diff(X,2) cho ra cùng kết quả với diff(diff(X)).
Chú ý
Giá trị diff(y)./diff(x) đưa ra kết quả đạo hàm của hàm số y(x)
Ví dụ:
x = [1 2 3 4 5];
y = diff(x)
y =
1 1 1 1
z = diff(x,2)
z =
0 0 0
Bài 4: Lập trình ứng dụng trong Matlab
I. Các loại dữ liệu dùng trong Matlab
1. Dữ liệu số
MATLAB sử dụng chế độ ghi số thập phân thông thường với tuỳ chọn về chế độ ghi số chữ số sau dấu phảy và dấu +, - trước giá trị số (xem lệnh format). Bên cạnh chế độ ghi số thập phân thông thường, ta có thể dùng kiểu ghi sử dụng chữ cái e để xác định số mũ cơ số 10. Phần ảo của số phức được thêm phần hậu tố là chữ cái i hoặc j. Dưới đây là một vài thí dụ về dữ liệu số hợp lệ có thể dùng trong Matlab:
3 -99 0.0001
9.6397238 1.60210e-20 6.02252e23
1i -3.14159j 3e5i
Tất cả các số được lưu trữ ở bộ nhớ trong và sử dụng định dạng dài (có 16 chữ số sau dấu phảy) và giá trị giới hạn nằm trong khoảng từ 10-308 to 10+308.
Các hằng số thường được sử dụng trong Matlab.
pi
3.14159265
i
Đơn vị ảo, -1
j
Đơn vị ảo (tương tự i)
eps
Độ chính xác tương đối của số thực, 2-52
realmin
Giá trị nhỏ nhất của số thực, 2-1022
realmax
Giá trị lớn nhất của số thực, (2-)21023
Inf
Vô cùng lớn
NaN
Không phải là số
2. Các phép tính trên số phức
2.1 Nhập dữ liệu
Số phức được nhập ở dạng Phần thực + phần ảo i
Ví dụ: x= 2+3i
2.2 các phép tính thực hiện trên số ảo
- Phép cộng: Sử dụng toán tử +,
- Phép trừ: Sử dụng toán tử -,
- Phép nhân: Sử dụng toán tử *,
- Phép chia: Sử dụng toán tử /
Ví dụ:
Nếu X= 3 +4i, Y=5+6i, ta sẽ có:
X+Y
ans =
8.0000 +10.0000i
X*Y
ans =
-9.0000 +38.0000i
X-Y
ans =
-2.0000 - 2.0000i
X/Y
ans =
0.6393 + 0.0328i
2.3 Các hàm sử lý số phức
a. Hàm real
Lấy ra giá trị phần thực của số phức
Ví dụ: Nếu ta có X=3 +4i, real(X) sẽ cho giá trị 3
b. hàm imag
Lấy ra phần ảo của số phức
Ví dụ: với X lấy giá trị như trên, imag(X) sẽ cho giá trị 4
c. Hàm conj
Tìm số phức liên hợp của số phức đã cho
Ví dụ: với X lấy giá trị như trên, conj(X) sẽ cho giá trị 3-4i
3. dữ liệu dạng chuỗi
3.1. phép gán và tham chiếu đến dữ liệu dạng chuỗi
Phép gán: <tên biến>='chuỗi'
Tham chiếu đến dữ liệu
Chuỗi là một véc tơ hàng có số phần tử bằng số chữ cái trong chuỗi để tham chiếu đến từng chữ cái ta chỉ cần gọi phần tử tương ứng của chuỗi
Các ví dụ: nếu gán x='String Mat', ta sẽ nhận được
x =
String Mat
Khi gọi x(1), ta nhận được ans = S
nếu gọi x(1:6), ta sẽ nhận được ans = String
3.2. Tạo các mảng với phần tử là chuỗi
3.2.1 Tạo véc tơ cột các chuỗi:
Nhập trực tiếp : nhập theo nguyên tắc giống mảng với các phần tử là số, tuy nhiên yêu cầu các chuỗi có chiều dài như nhau, trong trường hợp các chuỗi có chiều dài khác nhau, ta phải thêm bước trống vào cuối chuỗi.
Ví dụ:
x=['first '
'second'
'third ']
x =
first
second
third
Dùng các hàm : char, str2mat, strvcat
Cú pháp: char('chuỗi 1', 'chuỗi 2', ....)
str2mat('chuỗi 1', 'chuỗi 2', ....)
strvcat('chuỗi 1', 'chuỗi 2', ....)
Chú ý : hai hàm char và str2mat có cùng cú pháp, sẽ chèn cả các chuỗi rỗng vào mảng, còn strvcat sẽ bỏ qua chuỗi rỗng
Ví dụ: x=char('first','second', '', 'third') và
x=str2mat('first','second', '', 'third') sẽ cho cùng kết quả là véc tơ cột có 4 phần tử
x =
first
second
third
Tuy nhiên hàm: x=str2mat('first','second', '', 'third'), sẽ cho kết quả là véc tơ cột có 3 phần tử:
x =
first
second
third
2.2 Tạo mảng hoặc véc tơ hàng các chuỗi
Dùng mảng khối:
Mảng khối được nhập như mảng thông thường, chỉ khác là mảng được bao bằng dấu { }
Các phần tử của mảng khối sẽ là các chuỗi
ví dụ:
x={'first' 'second' 'third'}
x =
'first' 'second' 'third'
Nếu gọi : x(1), ta nhận được
ans =
'first'
3.3. Các hàm dùng trên chuỗi
3.3.1 Hàm chuyển đổi từ ký tự sang mã ascci và ngược lại
a. Hàm double
Cú pháp: double(t), t là chuỗi sẽ trả một véc tơ hàng với các phần tử là mã ascci của các ký tự tương ứng trong chuỗi
Chú ý : hàm này có thể dùng trên véc tơ
Ví dụ:
a='abc'
a =
abc
double(a)
ans =
97 98 99
b. Hàm char: chuyển từ mã ascci sang ký tự
Ví dụ: char(65) sẽ cho ta A
Nếu đối số là mảng các số nguyên, ta nhận được chuỗi ký tự.
Ví dụ : char([65 66])=AB
Chú ý: hàm char ngoài chức năng chuyển từ mã ascci sang ký tự còn có chức năng tạo mảng các phần tử là chuỗi và biến đổi các mảng khối về mảng thông thường
Ví dụ:
S = char(C) với c là mảng khối các chuỗi sẽ đặt mỗi một phần tử của c thành các hàng của mảng ký tự s (hàm ngược của nó là cellstr).
xét mảng khối x={'3.123' '4.578'}
khi đó char(x) sẽ cho kết quả:
3.123
4.587
3.3.2 Hàm chuyển đổi từ dữ liệu số sang chuỗi và ngược lại
a. chuyển từ số sang chuỗi: int2str, num2str, mat2str
Hàm int2str: chuyển số nguyên sang chuỗi.
Cú pháp : str = int2str(N)
Mô tả:
str = int2str(N) Chuyển số nguyên sang chuỗi với định dạng của số nguyên. N có thể là một số nguyên riêng lẻ hoặc mảng các số nguyên. Các giá trị thực sẽ được làm tròn trước khi chuyển đổi.
Thí dụ:
int2str(2+3) là chuỗi '5'.
int2str(3.5) =4
Hàm num2str
Chuyển đổi từ số thực sang chuỗi
Cú pháp
str = num2str(A)
str = num2str(A,precision)
str = num2str(A,format)
Mô tả
Hàm num2str chuyển đổi các số thực sang chuỗi. Hàm này được dùng nhiều khi cần đưa vào đồ thị các nhãn hoặc tiêu đề bằng các giá trị số thực.
str = num2str(a) chuyển đổi mảng A thành chuỗi str với 4 chữ số sau dấu phảy và số mũ nếu cần thiết.
str = num2str(a,precision) chuyển đổi mảng A thành chuỗi str với độ chính xác được quy định bằng 'precision'. đối số precision quy định số chữ số sau dấu phảy, mặc định là 4.
str = num2str(A,format) chuyển đổi mảng A sử dụng định dạng quy định bằng 'format'. (xem lệnh fprint).
num2str(pi) là 3.142.
num2str([1/3 3/6]) là 0.33333 0.5
num2str(3/7,5) cho kết quả là: 0.42857
Hàm mat2str
Cú pháp:
str = mat2str(A)
str = mat2str(A,n)
Mô tả
str = mat2str(A) Chuyển ma trận A thành chuỗi, phù hợp với dữ liệu đầu vào của hàm eval, sử dụng độ chính xác cao nhất.
str = mat2str(A,n) Chuyển đổi ma trận A thành chuỗi với n chữ số sau dấu phảy.
Chú ý: Hàm mat2str chỉ được thực hiện trên các giá trị số, véc tơ hoặc mảng chữ nhật.
Thí dụ:
Xét ma trận:
A =
1 2
3 4
Câu lệnh
b = mat2str(A)
cho kết quả:
b =
[1 2 ;3 4 ]
b chuyển từ chuỗi sang số, thực hiện các phép tính: hàm eval
Cú pháp
eval(expression)
[a1,a2,a3,...] = eval(expression)
eval(expression,catch_expr)
Mô tả
eval(expression) thực hiện biểu thức được mô tả trong chuỗi 'expression'. Bạn có thể tạo ra 'expression' bằng cách nối kết các chuỗi con và các biến trong ngoặc vuông ở dạng dưới đây
expression = [string1,int2str(var),string2,...]
[a1,a2,a3,...] = eval(expression) thực thi biểu thức expression và đưa ra các kết quả trong các biến đầu ra chỉ định. biểu thức phải đưa ra ở dạng sau:
eval('[a1,a2,a3,...] = function(var)')
eval(expression,catch_expr) thực thi biểu thức expression và nếu biểu thức bị lỗi nó sẽ thực thi biểu thức catch_expr . Nếu expression có lỗi, ta có thể lấy ra chuỗi báo lỗi bằng hàm lasterr.
Thí dụ:
- y=eval('5+6-7'), cho kết quả y =4
- Nếu ta có x='5+6-sin(pi)', hàm y=eval(x) sẽ cho kết quả: y =11
- eval(['sin(pi/2)' '+' 'cos(pi)']), cho kết quả là 0
c. hàm sprintf
Cú pháp:
s = sprintf(format,A,...)
[s,errrmsg] = sprintf(format,A,...)
Mô tả:
s = sprintf(format,A,...) Định dạng các dữ liệu trong ma trận A, trên cơ sở của chuỗi quy định mẫu định dạng 'format' và trả kết quả cho biến dạng chuỗi s. Câu lệnh sprintf cũng có ý nghĩa tương tự như fprint, điểm khác chỉ ở chỗ câu lệnh fprint thường dùng để xuất dữ liệu ra tệp.
Chuỗi format quy định các ghi chú, căn chỉnh, số chữ số, bề rộng của trường. Nó có thể chứa các dữ liệu số, chữ và các ký tự điều khiển theo cấu trúc sau:
[s,errrmsg] = sprintf(format,A,...) sẽ trả các dòng báo lỗi vào chuỗi errrmsg.
Bảng dưới đây sẽ mô tả các ký tự không nhìn thấy được sử dụng trong định dạng của lệnh sprintf.
Các ký tự thoát
ký tự
Mô tả
\b
Xoá lùi
\f
Kéo giấy
Xuống dòng
\t
lùi vào một bước tab
\\
Backslash
\''
dấu "
%%
dấu %
Các quy định chuyển đổi
ký tự điều khiển
Mô tả
%c
Ký tự riêng lẻ
%d
chế độ ghi số thập phân dùng dấu chấm động
%e
ghi bằng số e (sử dụng e)
%E
ghi bằng số e (sử dụng E)
%f
Cho phép quy định số chữ số xuất ra
%g
Chế độ ghi ngắn gọn %e, %f, Các chữ số 0 phía sau không được in ra
%G
Giống %g, nhưng sử dụng E thay cho e
%s
Ghi chuỗi ký tự
Các ký tự khác
Các ký tự khác có thể chèn vào mã quy định ở vị trí giữa % và ký tự điều khiển.
Ký tự
Mô tả
Thí dụ
Dấu (-)
Left-justifies the converted argument in its field.
%-5.2d
Dấu (+)
Luôn in dấu (+ hoặc -) trước số xuất ra.
%+5.2d
Số (0)
Đưa vào các số 0 thay cho các khoảng trống.
%05.2d
Số nguyên
Quy định số lượng chữ số ít nhất được in ra.
%6f
Số với dấu chấm động)
Số với dấu . xác định số lượng chữ số được in sang phải dấu chấm phân cách.
%6.2f
Thí dụ
Lệnh
Kết quả
sprintf('%0.5g',(1+sqrt(5))/2)
1.618
sprintf('%0.5g',1/eps)
4.5036e+15
sprintf('%15.5f',1/eps)
4503599627370496.00000
sprintf('%d',round(pi))
3
sprintf('%s','hello')
hello
sprintf('The array is %dx%d.',2,3)
The array is 2x3
sprintf('
')
Xuống dòng
d. hàm sscanf
Đọc chuỗi theo định dạng quy định, hàm có ý nghĩa như là hàm ngược của sprintf.
Cú pháp
A = sscanf(s,format)
A = sscanf(s,format,size)
[A,count,errmsg,nextindex] = sscanf(...)
Mô tả
A = sscanf(s,format) Đọc dữ liệu từ chuỗi s, chuyển đổi nó phù hợp với định dạng được quy định trong format và trả ra kết quả cho ma trận a. sscanf có ý nghĩa tương tự như fscanf, ngoại trừ fscanf thường dùng để đọc dữ liệu từ tệp hơn.
A = sscanf(s,format,size) Đọc số phần tử quy định trong size và chuyển đổi nó phù hợp với định dạng quy định trong format. size có thể lấy các giá trị sau:
n
Đọc n phần tử và trả véc tơ cột
inf
Đọc đến cuối tệp và trả kết quả ra véc tơ cột.
[m,n]
Đọc đủ số phần tử để điền vào ma trận m x n phần tử.
Nếu ma trận A là kết quả chỉ của việc sử dụng các ma trận chuyển đổi, và size không ở dạng [M,N], véc tơ hàng sẽ được trả.
[A,count,errmsg,nextindex] = sscanf(...) Đọc dữ liệu từ chuỗi s, chuyển đổi nó phù hợp với quy định trong format và trả nó cho ma trận A, count là biến xuất ra tuỳ chọn, cho biết số phần tử được đọc thành công. errmsg là biến xuất ra tuỳ chọn, trả thông báo lỗi nếu có.
Thí dụ
Các câu lệnh
s = '2.7183 3.1416';
A = sscanf(s,'%f')
Tạo ra véc tơ cột có hai phần tử chứa giá trị của pi và e.
II. Các lệnh nhập, xuất dữ liệu
1. Các lệnh nhập dữ liệu
1.1. Nhập từ bàn phím: Lệnh input
Cú pháp :
<tên biến>=Input('lời nhắc')
<tên biến>=Input('lời nhắc', 's')
<tên biến>=Input('lời nhắc') Sẽ hiển thị lời nhắc và chờ người dùng nhập dữ liệu, các dữ liệu này sẽ được gán cho <tên biến>.
<tên biến>=Input('lời nhắc', 's') thường dùng khi nhập chuỗi: nếu dùng cú pháp thứ nhất để nhập chuỗi thì ta cần đặt chuỗi trong dấu ' ', còn ở cú pháp 2 ta có thể nhập trực tiếp nội dung của chuỗi.
Chú ý:
- Nếu ta ấn enter khi xuất hiện lời nhắc, Matlab sẽ trả kết quả là ma trận rỗng.
- Để xuống dòng ta sử dụng dấu '
'.
Thí dụ:
Khi nhập dòng lệnh: s=input('nhập giá trị x= '), máy đưa ra lời nhắc
nhập giá trị x= và chờ ta nhập giá trị. Nếu ta gõ 5, máy sẽ gán giá trị 5 cho biến s
1.2. Nhập từ hộp thoại: Lệnh inputdlg
Cú pháp:
answer = inputdlg(prompt)
answer = inputdlg(prompt,title)
answer = inputdlg(prompt,title,lineNo)
answer = inputdlg(prompt,title,lineNo,defAns)
- Prompt: là các dòng nhắc trên các trường dữ liệu, được nhập ở dạng mảng khối các chuỗi lời nhắc
- Title: là tiêu đề của hộp thoại, nhập vào ở dạng chuỗi
- LineNo: là số nguyên quy định số dòng cho mỗi trường nhập dữ liệu
- DefAns: là một mảng khối các chuỗi gán giá trị mặc định
Các dữ liệu nhập vào được gán cho answer dưới dạng mảng khối các chuỗi
Ví dụ
prompt = {'Enter matrix size:','Enter colormap name:'};
title = 'Input for peaks function';
lines= 1;
def = {'20','hsv'};
answer = inputdlg(prompt,title,lines,def);
Sẽ đưa ra hộp thoại:
Nếu nhập ở hai hộp các giá trị 40 và red, sau đó nháy OK, ta nhận được:
answer={'20' 'red'}
Chú ý:
Kết quả nhập vào được gán cho biến ở dạng mảng khối các chuỗi, chính vì vậy để có thể sử dụng được các giá trị này ta phải dùng hàm char để chuyển đổi về mảng thông thường, sau đó dùng các hàm sscanf hoặc eval để chuyển dữ liệu về dạng số.
1.3. Nhập dữ liệu từ tệp: Lệnh fread
Cú pháp:
[A,count] = fread(fid,size,precision)
- Dữ liệu đọc được sẽ ghi vào mảng A, count sẽ ghi lại số phần tử được đọc
- Fid là chỉ số của tệp được mở lấy ra từ lệnh fopen
- Size : định dạng số phần tử được lấy ra
· n : Đọc n phần tử và ghi ra ở dạng véc tơ cột.
· inf : Đọc đến cuối mảng, các phần tử đưa vào ma trận cột.
· [m,n] :Đọc đủ số phần tử để điền vào ma trận m x n , các phần tử điền vào theo trật tự các cột, nếu không đủ số phần tử điền, máy thêm vào phần tử 0.
- Preciscion:
'char'
Character; 8 bits
'schar'
Signed character; 8 bits
'uchar'
Unsigned character; 8 bits
'int8'
Integer; 8 bits
'int16'
Integer; 16 bits
'int32'
Integer; 32 bits
'int64'
Integer; 64 bits
'uint8'
Unsigned integer; 8 bits
'uint16'
Unsigned integer; 16 bits
'uint32'
Unsigned integer; 32 bits
1.4. Mở tệp để ghi hoặc đọc dữ liệu, Lệnh fopen:
Cú pháp: fid = fopen(filename,permission)
Permission: quy định chế độ mở, có thể lấy các giá trị:
- 'r': mở ra để đọc
- 'w': mở ra để ghi , nếu tệp đã có, nó sẽ xoá toàn bộ nội dung tệp và ghi lại
- 'a': mở ra để ghi thêm
Filename: là tên của tệp sẽ mở được đặt trong dấu ' '
Kết quả sẽ trả ra chỉ số của tệp được mở (con trỏ tham chiếu đến tệp) và gán cho biến fid.
1.5 Lệnh đóng tệp, fclose
Cú pháp:
status = fclose(fid), đóng tệp chỉ định
status = fclose('all'), đóng tất cả các tệp đang mở
1.6 Nhập dữ liệu từ tệp định dạng mã ascci, Lệnh fscanf
Cú pháp:
A = fscanf(fid,format)
[A,count] = fscanf(fid,format,size)
ở cú pháp thứ nhất, fscanf sẽ đọc dữ liệu từ tệp có con trỏ fid theo định dạng quy định bằng chuỗi format.
ở cú pháp thứ hai, size sẽ quy định số phần tử sẽ được đọc, size có thể lấy các giá trị sau:
n
Đọc n phần tử và trả véc tơ cột
inf
Đọc đến cuối tệp và trả kết quả ra véc tơ cột.
[m,n]
Đọc đủ số phần tử để điền vào ma trận m x n phần tử.
Số phần tử được đọc thành công sẽ được trả cho biến count
Ví dụ: ta có tệp dữ liệu có tên là 'd:\data\dl.dat' có các số liệu sau:
1.345 4.123 4.567 2.456
2.675 6.876 4.576 3.456
Đoạn chương trình sau sẽ đọc dữ liệu từ tệp xếp thành ma trận (4,2) và gán cho biến M
f=fopen('d:\data\dl.dat','r');
M=fscanf(f,'%f',[4,2]);
fclose(f);
2. Các lệnh xuất dữ liệu
2.1. lệnh disp
cú pháp: disp(A)
Hiển thị văn bản hoặc mảng
Mô tả
disp(X) Hiển thị giá trị các mảng mà không đưa ra tên mảng, nếu x chứa chuỗi, chuỗi sẽ được in ra màn hình.
2.2. Lệnh fprintf
Cú pháp:
count = fprintf(fid,format,A,...)
fprintf(format,A,...)
Mô tả
count = fprintf(fid,format,A,...) định dạng các dữ liệu ở phần thực của ma trận A dưới sự điều khiển của chuỗi định dạng 'format' và ghi vào tệp tham chiếu bằng con trỏ 'fid'. Hàm fprintf trả số lượng byte được ghi ra.
- fid là chỉ số của tệp được mở ra để ghi dữ liệu, nhận được từ lệnh fopen. Nếu bỏ qua fid, kết quả sẽ in ra màn hình.
- format là chuỗi quy định định dạng sẽ xuất ra (xem lệnh sprintf)
Ví dụ:
Các câu lệnh
x = 0:.1:1;
y = [x; exp(x)];
fid = fopen('exp.txt','w');
fprintf(fid,'%6.2f %12.8f
',y);
fclose(fid)
Tạo ra tệp dữ liệu có tên exp.txt chứa các dữ liệu:
0.00 1.00000000
0.10 1.10517092
...
1.00 2.71828183
Dòng lệnh:
fprintf('A unit circle has circumference %g.
',2*pi)
Hiển thị trên màn hình dòng chữ
A unit circle has circumference 6.283186.
Để chèn dấu ' ta phải dùng hai dấu '. Ví dụ:
fprintf(1,'It''s Friday.
')
Hiển thị trên màn hình: It's Friday.
Các dòng lệnh
B = [8.8 7.7; 8800 7700]
fprintf(1,'X is %6.2f meters or %8.3f mm
',9.9,9900,B)
Sẽ đưa ra
X is 9.90 meters or 9900.000 mm
X is 8.80 meters or 8800.000 mm
X is 7.70 meters or 7700.000 mm
2.3. Lệnh fwrite
Ghi dữ liệu ra tệp ở dạng mã nhị phân.
Cú pháp:
count = fwrite(fid,A,precision)
Mô tả:
count = fwrite(fid,A,precision) ghi các phần tử của ma trận A vào tệp tham chiếu bởi 'fid'. Chuyển đổi các giá trị của MATLAB với độ chính xác được quy định trong 'precision'. Dữ liệu được ghi theo trật tự cột, count sẽ đếm số phần tử được ghi thành công vào tệp. đối số 'fid' là con trỏ tệp nhận được từ lệnh fopen.
III. Các lệnh phân nhánh
1. Lệnh if
1.1 Cú pháp:
if expression
statements
end
hoặc
if expression
statement1
else
statements2
end
Hoặc
if expression1
statements1
elseif expression2
statements2
else
statements3
end
Trong các cú pháp đưa ra ở trên:
- expression là các biểu thức lô gíc, quy tắc viết các biểu thức lô gíc sẽ được trình bày ở dưới đây
- statement là các biểu thức, dòng lệnh của matlab
Trong cú pháp 1: Máy sẽ kiểm tra biểu thức logic: nếu biểu thức lôgic đúng, máy sẽ thực hiện các lệnh trong if (nằm giữa if và end), còn nếu biểu thức lô gíc sai máy sẽ bỏ qua các câu lệnh trong if và thực hiện các câu lệnh kế tiếp câu lệnh if
Trong cú pháp 2: nếu biểu thức lôgic đúng máy sẽ thực hiện các câu lệnh statements1, còn nếu biểu thức lôgic sai máy sẽ thực hiện các câu lệnh statements2.
Trong cú pháp 3: Nếu expression1 đúng, máy sẽ thực hiện biểu thức statements1. Nếu expression1sai, máy sẽ kiểm tra expression2 : nếu biểu thức lôgic này đúng, máy sẽ thực hiện statements2, còn các trường hợp khác máy sẽ thực hiện biểu thức statements3.
1.2 Các toán tử logic
Mat lab cho phép sử dụng các toán tử lôgic sau:
STT
Toán tử
ý nghĩa
thí dụ
1
= =
kiểm tra liệu hai biểu thức có bằng nhau không
A=B
2
<
Lớn hơn
A>B
3
>
Nhỏ hơn
A<B
4
<=
Nhỏ hơn hoặc bằng
A<=B
5
>=
Lớn hơn hoặc bằng
A>=B
6
~=
Khác
A~=B
7
&
Và lôgic
A&B
8
|
Hoặc lôgic
A|B
9
Not
Phủ định
Not(A)
1.3 Các hàm logíc
a. Hàm isemty(X),
Kiểm tra liệu mảng X có rỗng không, cho giá trị đúng (1) khi X rỗng nguợc lại cho kết quả sai (0)
b. Hàm isequal(a,b...)
k = isequal(A,B,...) sẽ trả giá trị đúng lôgic, nếu các mảng đối số có cùng dạng, cùng kích cỡ và có cùng nội dung. Hàm này thường dùng khi so sánh hai hay nhiều mảng, nó sẽ không gây lỗi khi 2 mảng có kích thước khác nhau.
c. Hàm ischar(x)
Cho kết quả đúng nếu x là dữ liệu dạng chuỗi.
d. Các hàm strcmp(s1,s2), strcmp(s1, s2, n)
- Hàm strcmp(s1,s2) so sánh hai chuỗi s1, s2. Nếu hai chuỗi giống nhau sẽ trả kết quả đúng
- Hàm strcmp(s1,s2,n) cho kết quả đúng nếu n ký tự đầu tiên của hai chuỗi như nhau.
Chú ý:
Trong trường hợp đối số trong các hàm lôgic là ma trận, máy sẽ thử từng cặp phần tử trong ma trận, nếu đúng trả giá trị 1, nếu sai trả giá trị 0 và kết quả nhận được là ma trận các giá trị 1 và 0. Để so sánh được hai ma trận phải có cùng kích thước.
1.4 Các ví dụ
2. Lệnh switch
Cú pháp:
switch switch_expr
case case_expr
statement,...,statement
case {case_expr1,case_expr2,case_expr3,...}
statement,...,statement
...
otherwise
statement,...,statement
end
switch_expr: là một biểu thức trả kết quả là một chuỗi hoặc một số.
- Nếu trả ra một số các biểu thức : switch_expr== case_expr Sẽ được thử
- Nếu trả ra một chuỗi: các biểu thức strcmp(switch_expr,case_expr) sẽ được thử
Khi lệnh switch được gọi, nó sẽ tính toán giá trị biểu thức witch_expr Sau đó giá trị của biểu thức này sẽ được so với mỗi một biểu thức case_expr theo trình tự được ghi trong câu lệnh, nếu 2 phép so sánh đưa ra kết quả đúng, nhóm các câu lệnh tương ứng sẽ được thực hiện, sau đó thoát khỏi lệnh và thực hiện các câu lệnh sau switch.
Nếu biểu thức case_expr là một mảng khối, từng phần tử trong mảng khối sẽ được so sánh, chỉ cần 1 trong các lần so trả giá trị đúng, phép thử sẽ cho kết quả đúng và khối lệnh trong nhánh case tương ứng sẽ được thực hiện.
Nếu tất cả các biểu thức case_expr đều không phù hợp với giá trị của switch_exp. Nhóm lệnh dưới otherwise sẽ được thực hiện.
Thí dụ
X=2.7;
Units='m';
Switch units
Case {'inch' , 'in'}
Y=x*25.4;
Case {'meter','m'}
Y=x/100;
Otherwise
Disp(['unknow unit:' units])
end
IV. Các vòng lặp
1. Vòng lặp xác định: for
Cú pháp
for <variable>= expression
statements
end
expression: là biểu thức đưa ra kết quả là một mảng
vòng sẽ thực hiện các câu lệnh lặp với số lần bằng số cột của mảng, trong mỗi lần lặp biến <variable> sẽ mang giá trị là một véc tơ hàng tương ứng của mảng
Thí dụ: Tạo mảng có các phần tử a(i,j)=1/(i+j-1)
a = zeros(n,n) % Preallocate matrix
for i = 1:n
for j = 1:n
a(i,j) = 1/(i+j -1);
end
end
2. Vòng lặp không xác định: while
Cú pháp
while <expression >
statements
end
Trong đó : <expression> là một biểu thức logíc
Khi thực hiện câu lệnh, máy sẽ kiểm tra biểu thức lôgíc, nếu giá trị biểu thức là đúng, các câu lệnh trong vòng lặp <statements> sẽ được thực hiện, sau khi thực hiện xong sẽ quay trở về kiểm tra lại giá trị của biểu thức lô gíc.
Nếu giá trị của biểu thức lô gíc là sai, vòng lặp sẽ kết thúc.
Thí dụ
a = 0;
fa = -Inf;
b = 3;
fb = Inf;
while b-a > eps*b
x = (a+b)/2;
fx = x^3-2*x-5;
if sign(fx) == sign(fa)
a = x;
fa = fx;
else b = x;
fb = fx;
end
end
x
Là đoạn chương trình cho phép ta xác định nghiệm của phương trình :
X3-2X-5=0 trong khoảng 0<X<3
3. Lệnh break:
Thoát khỏi vòng lặp một cách cưỡng bức
Cú pháp:
break
Mô tả:
break Dừng việc thực thi vòng lặp for hoặc while. Khi có nhiều vòng lặp lồng vào nhau, break sẽ chỉ thoát khỏi vòng lặp gần nhất.
Ví dụ:
Với bài toán đặt ra ở trên, nếu dùng lệnh break, chương trình sẽ gọn hơn rất nhiều
a = 0; fa = -Inf;
b = 3; fb = Inf;
while b-a > eps*b
x = (a+b)/2;
fx = x^3-2*x-5;
if fx == 0
break
elseif sign(fx) == sign(fa)
a = x; fa = fx;
else
b = x; fb = fx;
end
end
x
V. Các chương trình con
1. Phương pháp xây dựng các hàm và chương trình con
Hàm được viết trong m file, tên của m file được bắt đầu bằng ký tự chữ hoặc số và có phần mở rộng là .m.
Dòng trên cùng của hàm m file phải chứa từ khoá function và viết theo đúng quy cách quy định trong Matlab.
function [biến ra1, biến ra 2...] = <Tên hàm>(biến vào 1, biến vào 2..)
Tên của m file phải trùng với <tên hàm>.
Ví dụ: tệp stat.m chứa nội dung sau
function [mean,stdev] = stat(x)
n = length(x);
mean = sum(x)/n;
stdev = sqrt(sum((x-mean).^2/n));
định nghĩa hàm có tên stat, sẽ tính ra độ lệch chuẩn của véc tơ x.
Chúng ta có thể định nghĩa một hàm con trong hàm khác bằng cách gọi ra từ khoá function bên dưới thân của hàm chính. Ví dụ dưới đây sẽ định nghĩa hàm con avg bên trong tệp stat.m :
function [mean,stdev] = stat(x)
n = length(x);
mean = avg(x,n);
stdev = sqrt(sum((x-avg(x,n)).^2)/n);
function mean = avg(x,n)
mean = sum(x)/n;
Khi Matlab không nhận ra một tên hàm, nó sẽ tìm kiếm tên tệp trùng với tên hàm, nếu tìm ra nó sẽ dịch và đưa vào bộ nhớ. Trong trường hợp tổng quát nếu ta nhập một tên vào Matlab, nó sẽ kiểm tra theo trình tự sau:
1. Kiểm tra xem đó có phải là tên biến
2. Kiểm tra xem đó có phải là tên hàm nội trú trong Matlab.
3. Kiểm tra xem đó có phải là hàm m. file
Khi gọi một m.file từ dòng nhắc hoặc trong m.file khác đưa hàm vào bộ nhớ, và nó sẽ lưu lại ở đó cho tới khi ta thoát khỏi Matlab hoặc dùng lệnh clear.
2. các đối số vào, ra
- Hàm m-file có thể không chứa đối số nào
- Hàm có thể được gọi với số đối số ra hoặc vào ít hơn số đối số được khai báo trong hàm
- Số lượng đối số vào ra được sử dụng khi gọi hàm có thể được xác định bằng hàm nargout và nargin. Chú ý rằng hai hàm này không phải là biến và ta không thể tính toán trên nó
- Khi hàm được gọi ra các biến sử dụng trong hàm chỉ tồn tại tạm thời trong vùng bộ nhớ dành cho hàm
- Hàm trong Matlab có thể chứa không hạn chế thông số đầu vào, khi đó biến đầu vào cuối cùng của hàm phải được khai báo là varargin, khi đó biến đầu vào được coi như một mảng khối có vô số phần tử
- Tương tự hàm cũng có thể chứa vô hạn các thông số ra khi ta khai báo bằng varargout
2.1 Hàm nargout và nargin
Bên trong hàm M-file các hàm nargin và nargout chỉ ra có bao nhiêu đối số vào và ra được sử dụng khi hàm được gọi ra.
Thí dụ:
function [x,y]=test(fileName, filePath, Num)
% Sử dụng hàm nargin và nargout
if nargin<3, Num=[2,20];end
if nargin<2
filePath='c:\My Documents';
end
if nargin==0
fileName='f.dat';
end
Fname=strcat(filePath,'\',fileName);
f=fopen(Fname,'r');
k=fread(f,Num);
fclose(f)
if nargout==0
plot(k(1,:),k(2,:))
else
x=k(1,:);y=k(2,:);
end;
2.2 Câu lệnh varagin và varagout
Cho phép định nghĩa vô số biến vào và ra của hàm trong Matlab
Cú pháp:
function varargout = foo(n)
y = function bar(varargin)
Mô tả:
Hàm varargout = foo(n) sẽ trả một số lượng không hạn chế các biến ra từ hàm foo.m.
Hàm y = function bar(varargin) Chấp nhận vô số biến đầu vào của hàm bar.m
Các câu lệnh varargin và varargout chỉ được sử dụng bên trong hàm m.file để chứa biến tuỳ chọn vào hoặc ra của hàm. Chúng phải được định nghĩa như là một biến cuối cùng trong danh sách các biến khai báo ở câu lệnh function.
Ví dụ:
Hàm sau đây:
function myplot(x,varargin)
plot(x,varargin{:})
Sẽ nhặt tất cả các biến đầu vào sau biến thứ nhất cho biến varagin, hàm myplot sẽ sử dụng danh sách phân biệt bằng dấu : để chuyển các thông số đầu vào tuỳ chọn cho lệnh plot. Nếu ta gọi:
myplot(sin(0:.1:1),'color',[.5 .7 .3],'linestyle',':')
kết quả trong biến varargin sẽ là mảng khối 1 x 4 chứa các giá trị : 'color',
[.5 .7 .3], 'linestyle', và ':'.
Hàm sau đây:
function [s,varargout] = mysize(x)
nout = max(nargout,1)-1;
s = size(x);
for i=1:nout, varargout(i) = {s(i)}; end
Sẽ đưa ra kích cỡ của mảng x và có thể tuỳ chọn đưa ra từng thành phần của véc tơ cỡ của mảng x. Do vậy nếu ta gọi:
[s,rows,cols] = mysize(rand(4,5));
Ta sẽ nhận được s = [4 5], rows = 4, cols = 5.
bài 5: Đồ hoạ trong Matlab
MATLAB có các công cụ hết sức hữu hiệu để hiển thị các véc tơ và ma trận ở dạng đồ thị cũng như việc chú thích và in ấn đồ thị này. Trong chương này chúng ta sẽ đề cập một vài hàm quan trọng nhất về đồ hoạ của Matlab và đưa ra một số thí dụ điển hình
I. Tạo ra đồ thị
Hàm PLOT có nhiều dạng, phụ thuộc vào các biến đầu vào:
¨ Nếu Y là một véc tơ, hàm PLOT(Y) sẽ in ra đồ thị Y phụ thuộc vào chỉ số của nó trong véc tơ
¨ Nếu X, Y là hai véc tơ cùng độ lớn hàm PLOT(X,Y) sẽ in ra đồ thị hàm Y(X)
Ví dụ: để vẽ đồ thị hàm Sin với trị số hoành độ từ 0 đến 2 Pi ta dùng các dòng lệnh sau:
X=0:Pi/100:2*Pi;
Y=Sin(X);
PLOT(X,Y)
Nếu đối số trong hàm bao gồm nhiều bộ X, Y, Hàm sẽ đưa ra được nhiều đồ thị trên màn hình và Matlab sẽ tự động hiển thị các đồ thị với các màu khác nhau.
Ví dụ :
Nếu ta có: y1= sin(x); y2=sin(x-0.25); y3=sin(x-0.5)
Hàm : plot(x, y,xy2,x,y3) sẽ đưa ra bộ đồ thị như hình vẽ
Trong hàm plot ta cũng có thể chỉ định kiểu đường nét, màu sắc và kiểu đánh dấu các điểm nút với cú pháp:
plot(x,y,'color_style_marker')
Trong đó color_style_marker là một bộ 1,2 hoặc 3 ký tự phân cách bằng dấu ngoặc đơn chỉ định kiểu đường nét, màu sắc và kiểu đánh dấu các điểm nút
· Các chữ cái chỉ màu sắc bao gồm: 'c', 'm', 'y', 'r', 'g', 'b', 'w', và 'k'. Tương ứng với màu xanh dương, màu gạch non, màu vàng, màu đỏ, màu xanh, màu nước biển, màu trắng và đen.
· Các ký tự chỉ kiểu đường bao gồm '-' đối với nét liền, '- -' đối với đường gạnh, ':' đường chấm, '-.' đường chấm gạch, và 'none' khi không vẽ đường.
· Các ký tự để đánh dấu điểm bao gồm: '+', 'o', '*', và 'x'.
Ví dụ: câu lệnh plot(x,y,'y:+') vẽ ra đồ thị là đường chấm chấm màu vàng có dấu + đánh dấu các điểm nút
Chú ý:
1. Lệnh plot sẽ tự động mở ra một cửa sổ đồ hoạ mới. Nếu cửa sổ này đã tồn tại lệnh plot mặc định sẽ sử dụng cửa sổ này. Để mở một cửa sổ mới và đưa nó thành hiện thời ta dùng lệnh figure
2. Để đưa một cửa sổ đã mở thành hiện thời ta dùng câu lệnh figure(n), trong đó n là số trên thanh tiêu đề của cửa sổ
3. Vẽ thêm đường cong mới vào một đồ thị đã có : Lệnh hold cho phép bạn thêm đường cong vào đồ thị đã có. Nếu bạn đặt chế độ hold on Matlab sẽ không xoá đồ thị đã có và vẽ thêm đường cong mới khi gọi lệnh vẽ.
Ví dụ:
[x,y,z] = peaks;
contour(x,y,z,20,'k')
hold on
pcolor(x,y,z)
shading interp
¨ Câu lệnh Contour sẽ vẽ ra đường chu tuyến tạo bởi hàm peaks
¨ Hold on sẽ đảm bảo cho câu lệnh pcolor được phối hợp với các đường cong đã vẽ ra bằng lệnh contour trên cửa sổ
II. Lệnh Subplot
¨ Hàm subplot sẽ chia cửa sổ đồ hoạ ra nhiều phần để hiện thị nhiều đồ thị trên một cửa sổ
¨ Cú pháp : sublot(m,n,p)
Trong đó m,n,p là các số nguyên, sẽ chia cửa sổ đồ hoạ ra m hàng và n cột và đưa phần cửa sổ thứ p thành hiện thời. Chỉ số các cửa sổ con được xác định từ phải qua trái và từ trên xuống dưới.
Ví dụ:
Các câu lệnh sau:
t = 0:pi/10:2*pi;
[X,Y,Z] = cylinder(4*cos(t));
subplot(2,2,1)
mesh(X)
subplot(2,2,2); mesh(Y)
subplot(2,2,3); mesh(Z)
subplot(2,2,4); mesh(X,Y,Z)
sẽ cho ta kết quả như hình vẽ
III Điều khiển các trục toạ độ
1. câu lệnh axis
Hàm axis có một số các tuỳ chọn để thay đổi tỷ lệ, hướng và tỷ lệ. Thông thường matlab xác định giá trị lớn nhất và nhỏ nhất của dữ liệu để chọn một vùng vẽ tương xứng. Lệnh axis sẽ quy định lại các giá trị này theo yêu cầu của người dùng:
axis([xmin xmax ymin ymax])
Lệnh axis cũng chấp nhận một số các từ khoá để điều khiển việc vẽ các trục:
¨ axis square : Tạo cho toàn bộ trục x và y có cùng chiều dài
¨ axis equal : tạo ra các khoảng chia trên trục X và Y có chiều dài như nhau.
¨ axis auto : Trả lại chế độ mặc định trong việc vẽ ra các trục
¨ axis on : Viết ra tên của trục và đánh dấu các điểm chia trên trục
¨ axis off : Huỷ bỏ việc viết ra tên của trục và đánh dấu các điểm chia trên trục
Ví dụ:
Các câu lệnh
x = 0:.025:pi/2;
plot(x,tan(x),'-ro')
Sẽ sử dụng hệ số tỷ lệ tự động trên cơ sở của giá trị Ymax=tan(1.57), có giá trị >1000:
Tuy nhiên đồ thị trên không thể hiện được quan hệ hàm số một cách rõ nét. Kết quả nhận được sẽ tốt hơn nếu ta gõ lệnh:
axis([0 pi/2 0 5])
2. Câu lệnh Grid
grid off : không vẽ ra các đường lưới
grid on : vẽ ra các đường lưới
grid: Đảo ngược tình trạng hiển thị hiện thời của lưới.
IV ghi chú trên đồ thị
1. Hàm xlabel, ylabel và zlabel :
Đưa vào dòng chú giải các trục x, y, z
Cú pháp:
xlabel('string')
xlabel(fname)
xlabel(...,'PropertyName',PropertyValue,...)
h = xlabel(...)
Mô tả
Mỗi trục của đồ thị có thể có nhãn riêng được tạo ra bằng các lệnh xlabel, ylabel hoặc zlabel.
xlabel('string') Ghi chú cho trục x của hệ toạ độ hiện thời.
xlabel(fname) Lấy giá trị của hàm fname, với kết quả là một chuỗi, sau đó hiển thị chuỗi đó bên cạnh trục x.
xlabel(...,'PropertName',PropertyValue,...) Cho phép chúng ta gán các thuộc tính khác nhau cho nhãn của trục x (xem phần các đặc tính của văn bản đồ hoạ).
2 Hàm title :
Chèn vào dòng tên đồ thị
Cú pháp:
title('string')
title(fname)
title(...,'PropertyName',PropertyValue,...)
h = title(...)
Mô tả
Chúng ta có thể dùng lệnh title để viết tiêu đề cho đồ thị:
title('string') Dùng chuỗi 'string' làm tiêu đề cho đồ thị.
title(fname) Xác định giá trị của hàm chuỗi fname và dùng nó làm tiêu đề cho đồ thị trên cửa sổ đồ hoạ hiện thời.
title(...,'PropertyName',PropertyValue,...) Cho phép quy định các thuộc tính khác nhau cho tiêu đề của đồ thị.
3 Hàm text :
chèn văn bản vào điểm bất kỳ trên đồ thị
Cú pháp:
text(x,y,'string')
text(x,y,z,'string')
text(...'PropertyName',PropertyValue...)
- Trong đó x,y là toạ độ của điểm sẽ xuất văn bản ra:
- 'string' là chuỗi văn bản được xuất ra.
Trong trường hợp muốn xuất ra nhiều dòng văn bản, thay cho việc đưa vào chuỗi 'string', chúng ta hãy đưa vào mảng khối với các phần tử của mảng là các dòng văn bản.
Ví dụ dưới đây sẽ tạo ra hai mảng khối, một dùng cho hàm uicontrol và mảng thứ 2 dùng cho lệnh text.
str1(1) = {'Center each line in the Uicontrol'};
str1(2) = {'Also check out the textwrap function'};
str2(1) = {'Each cell is a quoted string'};
str2(2) = {'You can specify how the string is aligned'};
str2(3) = {'You can use LaTeX symbols like \pi \chi \Xi'};
str2(4) = {'\bfOr use bold \rm\itor italic font\rm'};
str2(5) = {'\fontname{courier}Or even change fonts'};
plot(0:6,sin(0:6))
uicontrol('Style','text','Position',[80 80 250 65],...
'String',str1);
text(5.75,sin(2.5),str2,'HorizontalAlignment','right')
Kết quả nhận được như sau:
4. Sử dụng các biến trong chuỗi văn bản
Tất cả các biến có dữ liệu dạng chuỗi đều có thể sử dụng thay cho chuỗi 'string' trong các câu lệnh. Ví dụ như chúng ta có dữ liệu ở dạng véc tơ cột các chuỗi văn bản sau:
PersonalData = ['Jack Straw ';'489 Main St.';'Wichita KN '];
Để hiển thị các dữ liệu này trên màn hình đồ hoạ ta thực hiện các câu lệnh:
text(x1,y1,['Name: ',PersonalData(1,:)])
text(x2,y2,['Address: ',PersonalData(2,:)])
text(x3,y3,['City and State: ',PersonalData(3,:)])
Nếu biến chứa dữ liệu số, ta phải chuyển nó thành dữ liệu chuỗi ví dụ:
x = 21;
text(xcoord,ycoord, ['Today is the ',num2str(x),'st day.']) sẽ in ra tại toạ độ (xcoord,ycoord) dòng chữ : 'Today is the 21st day.'
5. Quy định các thuộc tính của văn bản đồ hoạ
Để quy định vị trí, cách căn chỉnh, kích cỡ và kiểu font chữ của văn bản đồ hoạ đưa ra bởi các lệnh xlabel, ylabel, zlabel, text, title ..., chúng ta có thể gán thuộc tính cho các dòng văn bản đó ở dạng :
<câu lệnh>(...., 'Property Name',<property value>...).
ở đây:
- <câu lệnh> là các câu lệnh viết chữ của Matlab (xlabel, text, title ...)
- 'Property Name' là tên thuộc tính (cần đặt bên trong dấu ' ')
- <property value> là giá trị của thuộc tính có thể là chuỗi hoặc số nguyên, số thực ...
4.1 Các thuộc tính của văn bản
Tên thuộc tính
ý nghĩa
giá trị
' FontName'
Cho phép quy định kiểu font chữ
Tên font chữ (dạng chuỗi)
'Position'
Quy định vị trí đặt chuỗi văn bản
toạ độ x và y (z) của điểm: [ x y (z)]
'Rotation'
Góc xoay của dòng văn bản
Số thực chỉ góc tính bằng độ
'VerticalAlignment'
Quy định kiểu căn chỉnh theo phương thẳng đứng
'Top', 'Bottom', 'Middle'
'HorizontalAlignment'
Quy định kiểu căn chỉnh theo phương ngang
'Left', 'Center', 'Right'
'FontSize'
quy định cỡ chữ
số nguyên
4.2 Xuất các ký tự đặc biệt
Trong các chuỗi của đối số của các hàm viết chữ trong chế độ đồ hoạ ta có thể đưa vào các ký tự điều khiển để xuất ra các chữ cái hy lạp, ký hiệu toán học, và kiểu font. Các mã điều khiển được đặt sau dấu '\' ví dụ:
Bảng các ký tự điều khiển dùng để xuất chữ cái hy lạp và biểu tượng
Chuỗi ký tự điều khiển
Biểu tượng
Chuỗi ký tự điều khiển
Biểu tượng
Chuỗi ký tự điều khiển
Biểu tượng
\alpha
\upsilon
\sim
~
\beta
\phi
\leq
\gamma
\chi
\infty
\delta
\psi
\clubsuit
\epsilon
\omega
\diamondsuit
\zeta
\Gamma
\heartsuit
\eta
\Delta
\spadesuit
\theta
\Theta
\leftrightarrow
\vartheta
\Lambda
\leftarrow
\iota
\Xi
\uparrow
\kappa
\Pi
\rightarrow
\lambda
\Sigma
\downarrow
\mu
à
\Upsilon
\circ
º
u
\Phi
\pm
±
\xi
\Psi
\geq
\pi
\Omega
\propto
\rho
\forall
\partial
\sigma
\exists
\bullet
•
\varsigma
i
\div
ữ
\tau
\cong
eq
\equiv
\approx
\aleph
\Im
\Re
\wp
\otimes
\oplus
\oslash
\cap
\cup
\supseteq
\supset
\subseteq
\subset
\int
\in
\o
\rfloor
\lceil
abla
\lfloor
\cdot
ã
\ldots
...
\perp
eg
ơ
\prime
'
\wedge
\times
x
\0
\rceil
\surd
\mid
|
Chúng ta có thể điều khiển trực tiếp kiểu font chữ bằng các ký tự điều khiển: \fontname Trong trường hợp này tên font chữ sẽ phải đặt trong dấu {}. kế tiếp phần điều khiển font chữ, chúng ta có thể thêm các mã điều khiển:
\bf - kiểu chữ đậm
\it - kiểu chữ nghiêng
\sl - oblique font
\rm - kiểu chữ bình thường
\fontsize{fontsize} - Định nghĩa cỡ chữ.
Các chỉ số trên và dưới được định nghĩa bằng các ký tự điều khiển "_" và "^"
5. các thí dụ
Để hiển thị ngày hiện thời trên tiêu đề của đồ thị ta dùng hàm:
title(date)
Để đưa vào các chuỗi số ta dùng các lệnh sau:
f = 70;
c = (f--32)/1.8;
title(['Temperature is ',num2str(c),'C'])
Include a variable's value in a title and set the color of the title to yellow:
n = 3;
title(['Case number #',int2str(n)],'Color','y')
Include Greek symbols in a title:
title('\ite^{\omega\tau} = cos(\omega\tau) + isin(\omega\tau)')
Include a superscript character in a title:
title('\alpha^2')
Include a subscript character in a title:
title('X_1')
Ví dụ : đưa vào các chuỗi ký tự đặc biệt
t = -pi:pi/100:pi;
y = sin(t);
plot(t,y)
axis([-pi pi -1 1])
xlabel('-\pi \leq \itt \leq \pi')
ylabel('sin(t)')
title('Graph of the sine function')
text(1,-1/3,'\it{Note the odd symmetry.}')
Đưa ra đồ thị như hình vẽ:
6. Các tuỳ chọn của lệnh plot
Trong lệnh plot ta có thể đưa vào các tuỳ chọn ở dạng:
plot(...,'PropertyName',PropertyValue,...)
Trong đó 'PropertyName' là tên các thuộc tính,
PropertyValue là giá trị của thuộc tính mà ta muốn gán:
Dưới đây là bảng liệt kê các thuộc tính của đồ thị:
Tên thuộc tính
ý nghĩa
kiểu giá trị
'LineWidth'
điều khiển bề dầy của nét vẽ đồ thị
số nguyên
'MarkerEdgeColor'
Điều khiển màu của nét vẽ biểu tượng đánh dấu điểm
các ký tự chỉ màu ví dụ:'g','y'...
'MarkerSize'
Kích thước của biểu tượng đánh dấu điểm
số nguyên
'MarkerFaceColor'
Điều khiển màu của biểu tượng đánh dấu điểm
các ký tự chỉ màu ví dụ:'g','y'...
Ví dụ:
plot(x,sin(2*x),'-mo',...
'LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','r',...
'MarkerSize',12)
7. Các lệnh viết chữ khác
7.1 Lệnh gtext
Cú pháp:
gtext('string')
h = gtext('string')
Mô tả
gtext sẽ hiển thị chuỗi văn bản tại vị trí chỉ định bằng chuột trên đồ thị
7.2: lệnh ginput
Nhập dữ liệu của các điểm bằng chuột
Cú pháp
[x,y] = ginput(n)
[x,y] = ginput
Description
x,y] = ginput(n) Cho phép bạn chọn n điểm bằng chuột và trả kết quả là toạ độ x và y của các điểm chọn cho các véc tơ x và y. Bnj có thể kết thúc việc chọn điểm ngay cả khi chưa nhập đủ n điểm bằng cách ấn Enter
x,y] = ginput Cho phép chọn số điểm không hạn chế.
IV. Các đồ thị dạng lưới và bề mặt
1. Các hàm tạo bề mặt
Matlab định nghĩa một bề mặt lưới bởi các toạ độ Z trên lưới của mặt xy. Dùng các đường thẳng để nối các điểm kề nhau. Hàm mesh và surf hiển thị các bề mặt ở dạng 3 chiều. Mesh cung cấp các bề mặt dạng khung dây trong đó chỉ thể hiện màu ở các đường nối. Surf hiển thị màu cả đường nối và bề mặt
2. Trực quan hoá các hàm hai biến
Để hiển thị hàm 2 biến z=f(x,y), hãy tạo các ma trận x và y chứa đựng các hàng và cột lặp. Sau đó sử dụng các ma trận này để tính ra đồ thị của hàm
Hàm meshgrid chuyển phạm vi được định nghĩa bằng một véc tơ hoặc hai véc tơ x, y thành các ma trận X, Y dùng để tính ra giá trị của hàm. Các hàng của X là các bản sao của véc tơ x, các cột của Y là copy của véc tơ y.
Cú pháp:
[X,Y] = meshgrid(x,y)
[X,Y] = meshgrid(x)
[X,Y,Z] = meshgrid(x,y,z)
Thí dụ:
Hàm
[X,Y] = meshgrid(1:3,10:14)
Tạo hai mảng x và y sau
X =
1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
Y =
10 10 10
11 11 11
12 12 12
13 13 13
14 14 14
Hàm Mesh
Cú pháp
mesh(X,Y,Z)
Ví dụ:
[X,Y] = meshgrid(-8:.5:8);
R = sqrt(X.^2 + Y.^2) + eps;
Z = sin(R)./R;
mesh(X,Y,Z)
Cho ra đồ thị như hình vẽ
Trong đó R là khoảng cách từ tâm, eps dùng để tránh việc chia cho 0 ở điểm 0,0
V. in ấn đồ thị
Tuỳ chọn Print của mênu FILE và lệnh print đều dùng để in đồ thị. Tuỳ chọn Print sẽ gọi ra hộp thoại cho phép người dùng chọn các tuỳ chọn về in ấn giống như ở cacs phần mềm khác, còn lệnh print cung cấp chúng ta các khả năng mềm dẻo hơn và cho phép điều khiển việc in đồ thị từ m. file. Kết quả có thể gửi trực tiếp ra máy in hoặc được xếp xắp trong một tệp xác định. Các định dạng đầu ra hết sức khác nhau được cung cấp ở đây (kể cả PostScript)
Thí dụ: câu lệnh sau đây ghi hình ảnh của màn hình đồ hoạ ra tệp Postscript cấp 2 có tên là magicsquare.eps:
print -depsc2 magicsquare.eps
Một điều hết sức quan trọng là cần phải biết trước khả năng của máy in trước khi dùng lệnh print. Ví dụ như tệp Postscript cấp 2 thường là gọn hơn và tô bóng nhanh hơn khi in so với tệp Postscript cấp 1. Tuy nhiên không phải tất cả các máy in đều có khả năng làm việc với tệp Postscript cấp 2.