Giáo trình Các lệnh trong Matlab sau gồm 10 chương, bao gồm: chương 1 Matlab cơ bản, chương 2 ma trận, chương 3 hệ phương trình đại số tuyến tính, chương 4 nội suy và xấp xỉ hàm, chương 5 các phương trình phi tuyến, chương 6 đạo hàm và tích phân số, chương 7 các phương trình vi phân thường, chương 8 tối ưu hoá, chương 9 phương trình vi phân đạo hàm riêng, chương 10 các công cụ khác của Matlab.
Trang 1home Ctrl‐A về đầu dòng
end Ctrl‐E về cuối dòng
esc Ctrl‐U xoá dòng
Trang 22. Nhập xuất dữ liệu từ dòng lệnh: MATLAB không đòi hỏi phải khai báo
biến trước khi dùng. MATLAB phân biệt chữ hoa và chữ thường. Các số liệu đưa vào môi trường làm việc của MATLAB được lưu lại suốt phiên làm
Trang 8Để xác định kích thước của một ma trận ta dùng lệnh length(trả về kích thước lớn nhất) hay size(số hàng và cột). Ví dụ:
Trang 9d. Tạo ma trận bằng hàm có sẵn: MATLAB cung cấp một số hàm để tạo các ma trận cơ bản:
zeros tạo ra ma trận mà các phần tử đều là zeros
z = zeros(2, 4)
Trang 10rand(3, 3)
Trang 13Trang 15
với nhau ta dùng đặc tả nói rằng không có các đường nối giữa các điểm,
nghĩa là ta gọi hàm plot chỉ với đặc tả màu và điểm đánh dấu. Ta xét chương trình ct1_9.m như sau:
Trang 19bar(y)
b. Mô tả dữ liệu trên trục : Ta dùng các hàm xlabel và ylabel để mô tả các dữ liệu trên trục. Ta xét chương trình ct1_18.m:
Trang 20X = [19.3 22.1 51.6;
34.2 70.3 82.4;
61.4 82.9 90.8;
Trang 21plot(fft(eye(j + 16)))
Trang 23clabel tạo các nhãn sử dụng ma trận contour và hiển thị nhãn
contour hiển thị các đường đẳng mức tạo bởi một giá trị cho trước
của ma trận Z.
Trang 24contour3 hiển thị các mặt đẳng mức tạo bởi một giá trị cho trước của
ma trận Z.
contourf hiển thị đồ thị contour 2D và tô màu vùng giữa 2 các đường contourc hàm cấp thấp để tính ma trận contour
một phần tử mô tả một contour đơn ở một mức hàm contour sẽ coi nó là số lượng đường contour chứ không phải là mức contour. Nghĩa là, contour(z, v) cũng như contour(z, n). Để hiển thị một đường đẳng mức ta cần cho v là một
Trang 26số thì đối số thứ nhất sẽ mô tả thành phần x và đối số thứ ha mô tả thành phần y. Nếu ta chỉ dùng một đối số thì MATLAB xử lí nó như một số phức, phần thực là thành phần x và phần ảo là thành phần y.
cùng độ dài ta viết chương trình ct1_30.m:
theta = 90: –10: 0;
Trang 28d. Hàm quiver3 : Hàm quiver3 hiển thị các vec tơ có các thành phần
(u,v,w) tại điểm (x, y, z). Ví dụ ta biểu diễn quỹ đạo của một vật được ném đi theo t. Phương trình của chuyển động là:
2
attv)
Trang 30text_f = uicontrol(gcf, ʹStyleʹ, ʹTextʹ,
ʹStringʹ, ʹFahrenheit: ʹ,
ʹPositionʹ, [0.3 0.7 0.2 0.05],ʹHorizontalAlignmentʹ,ʹLeftʹ); edit_f = uicontrol(gcf, ʹStyleʹ, ʹEditʹ,
Trang 31b. Dùng lệnh edit và text để nhập xuất kí tự và số liệu: Trên đây ta đã dùng lệnh uicontrol để tạo và xác định vị trí hai khung hình. Đoạn lệnh sau
[0.6 0.3 0.1 0.05],ʹHorizontalAlignmentʹ,ʹLeftʹ);
c. Tự động cập nhật giá trị lên GUI: Để hoàn thiện ví dụ GUI ta thực hiện chương trình với nhiệm vụ tính quy đổi từ độ K sang độ C và tự động điền kết quả vào các ô bên cạnh chuỗi Celcius. Đoạn mã sau phục vụ mục
Trang 32Trong giao diện này, con trượt sẽ làm thay đổi giá trị nhiệt độ đua vào và nhiệt độ quy đổi tính theo độ C cũng sẽ thay đổi tương ứng. Các lệnh tạo ra
edit_f = uicontrol(gcf, ʹStyleʹ, ʹEditʹ,
ʹStringʹ, ʹ168.0ʹ.,,,
Trang 33f = get(edit_f,ʹStringʹ);
f = str2num(f);
set(slider_f,ʹValueʹ,f);
Trang 38Cuối cùng ta xét phương án dùng listbox. Giao diện cần tạo như sau:
Trang 39Trang 40
a. Tạo GUI bằng công cụ đồ hoạ: Trên đây ta đã xem xét cách tạo GUI bằng phương pháp thủ công. Ta có thể tạo GUI bằng công cụ đồ hoạ. Khi nhập lệnh guide ta gọi trình đồ hoạ (Graphics User Interface Development Environment) để soạn thảo layout. Kết quả đầu tiên là ta có một layout rỗng như sau:
cụ Alignment. Với mỗi phần tử ta cấn xác định thuộc tính cho nó bằng cách bấm đúp vào phần tử hay bấm vào công cụ soạn thảo thộc tính
Sau khi thiết kế xong ta lưu nó lại. Lúc này MATLAB tự động tạo ra file
*.fig dùng lưu giao diện vừa tạo và file *.m chưa các mã lệnh cần thực hiện. Việc cuối cùng là viết các mã lệnh vào file *.m. Trong quá trình thiết kế ta có thể chạy thử xem sau mỗi bước thiết kế đã đạt yêu cầu chưa bằng cách bấm vào ô chạy thử
Soạn menu
Trang 41và cũng dùng Font chữ mắc định, cỡ chữ 12 và bold. Tiếp theo kéo Pushbutton vào layout và soạn thảo thuộc tính cho nó với Font chữ mặc định,
cỡ chứ 12, bold. Trong thuôc tính String ghi chuỗi ʺ Bam chuotʺ; ghi và Tag chuỗi ʺpushbuttonmotʺ. Như vậy là ta đã thiết kế xong. Bây giờ ta lưu lại với
tên là ct1_52.fig và ct1_52.m.
Nhiệm vụ tiếp theo là ghi các lệnh cần thiết vào file ct1_52.m. File này
đã được MATLAB tự động tạo ra. Ta phải thêm vào đó các mã lệnh để khi bấm chuột thì số lần bấm được thể hiện trên ô Edit Text. Ta sẽ ghi các mã lệnh này vào phần:
Trang 42handles = guihandles(fig);
guidata(fig, handles);
if nargout > 0 varargout{1} = fig;
end elseif
Trang 43Edit Text thứ hai có các thuộc tính FontName: Arial, FontSize: demi, FơntWeight: demi, String: để trống, Tag: edithai còn các thuộc tính khác là mặc định.
Edit Text thứ ba có các thuộc tính FontName: Arial, FontSize: demi, FơntWeight: demi, String: Celcius, Tag: editba còn các thuộc tính khác là mặc định.
Edit Text thứ tư có các thuộc tính FontName: Arial, FontSize: demi, FơntWeight: demi, String: để trống, Tag: editbon còn các thuộc tính khác là mặc định.
Sau khi thiết kế xong, lưu nó với tên ct3_18.fig. MATLAB tạo thêm ct1_53.m. Bây giờ ta cần viết mã cho nó. Nhiệm vụ của đoạn mã là khi ta nhập nhiệt độ Fahrenheit vào ô Edit text thứ hai thì trong ô Edit Text thứ 4 phải
Trang 44
Edit Text thứ 2 có thuộc tính FontSize: 12, FơntWeight: bold, String: để trống.
Edit Text thứ 3 có thuộc tính FontSize: 12, FơntWeight: bold, String: Celcius.
Trang 45Edit Text thứ 4 có thuộc tính FontSize: 12, FơntWeight: bold, String:
để
trống. (Các thuộc tính mà ta không nhắc đến có nghĩa là chấp nhận giá trị mặc định).
Trang 46Rankine. Để có thể chọn lựa ta dùng một trong các phương án: Popupmenu, Rdiobutton, Listbox hay Checkbox. Giao diện khi dùng Popupmenu như sau:
Popupmenu có thuộc tính FontSize: 12, FontWeight: bold. Để ghi vào thuộc tính String ta bấm đúp chuột vào icon của nó và viết 3 dòng: Kelvine, Celcius và Rankine.
File được lưu với tên ct1_55.fig. Vấn đề còn lại là viết mã trong file ct1_55.m. Mã cần thực hiện nhận giá trị từ Slider, xem Popupmenu nào được
Trang 47Kelvine, Celcius và Rankine. Giao diện như sau:
Trang 53
Ta dùng m t Axes, b n Pushbutton t o nên giao di n n y Khi nh n Plot,
th c a h m y = tsin(t) c v Khi nh n Grid on, th c chia l i Khi
nh n Grod off, l i b xoá Nh n Close óng th
Layout có thu c tính Name: ct1_59, HandleVisibility: callback
Các Pushbutton đều có thuộc tính FontSize: 12, FơntWeight: bold và các
String là các tên lệnh. GUI được lưu với tên file là ct1_59.fig. Tiếp theo ta soạn thảo lệnh cho ct1_59.m:
disp(lasterr);
end
function varargout = pushbutton1_Callback(h, eventdata, handles, varargin) grid on
function varargout = pushbutton2_Callback(h, eventdata, handles, varargin) grid off
Trang 54function varargout = pushbutton3_Callback(h, eventdata, handles, varargin) close
function varargout = pushbutton4_Callback(h, eventdata, handles, varargin)
t = 0:0.01:20;
y = t.*sin(t);
plot(t,y);
Ti p theo ta xét m t GUI có giao di n nh sau:
Nhi m v c a GUI l v th c a h m peaks theo các d ng khác nhau( mesh, surf v contour) v i các Colormap khác nhau(hsv, hot, gray, prism, cool, winter v summer) Vi c v các d ng th th c hi n nh các Pushbutton Vi c ch n Colormap th c hi n nh Listbox
Layout có thu c tính Name: ct1_60 v thu c tính HandleVisbility: on Các
Pushbutton u có thu c tính FontSize: 12 v F ntWeight: bold Ta l u GUI v i tên
Trang 581 j 1 j
2 2U
j 1
=
=∑
Trang 59‐
j 3
Trang 61từ [A] bằng cách bỏ đi cột và hàng đầu tiên. Ma trận [H] cấp (n ‐1) được xây dựng theo các công thức (1) ÷ (3). Do (4) ta thấy phép biến đổi này làm cột đầu tiên của [A] trở thành:
11
11
aka
0
H H
0
[ ] [ ]= ⎢⎡[ ] [ ] [ ] ⎤⎥
T 2
2
E 0P
0 H (7) với [E2] là ma trận đơn vị 2×2 và [H] là ma trận (n ‐ 2)×(n ‐ 2) có được bằng cách chọn [X] từ (n ‐ 2) phần tử phía dưới của cột thứ 2 của ma trận [A]. Thực hiện (n ‐ 2) phép biến đổi:
[ ] [ ]= ⎢⎡[ ] [ ] [ ] ⎤⎥
T i
i
E 0P
00
[Q]
Trang 622 ‐ Tính [ ] [ ]′ [ ]
= A UV
Q ‐ Tính =[ ] [ ]T
g
2Q
Trang 63‐ Tính [W] = [V] ‐ g[U]
‐ Tính [ ] [ ]= ′ −[ ][ ] [ ][ ]T − T
A A W U U W ‐ Đặt ai ,i 1+ =ai 1,i+ = −k
Trang 64Để tính ma trận ba đường chéo theo phép biến đổi Householder ta dùng
β
U U
Trang 66[A] = [L] [R]
Việc phân tích này, nếu tồn tại, là không duy nhất.
Nếu ma trận [L] có các phần tử nằm trên đường chéo chính bằng 1, ta có phép phân tích Doolittle.
Trang 681 k ki jk ji
ji
r
rla
Trang 72sin cos Nếu ta muốn quay vec tơ [x1 x2]T và muốn làm cho x2 bằng zero rồi quaytheo chiều kim đồng hồ một góc θ(hay ngược chiều kim đồng hồ một góc ‐θ) trong đó:
Trang 73θ = 2
1
xarctg
x thì ma trận quay để thực hiện phép quay này theo chiều kim đồng hồ một góc
sin cos Trong đó:
Trang 74a a Như vậy ta sẽ có:
Trang 77[L, U] = eigjacobi(a)
§11. PHÂN TÍCH LQ Cho ma trận [A]T, ta có thể phân tích QR ma trận này thành:
Trang 782 Dạng Jordan: Khi không thể tìm được n giá trị riêng phân biệt, nghĩa là ma
trận [A] không có n vec tơ riêng độc lập tuyến tính thì ma trận [A] không thể đường chéo hoá. Tuy nhiên, nếu có phép biến đổi đồng dạng [M] biến đổi [A] thành [J]:
i i
J
10
Trang 79‐ Cuối cùng do kích thước của không gian không của [A] là n ‐ r và p của các vec tơ là trong cả không gian không lẫn không gian cột nên có n ‐ r ‐ p vec tơ [zi] ở trong không gian không mà không ở trong không gian cột.
Các vec tơ [xi], [yi] và [zi] tìm được là độc lập tuyến tính. Chúng tạo nên các cột của [M] và [J] = [M][A][M]‐1 là dạng Jordan.
Trang 85[Anp] = [Unn][Snp][Vpp]
Trong đó:
Trang 87và các cột của [T] là các vec tơ riêng của [A]. Phân tích Schur khi này được gọi
là phân tích phổ. Nếu [A] xác định dương, phân tích Schur chính là phân tích SVD.
Trang 89- nếu nhân tất cả các phần tử của một hàng (hay cột) với k thì định thức được nhân với k
- định thức không đổi nếu ta cộng thêm vào một hàng tổ hợp tuyến tính của các hàng còn lại.
- nếu đổi chỗ hai hàng cho nhau thì định thức đổi dấu
Trước khi đi đến định nghĩa về định thức ta tìm hiểu khái niệm về hoán
vị và phép thế.
Cho một dãy số, nếu ta đổi chỗ các số trong dãy cho nhau thì ta đã thực hiện một phép hoán vị. Ví dụ 123, 132, là các hoán vị của dãy số {1, 2, 3}. Trong hoán vị α1α2…αi…αj…αn ta nói αi làm một nghịch thế với αj nếu i < j
mà αi > αj. Ví dụ trong hoán vị 1432 số 4 làm với số 3 một nghịch thế , số 4 làm với số 2 một nghịch thế, số 3 làm với số 2 một nghịch thế. Một hoán vị gọi
là chẵn nếu tổng số nghịch thế trong hoán vị đó là một số chẵn; một hoán vị gọi là lẻ trong trường hợp ngược lại. Như vậy 1432 là một hoán vị lẻ.
Cho một dãy số, nếu ta tạo ra một dãy số mới bằng cách đổi chỗ các phần tử cho nhau thì ta đã thực hiện một phép thế.
Một phép thế gọi là chẵn nếu tính chẵn lẻ của dòng trên và dòng dưới như nhau và lẻ trong trường hợp ngược lại. Phép thế trên là phép thể lẻ.
Trang 90Cho ma trận vuông [A] cấp n. Các phần tử của hàng thứ i là ai,1,
ai,2,…,ai,n. Các phần tử của cột thứ j là a1,j, a2,j ,…, an,j. Ta xem hàng thứ i là một vec tơ, kí hiệu là Ai* và cột thứ j cũng là một vec tơ, kí hiệu là A*j. Với mỗi phép thế:
Trang 92b b b b
0 b b bB
Trang 93det B[ ]=b b b b11 22 33 44
nghĩa là đối với ma trận tam giác, định thức bằng tích các phần tử trên đường chéo chính.
Khi phân tích ma trận [A] theo thuật toán Doolitte, ta dùng chương trình ctdoodecmp.m để tính định thức của nó:
Trang 95Ta chú ý đến hàng thứ i và aij là một phần tử của hàng đó. Trong det[A] ta gộp những số hạng chứa aij lại và đặt aij làm thừa số chung, hệ số của nó kí hiệu là Aij và gọi là phần bù đại số (cofactor) của phần tử aij. Cofactor Aij của
Trang 96Bước đầu tiên ta xây dựng ma trận cấp (n ‐ 1)×(n ‐ 1) từ các định thức của các ma trận con 2×2. Ví dụ với ma trận
Trang 97Ta xây dựng hàm dodgson() để thực hiện thuật toán trên:
Trang 98det A Trong đó:
Trang 99( )−1
i ,j
a là phần tử ở hàng i, cột j của ma trận [A]‐1
Ai,j là phần bù đại số của phần tử ai,j của ma trận [A]
Ta xây dựng hàm minorinv() để thực hiện thuật toán trên:
Trang 100[A][R]‐1[L]‐1 = [E]
Kết quả là:
[R]‐1[L]‐1 = [R]‐1
Với ma trận tam giác phải [R], các hàng khi nghịch đảo là l1, ,ln được tính theo cách sau:
‐ Cho [e1], , [ei], ,[en] là các cột của ma trận đơn vị [E] cấp n
‐ =[ ]n
n
n ,n
el
a ‐ i =( [ ]i − i ,i 1 i 1+ + −L i ,n n)
Trang 1010010
0001
Như vậy, vấn đề là ta cần tìm ma trận [A]‐1. Phương pháp loại trừ để nhận được ma trận nghịch đảo [A]‐1 được thực hiện qua n giai đoạn, mỗi một giai đoạn gồm hai bước. Đối với giai đoạn thứ k:
‐ chuẩn hoá phần tử akk bằng cách nhân hàng với nghịch đảo của nó
‐ làm cho bằng không các phần tử phía trên và phía dưới đường chéo cho đến cột thứ k. Khi k = n thì [A](k) sẽ trở thành ma trận đơn vị và [E] trở thành [A]‐1
Ta xây dựng một hàm nghịch đảo invmat():
function x = invmat(a)
% Nghich dao ma tran a
Trang 102ra năm 1955. Ma trận Moore – Pensore [B] thoả mãn các điều kiện:
Trang 105về dạng dễ giải hơn. Giả sử ta có cách nào đó để tìm ma trận [P] mà nó đường chéo hoá ma trận [A], lúc đó (3) có dạng:
Trang 112Ta xây dựng hàm evalbrackets() để vây các giá trị riêng nhỏ nhất của ma trận
ba đường chéo. Nó cho dãy r1, r2, ,rm+1 trong đó mỗi đoạn [ri, ri+1] chứa một giá trị riêng. Thuật toán trước hết tìm biên toàn cục của các giá trị riêng theo định lí Gerschorin. Phương pháp chia đôi kết hợp với dãy đặc tính của dãy Sturm được dùng để xác định biên trên λm, λm‐1, , λ1
function r = evalbrackets(c, d, m)
% Nhom m gia tri rieng min cua ma tran A = [c\d\c]
Trang 116[ ]X0 =c X1[ ]1 +c X2[ ]2 +L+c X n[ ]n (2)
Nhân cả hai vế của (2) với chuyển vị [ ]T
1
X ta có:
Trang 117function [t, s, iter] = sweeping(A)
%function t = sweeping(A)
%Tinh tat ca cac gia tri rieng va vec to rieng cua ma tran A doi xung
Trang 118[ ] [ ][ ] [ ] [ ][ ] [ ]T = − 1 = λ
V A V V A V (1)
Để hiểu phương pháp Jacobi, trước hết ta định nghĩa ma trận quay pq:
Trang 120
+ 2 θ
1cos 2
1 tg 2 sin2θ = tg2θcos2θ (9)
Để cho ma trận gần ma trận đường chéo sau mỗi lần lặp, ta coi chỉ số hàng và cột của phần tử lớn nhất nằm ngoài đường chéo là p và q và làm cho nó bằng zero.
Ta xây dựng hàm eigjacobi() để tính các giá trị riêng λi và các vec tơ riêng của một ma trận đối xứng cấp n bằng phương pháp Jacobi.
Trang 123ba đường chéo hay ma trận Hessenberg. Ta xây dựng hàm qreig() để thực
Trang 124Sau đó ta xây dựng ma trận:
Trang 129Thay thế ngược ta có được các nghiệm xn‐1, xn‐2, , x1 và α(λ).
Theo quy tắc Cramer ta có:
Trang 130[ ] [ ]
1,1 2,1
n 1,n 1
n ,n 1 n
Trang 131để tạo ra dãy các vec tơ trực giao [q1], , [qn] gọi là các vec tơ Arnoldi. Thuật toán cụ thể gồm các bước:
- Cho vec tơ bất kì [q1] có [ ]q1 = 1
- Lặp từ k = 2,3,
Trang 135CHƯƠNG 3: HỆ PHƯƠNG TRÌNH ĐẠI SỐ TUYẾN TÍNH
n
bbbb
1 2
n
xxxx
Trang 136[ ] [ ] [ ]x = x + + x − (2)
Trong đó một ma trận là ma trận không gian hàng của ma trận [A] và được viết dưới dạng tổ hợp của: