chang_co_gi

By gianam_st

795 4 2

More

chang_co_gi

795 4 2
By gianam_st

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 linspacelogspace:

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

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.

Continue Reading

You'll Also Like

61.3K 1.7K 28
"Anh, em thật sự rất thích dáng vẻ anh khi nằm dưới thân em, biểu cảm vừa căm ghét lại vừa bất lực khuất nhục này của anh... Thật đẹp..." Xiềng xích...
297K 20.7K 98
WATTPAD: @_AnsBly_ _____ [Trọng Sinh] Tên cũ: Rời Xa Cố Chấp Giáo Thảo Tác giả: Sở chấp Editor: Bly Thể loại: Trọng sinh, trưởng thành, hoa quý vũ qu...
14K 1.3K 29
Hán Việt: Ngã tại ngược thụ văn lí ổn định phát phong [ tinh tế ] Tác giả: Hữu Hồ Thiên Tuế Thể loại: Nguyên sang, Đam mỹ, Hiện đại , Tương lai , HE...
560K 28.3K 136
Tên gốc: 偷风不偷月 Tác giả: Bắc Nam Nguyên tác: Tấn Giang Edit: Cấp Ngã Giang Sơn (Gin) Thể loại: hiện đại, HE, 1v1, xuyên không Tình trạng bản gốc: Toàn...