Để xây dựng thuật toán giải bài toán mạch này, ta chuyển phương trình mạch sang số phức, khi đó hệ phương trình vi phân mô tả mạch sẽ trở thành hệ phương trình đại số và dễ dàng giải được bằng bất kỳ ngôn ngữ lập trình nào như Pascal, C... Xét mạch điện tổng quát gồm m nhánh, n nút. Ta sẽ lập được hệ gồm m phương trình vi phân như sau:
Trang 1CHƯƠNG 1: MATLAB CƠ BẢN 1.1 CÁC TỐN TỬ CƠ BẢN CỦA MATLAB
1 Các tốn tử cơ bản:
Các toán tử số học (Arithmetic Operators):
Toán
+ Cộng ma trận hoặc đại lượng vô hướng (các ma trận
phải có cùng kích thước).
- Trừ ma trận hoặc đại lượng vô hướng (các ma trận phải có cùng kích thước).
* Nhân ma trận hoặc đại lượng vô hướng (ma trận 1
phải có số cột bằng số hàng của ma trận 2).
.* Nhân từng phần tử của 2 ma trận hoặc 2 đại lượng
vô hướng (các ma trận phải có cùng kích thước).
\ Thực hiện chia ngược ma trận hoặc các đại lượng vô hướng (A\B tương đương với inv (A)*B)
.\ Thực hiện chia ngược từng phần tử của 2 ma trận
hoặc 2 đại lượng vô hướng (các ma trận phải có cùng kích thước).
/ Thực hiện chia thuận 2 ma trận hoặc đại lượng vô hướng (A/B tương đương với A*inv(B)).
./ Thực hiện chia thuận từng phần tử của ma trận này
cho ma trận kia (các ma trận phải có cùng kích thước)
^ Lũy thừa ma trận hoặc các đại lượng vô hướng.
Trang 2^ Lũy thừa từng phần tử ma trận hoặc đại lượng vô
hướng (các ma trận phải có cùng kích thước).
* ví dụ:
1
x 2
3
4
y 5
6
x’ 1 2 3 y’ 4 5 6
5
x + y 6
7
-3
x – y -3
-3
3
x + 2 4
5
-3
x – 2 -3
-3
x * y phép toán sai 4
x * y 10
18
x’* y 32 x’.* y phép toán sai 4 5 6
x * y’ 8 10 12 12 15 18
x * y’ phép toán sai 2
x * 2 4
6
2
x.* 2 4
6
x \ y 16/7 4
x.\ y 5/2 2
1/2 2 \ x 1
3/2 2
2./ x 1
2/3 0 0 1/6 x / y 0 0 1/3 0 0 1/2 1/4 x./ y 2/5 1/2
1/2 x / 2 1
1/2 x./ 2 1
Trang 33/2 3/2
x ^ y phép toán
sai
1/2 x.^ y 32 729
x ^ 2 phép toán
sai
1 x.^ 2 4 9
2 ^ x phép toán
sai
2 2.^ x 4 8
Toán tử quan hệ (Relational Operators):
Toán
< So sánh nhỏ hơn.
> So sánh lớn hơn.
>= So sánh lớn hơn hoặc bằng.
<= So sánh nhỏ hơn hoặc bằng.
= = So sánh bằng nhau cả phần thực
và phần ảo.
-= So sánh bằng nhau phần ảo.
a) Giải thích:
Các toán tử quan hệ thực hiện so sánh từng thành phần của 2
ma trận Chúng tạo ra một ma trận có cùng kích thước với 2 ma trận
so sánh với các phần tử là 1 nếu phép so sánh là đúng
và là 0 nếu phép so sánh là sai.
Phép so sánh có chế độ ưu tiên sau phép toán số học nhưng trên phép toán logic.
b) Ví dụ:
thực hiện phép so sánh sau:
» x=5 % đầu tiên ta nhập x=5
x =
5
» x>=[1 2 3;4 5 6;7 8 9] %so sánh trực tiếp x (x là 5) với ma trận
ans = % rõ ràng các phầ tử 1,2,3,4,5 đều <= 5
Trang 4» x==A % so sánh x và A
ans = % tất cả các phần tử đều đúng
Trang 54 Ký tự đặc biệt (Special Characters):
Ký
[] Khai báo vector hoặc ma trận.
() Thực hiện phép toán ưu tiên, khai báo các
biến và các chỉ số của vector
= Thực hiện phép gán.
‘ Chuyển vị ma trận tìm lượng liên hiệp của
số phức.
Điểm chấm thập phân.
, Phân biệt các phần tử của ma trận và
các đối số trong dòng lệnh.
; Ngăn cách giữa các hàng khi khai báo ma
trận.
% Thông báo dòng chú thích.
! Mở cửa sổ MS – DOS.
j : i : k Tạo ra chuỗi j, j+i, j+2I,….,k-i, k
A(: , j) Chỉ cột thứ j của ma trận A
A(i , :) Chỉ hàng thứ i của ma trận
Trang 6A(: , :) Chỉ toàn bộ ma trận A
A(j , k) Chỉ phần tử A(j), A(j+1)…A(k)
A(: , j ,
k) Chỉ các phần tử A(:, j), A(:, j+1)…A(:, k)
A(:) Chỉ tất cả các thành phần
của ma trận A c) Ví dụ:
khi khai báo D = 1 : 10
ta được kết quả:
D = 1 2 3 4 5 6 7 8 9 10 còn khi khai báo D = 0 : 2 :10
thì ta được kết quả:
D = 0 2 4 6 8 10
2 Nhập xuất dữ liệu từ dịng lệnh:
Khi nhập ma trận từ bàn phím ta phải tuân theo các quy định sau :
• ngăn cách các phần tử của ma trận bằng dấu “,” hay dấu trống
Trang 74 Nhập xuất dữ liệu từ bàn phím: Lệnh input cho phép ta nhập số liệu từ
bàn phím Ví dụ:
x = input(’Nhap x: ’)
Lệnh format cho phép xác định dạng thức của dữ liệu Ví dụ:
format rat % so huu ti
format long % so sẽ có 14 chu so sau dau phay
format long e % so dang mu
format hex % so dang hex
format short e %so dang mu ngan
format short %tro ve so dang ngan (default)
Ta cũng có thể dùng disp và fprintf để hiển thị các biến Ví dụ:
disp(‘Tri so cua x = ‘), disp(x)
Ta viết chương trình ct1_2.m như sau
Trang 8fprintf(fid, ‘%5.2f(do Fahrenheit) la %5.2f(do C).\n’, f, c);
Trang 9Cho một hàm toán học một biến, ta có thể dùng lệnh fminbnd của MATLAB để tìm cực tiểu
địa phương của hàm trong khoảng đã cho Ví dụ:
f = inline(‘1./((x ‐ 0.3).^2+0.01) + 1./((x ‐ 0.9).^2 + 0.04) ‐ 6 ‘);
x = fminbnd(f, 0.3, 1)
Lệnh fminsearch tương tự hàm fminbnd dùng để tìm cực tiểu địa phương của hàm nhiều biến.
Ta có hàm 3 biến lưu trong file three_var.m như sau:
Trang 10v = [‐0.6 ‐1.2 0.135];
a = fminsearch(‘three_var’, v)
6 Các phép toán trên ma trận và vec tơ:
a Khái niệm chung: Giả sử ta tạo ra các ma trận a và b bằng các lệnh:
b Chỉ số: Phần tử ở hàng i cột j của ma trận m×n có kí hiệu là A(i, j).
Tuy nhiên ta cũng có thể tham chiếu tới phần tử của mảng nhờ một chỉ số, ví dụ A(k) với k = i+ (j ‐ 1)m Cách này thường dùng để tham chiếu vec tơ hang hay cột Trong trường hợp ma trận đầy đủ thì nó được xem là ma trận một cột dài tạo từ các cột của ma trận ban đầu Như vậy viết A(5) có nghĩa là tham chiếu phần tử A(2, 2)
Để 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 13Tạo vector a gồm có 4 phần tử, với các giá trị là:1, 3, 7, 4
c: tích số của a,b
Cách khai báo: sắp xếp biến theo thứ tự giảm dần của lũy thừa
Trang 14x: biến chứa kết quả.
fuction: tên hàm số.
x1, x2: khoảng khảo sát
fun: tên hàm số.
xmin, xmax: xác định khoảng cần vẽ.
Trang 15fun: tên hàm số.
c) Ví dụ:
Trước tiên ta khai báo hàm số f trong tập tin f.m: (xem thêm lệnh function) function y = f(x);
Trang 16m: biến chứa kết qủa.
a: tên vector hay ma trận cần tính giá trị trung bình.
Nếu a là ma trận thì tính giá trị trung bình của mỗi cột d) Ví dụ:
Trang 17x,y,v: tên vector.
m: là giá trị lớn nhất.
Trang 18s: là biến chứa kết quả.
x: là tên ma trận.
Nếu x là ma trận thì s là tổng của các cột.
disp(‘Tuoi toi trong khoang 0 ‐ 30’);
gu = input(‘Xin nhap tuoi cua ban: ‘);
Trang 19d for: vòng lặp for dùng khi biết trước số lần lặp Cú pháp như sau:
for <chỉ số> = <giá trị đầu> : <mức tăng> : <giá trị cuối>
Ta xây dựng chương trình đoán số ct1_6.m:
disp([‘Ban co quyen du doan ‘, num, ‘ lan’]);
disp(‘So can doan nam trong khoang 0 ‐ 100’);
Trang 20gu = input(‘Nhap so ma ban doan: ‘);
e break: phát biểu break để kết thúc vịng lặp for hay while mà khơng quan tâm đến điều kiện
kết thúc vịng lặp đã thoả mãn hay chưa
1.2 ĐỒ HOẠ TRONG MATLAB
1 Các lệnh vẽ: MATLAB cung cấp một loạt hàm để vẽ biểu diễn các vec tơ số liệu cũng như
giải thích và in các đường cong này
plot đồ họa 2‐D với số liệu 2 trục vơ hướng và tuyến tính
plot3 đồ họa 3‐D với số liệu 2 trục vơ hướng và tuyến tính
polar đồ hoạ trong hệ toạ độ cực
loglog đồ hoạ với các trục logarit
semilogx đồ hoạ với trục x logarit và trục y tuyến tính
semilogy đồ hoạ với trục y logarit và trục x tuyến tính
plotyy đồ hoạ với trục y cĩ nhãn ở bên trái và bên phải
x,y: vẽ giá trị x theo giá trị y.
linetype: kiểu phần tử tạo nên nét vẽ bao gồm 3 thành phần:
- Thành phần thứ nhất là các ký tự chỉ màu sắc:
Màu
Trang 21- Thành phần thứ hai là các ký tự chỉ nét vẽ của đồ thị:
- Thành phần thứ ba là các ký tự chỉ loại điểm đánh dấu gồm:., o,
x, +, *
d) Ví dụ:
Vẽ đồ thị hàm y = sin(x) với đồ thị màu lam, đường liền nét và
bước thay đổi là π /8
Trang 225 Ghi nhãn lên các trục toạ độ: MATLAB cung cấp các lệnh ghi nhãn lên đồ hoạ gồm :
title thêm nhãn vào đồ hoạ
xlabel thêm nhãn vào trục x
ylabel thêm nhãn vào trục y
zlabel thêm nhãn vào trục z
legend thêm chú giải vào đồ thị
text hiển thị chuỗi văn bản ở vị trí nhất định
gtext đặt văn bản lên đồ hoạ nhờ chuột
\bf bold font
\it italics font
\sl oblique font (chữ nghiêng)
\rm normal font
Các kí tự đặc biệt xem trong String properties của Help.
Ta dùng các lệnh xlabel , ylabel , zlabel để thêm nhãn vào các trục toạ độ Ta có thể thêm văn
bản vào bất kì chỗ nào trên hình vẽ nhờ hàm text Ta có
chương trình ct1_15.m:
x = ‐pi: 1: pi;
Trang 23y = sin(x);
plot(x, y)
xlabel(‘t = 0 to 2\pi’, ‘Fontsize’, 16)
ylabel(‘sin(t)’, ‘Fontsize’, 16)
title(‘\it{Gia tri cua sin tu zero đến 2 pi}’, ‘Fontsize’, 16)
text(3*pi/4, sin(3*pi/4),’\leftarrowsin(t ) = 0.707’, ‘FontSize’, 12)
Trang 24CHƯƠNG 2: HỆ PHƯƠNG TRÌNH ĐẠI SỐ TUYẾN TÍNH 1.1 KHÁI NIỆM CHUNG
1.2 NGHIỆM CỦA HỆ PHƯƠNG TRÌNH ĐẠI SỐ TUYẾN TÍNH
1 Trường hợp không suy biến: Khi số phương trình m bằng số ẩn số n, ma trận [A] vuông
và ta có:
[x] = [A] -1 [b] (1)
nếu ma trận A không suy biến, nghĩa là định thức của ma trận khác không
Các lệnh MATLAB để giải hệ là (ctsys.m):
Trang 251.3 GIẢI HỆ PHƯƠNG TRÌNH BẰNG CÁCH PHÂN TÍCH MA TRẬN
1.Để giải hệ phương trình bằng cách phân tích ma trận theo thuật toán Doolittle ta dùng hàm
Trang 26function x = jacobi(a, b, x0, kmax)
%Tim nghiem cua pt Ax = B bang thuat toan Jacobi.
%Cu phap: x = jacobi(a, b, x0, kmax)
% hay jacobi(a, b, x0, kmax)
if nargin < 4
tol = 1e‐6;
kmax = 100; % jacobi(a, b, x0)
elseif kmax < 1
tol = max(kmax, 1e‐16);
kmax = 100; %jacobi(a, b, x0, tol)
Trang 28function x = gausseidel(a, b, x0, kmax)
%Tim nghiem cua he AX = B bang cach lap Gauss–Seidel.
Trang 30CHƯƠNG 3: NỘI SUY VÀ XẤP XỈ HÀM
1 NỘI SUY LAGRANGE
Trang 31function [l, L] = lagrange(x, y)
%Dua vao : x = [x0 x1 xn], y = [y0 y1 yn]
%ket qua: l = He so cua da thuc Lagrange bac n
Trang 32và tìm y(2.5) ta dùng chương trình ctlagrange.m:
Trang 34Ta xây dựng hàm newton() để nội suy:
Trang 35Ta dùng chương trình ctnewton.m để nội suy:
Trang 36CHƯƠNG 4: ĐẠO HÀM VÀ TÍCH PHÂN SỐ
1 TÍNH ĐẠO HÀM BẬC NHẤT BẰNG PHƯƠNG PHÁP ROMBERG
Đạo hàm theo phương pháp Romberg là một phương pháp ngoại suy để xác định đạo hàm với một độ chính xác cao Ta xét khai triển Taylor của hàm f(x) tại (x + h) và (x ‐ h):
Trang 37Ta xây dựng hàm diffromberg() để thực hiên thuật toán trên:
function df = diffromberg(f, x, h, maxiter, tol)
%Tinh dao ham bang phuong phap Romberg
Trang 40Ta xây dựng hàm diffn() để tính đạo hàm tới bậc 5:
c = difapx(i,[‐i i]); %he so cua dao ham
dix = c*feval(f,xo + [‐i:i]*h)’;
T(i+1) = dix/tmp; %dao ham
c = difapx(i,[‐i i]); %he so cua dao ham
dix = c*feval(f,xo + [‐i:i]*h)’; %/h^i; %dao ham
T(i+1) = dix/tmp; %he so cua chuoi Taylor
Trang 413 TÍNH ĐẠO HÀM BẰNG PHƯƠNG PHÁP NỘI SUY
Giả sử ta có hàm cho dưới dạng bảng:
Để tìm đạo hàm của hàm tại một điểm nào đó ta sẽ nội suy hàm rồi sau đó
tính đạo hàm của hàm tại điểm đã cho Ta xây dựng hàm diffinterp() để thực
hiện công việc trên
function df = diffinterp(x, y, n, x0)
%Tinh dao ham cap 1 hai 2 bang phuogphap noi suy
px = lagrange(x, y); % Tim da thuc noi suy Lagrange (x, y)
fprintf(‘Dao ham cap %d la: %f\n’,n, df);
Để tính đạo hàm ta dùng chương trình ctdiffinterp.m:
Trang 43Ta xây dựng hàm trapezoid() để thực hiện thuật toán trên.
function J = trapezoid(f, a, b, maxiter, tol)
% Quy tac hinh thang lap.
h = (b ‐ a)/n ; % khoang chia moi
x = a + h/2.0; % toa do diem moi thu nhat
Trang 44Để tính tích phân ta dùng chương trình cttrapezoid.m
J = trapezoid(f, a, b, maxiter, tol)
Ta xây dựng hàm simpson() để thực hiện thuật toán trên
function s = simpson(f, a, b, n)
%n so khoang chia
%neu f chua trong mot file dung ki hieu @ de goi
Trang 46CHƯƠNG 5: CÁC PHƯƠNG TRÌNH VI PHÂN THƯỜNG
1 BÀI TOÁN CAUCHY
Trang 472 PHƯƠNG PHÁP EULER
function [X, Y] = euler(fxy, xo, xf, yo, n)
% %Giai phuong trinh y’(x) = f(x,y(x)) hay y’ = f(x)
if n < 2
Trang 48dy(1) = y(2) * y(3);
dy(2) = ‐y(1) * y(3);
dy(3) = ‐0.51 * y(1) * y(2);
Để giải phương trình cho bởi hàm f1(x, y) ta dùng chương trình cteuler.m:
Trang 493 PHƯƠNG PHÁP HEUN
Ta xây dựng hàm heun() để thực hiện thuật toán trên:
function [X, Y] = heun(fxy, xo, xf, yo, n)
%Giai phuong trinh y’(x) = f(x,y(x)) hay y’ = f(x)
%dung thuat toan Heun voi n buoc tinh
Trang 514 PHƯƠNG PHÁP RUNGE ‐ KUTTA
Trang 52Ta xây dựng hàm rungekutta() để thực hiện công thức Runge ‐ Kutta bậc 4:
function [x, y] = rungekutta(f, a, b, y0, n)
%Phuong phap Runge‐Kutta de giai phuong trinh y’(x) = f(x,y(x)) hay y’ =
Trang 545 PHƯƠNG PHÁP RUNGE ‐ KUTTA THÍCH NGHI
Trang 55Ta xây dựng hàm adaptrk() để thực hiện thuật toán này:
function [xsol, ysol] = adaptrk(f, xo, x1, y, n)
% Tich phan Runge‐Kutta bac 5 dung giap phuong trinh y’ = f(x, y) hay y’ =
%f(x).
% xo, x1 ‐ doan tim nghiem.
% y gia tri dau, n dung tim h ban dau
h = (x1 ‐ xo)/n;
if size(y, 1) > 1 ;
Trang 56y = y’; % y phai la vec to hang
Trang 57% tinh su thay doi cua y theo (3) & (4)
% neu sai so dat den gia tri cho phep, chap nhan ket qua
% kiem tr dieu kien ket thuc
Trang 58%y = @f4;
[u, v] = adaptrk(y, a, b, ya, n)
plot(u, v)
6 PHƯƠNG PHÁP CHUỖI TAYLOR
function [xout, yout] = taylor(deriv, x, y, x1, h)
% Tich phan chuoi Taylor bac 4.
% x, y = cac gia tri dau; i la vec to hang.
% x1 = gia tri cuoi cua x
Trang 60CHƯƠNG 6: PHƯƠNG TRÌNH VI PHÂN ĐẠO HÀM RIÊNG
1 KHÁI NIỆM CHUNG
Phương trình vi phân đạo hàm riêng(PDE) là một lớp các phương trình vi phân có số biến độc lập lớn hơn 1 Trong chương này ta sẽ khảo sát các phương trình vi phân đạo hàm riêng cấp 2 với hai biến độc lập x và y, có dạng tổng quát:
2 PHƯƠNG TRÌNH ELLIPTIC
Trang 62function [u, x, y] = poisson(f, g, bx0, bxf, by0, byf, D, Mx, My, tol, maxiter)
% giai a(u_xx + u_yy + g(x,y)u = f(x,y)
% tren mien D = [x0, xf, y0, yf] = {(x,y) |x0 <= x <= xf, y0 <= y <= yf}
% voi dieu kien bien:
% u(x0,y) = bx0(y), u(xf,y) = bxf(y)
% u(x,y0) = by0(x), u(x,yf) = byf(x)
% Mx ‐ so doan con tren truc x
% My ‐ so doan con tren truc y
% tol : sai so cho phep
% maxiter: so lan lap
Trang 63byf = inline(‘exp(4)*cos(x) ‐ exp(x)*cos(4)’,’x’); %(vd.3b)
D = [x0 xf y0 yf];
Trang 64Ta xây dựng hàm fwdeuler() để thực hiện thuật toán trên
function [u, x, t] = fwdeuler(a, xf, T, it0, bx0, bxf, M, N)
Trang 65%giai au_xx = u_t voi 0 <= x <= xf, 0 <= t <= T
% dieu kien dau: u(x,0) = it0(x)
ieu kien bien: u(0,t) = bx0(t), u(xf,t) = bxf(t)
% M ‐ so doan con theo x
Trang 66CHƯƠNG 7: NỘI SUY VÀ XẤP XỈ HÀM
1 Biến đổi Fourrier: Tín hiệu thực tế thường bao gồm các thành phần có tần số khác nhau
Chuỗi Fourier và phép bíến đổi Fourier là công cụ toán học dùng để phân tích đặc tính tần số của tín hiệu Có 4 định nghĩa tương tự nhau về chuỗi và phép biến đổi Fourier, gồm: chuỗi Fourier liên tục theo t(CFS), phép biến đổi Fourier liên tục theo t(CFT), chuỗi Fourier gián đoạn theo t(DFS) và phép biến đổi Fourier gián đoạn theo t(DFT) Trong các công cụ này, DFT dễ dàng lập trình trên máy tính nên trong phần này ta sẽ chú ý đến nó
Ta xem xét hiệu qủa này bằng cách thực hiện đoạn lệnh trong
Trang 67tic %ngung dong ho
time_fft = toc %dua ra thoi gian thuc hien
clf, plot(k,abs(X1),’r’) %pho bien do
Chạy đoạn lệnh và so sánh thời gian thực hiện 1024 điểm tính DFT/iDFT vàFFT/iFFT
clear, clf
w1 = 1.5*pi;
Trang 69Ta có nhiều phổ DFT cho cùng một tín hiệu tương tự, tuỳ thuộc vào
kích thước DFT, chu kì lấy mẫu, khoảng lấy mẫu và đệm zero So sánh phốkhi giảm chu kì lấy mẫu T từ 0.1s đến 0.05s
Ta xây dựng hàm nội suy interpdfs():
function [xi,Xi] = interpdfs(T, x, Ws, ti)
%T : chu li lay mau
%x : thu tu roi rac hoa
%Ws: tan so dung chuan (1.0 = pi[rad])
%ti: khoang thoi gian noi suy