Chuong 7 - Giáo trình Matlab, BK Đà Nẵng
March 28, 2017 | Author: tienanh_08 | Category: N/A
Short Description
Download Chuong 7 - Giáo trình Matlab, BK Đà Nẵng...
Description
CHƯƠNG 7: CÁC PHƯƠNG TRÌNH VI PHÂN THƯỜNG §1. BÀI TOÁN CAUCHY Một phương trình vi phân cấp 1 có thể viết dưới dạng giải được y′ = f(x,y) mà ta có thể tìm được hàm y từ đạo hàm của nó. Tồn tại vô số nghiệm thoả mãn phương trình trên. Mỗi nghiệm phụ thuộc vào một hằng số tuỳ ý. Khi cho trước giá trị ban đầu của y là yo tại giá trị đầu xo ta nhận được một nghiệm riêng của phương trình. Bài toán Cauchy (hay bài toán có điều kiện đầu) tóm lại như sau: cho x sao cho b ≥ x ≥ a, tìm y(x) thoả mãn điều kiện: ⎧y ′( x) = f( x , y) (1) ⎨ y ( a ) = α ⎩
Người ta chứng minh rằng bài toán này có một nghiệm duy nhất nếu f thoả mãn điều kiện Lipschitz: f( x , y 1 ) − f( x , y 2 ) ≤ L y 1 − y 2 với L là một hằng số dương. Người ta cũng chứng minh rằng nếu f′y ( đạo hàm của f theo y ) là liên tục và bị chặn thì f thoả mãn điều kiện Lipschitz. Một cách tổng quát hơn, người ta định nghĩa hệ phương trình bậc 1: y′1 = f1 ( x , y 1 , y 2 ,..., y n ) y′2 = f2 ( x , y 1 , y 2 ,..., y n ) ⋅⋅⋅⋅ y′n = fn ( x , y 1 , y 2 ,..., y n )
Ta phải tìm nghiệm y1, y2,..., yn sao cho: ⎧Y′( x) = f( x , X ) ⎨ ⎩Y(a ) = α với:
⎛ y′1 ⎞ ⎜ ⎟ ⎜ y′2 ⎟ Y′ = ⎜ .. ⎟ ⎜ ⎟ ⎜ .. ⎟ ⎜ ′⎟ ⎝ yn ⎠
⎛ f1 ⎞ ⎜ ⎟ ⎜ f2 ⎟ F = ⎜ .. ⎟ ⎜ ⎟ ⎜ .. ⎟ ⎜ ⎟ ⎝ fn ⎠
⎛ y1 ⎞ ⎜ ⎟ ⎜ y2 ⎟ Y = ⎜ .. ⎟ ⎜ ⎟ ⎜ .. ⎟ ⎜y ⎟ ⎝ n⎠
360
Nếu phương trình vi phân có bậc cao hơn (n), nghiệm sẽ phụ thuộc vào n hằng số tuỳ ý. Để nhận được một nghiệm riêng, ta phải cho n điều kiện đầu. Bài toán sẽ có giá trị đầu nếu với giá trị xo đã cho ta cho y(xo), y′(xo), y″(xo),.... Một phương trình vi phân bậc n có thể đưa về thành một hệ phương trình vi phân cấp 1. Ví dụ nếu ta có phương trình vi phân cấp 2: ⎧y′′ = f( x , y , y′) ⎨ ⎩y(a ) = α , y′(a ) = β Khi đặt u = y và v = y′ ta nhận được hệ phương trình vi phân cấp 1: ⎧u′ = v ⎨ ′ v = g ( x , u , v ) ⎩ với điều kiện đầu: u(a) = α và v(a) = β Các phương pháp giải phương trình vi phân được trình bày trong chương này là các phương pháp rời rạc: đoạn [a, b] được chia thành n đoạn nhỏ bằng nhau được gọi là các ʺbướcʺ tích phân h = ( b ‐ a) / n. §2. PHƯƠNG PHÁP EULER Giả sử ta có phương trình vi phân: ⎧y ′( x) = f( x , y) (1) ⎨ ⎩y(a ) = α và cần tìm nghiệm của nó. Ta chia đoạn [xo,x ] thành n phần bởi các điểm chia: xo 1 374
y = 0.5*(y1 + y0 + h*feval(f, x, y2)); else y = 0.5*(y1 + y0 + h*feval(f, x)); end function r = richardson(r, k, n) % Richardson extrapolation. for j = k‐1:‐1:1 c =(k/(k‐1))^(2*(k‐j)); r(j, 1:n) =(c*r(j+1, 1:n) ‐ r(j, 1:n))/(c ‐ 1.0); end
3. Thuật toán Burlisch ‐ Stör: Phương pháp điểm giữa có nhược điểm là nghiệm nằm tại điểm giữa của khoảng tìm nghiệm không được tinh chỉnh bằng phương pháp ngoại suy Richardson. Khuyết điểm này được khác phục trong phương pháp Burlisch ‐ Stör. Ý tưởng của phương pháp này là áp dụng phương pháp điểm giữa trên từng đoạn. Ta xây dựng hàm burlischstoer() để thực hiện thuật toán này: function [xout, yout] = burlischstoer(f, x, x1, y, H, tol) % Phuong phap Bulirsch‐Stoer giai phuong trinh yʹ = F(x, y) hay y’ = f(x). %[x, x1] la khoang tim nghiem. % H = do tang sau moi lan tinh if size(y, 1) > 1 y = yʹ; end % y phai la vec to hang if nargin 1 F = [F(2:3, :); feval(f, t(k + 1),y(k + 1,:))ʹ]; else 382
F = [F(2:3, :); feval(f, t(k + 1))ʹ]; end end
Để giải phương trình ta dùng chương trình cthamming.m: clear all, clc a = 0; b = 1; y = @f1; ya = [0 1 1]ʹ; n = 10; tic [t, y] = hamming(y, a, b, ya, n); toc plot(t, y) §9. PHƯƠNG PHÁP MILNE Quá trình tính toán nghiệm được thực hiện qua ba bước: ‐ Tính gần đúng ym+1 theo công thức (dự đoán): 4h y(1) (1) ( 2y′m−2 − y′m −1 + 2y′m ) m +1 = y m − 3 + 3 ‐ Dùng y(1) m +1 để tính: y′m +1 = f(x m +1 ,y(1) (2) m +1 ) ‐ Dùng y′m +1 vừa tính được để tính gầm đúng thứ 2 của ym+1(hiệu chỉnh) h y(2) (3) ( y′m−1 + 4y′m + y′m+1 ) m +1 = y m −1 + 3 Ta xây dựng hàm milne() để thực hiện thuật toán trên: function [t, y] = milne(f, to, tf, y0, n) h = (tf ‐ to)/n; y(1, :) = y0ʹ; ts = to + 3*h; [t, y] = rungekutta(f, to, ts, y0, 3); t = [t(1:3)ʹ t(4):h:tf]ʹ; for i = 2:4 383
if nargin(f) > 1 F(i ‐ 1, :) = feval(f, t(i), y(i, :)); else F(i ‐ 1, :) = feval(f, t(i)); end end for i = 4:n p = y(i ‐ 3, :) + (4*h/3)*(2*F(1, :) ‐ F(2, :) + 2*F(3, :)); %Pt.(1) if nargin(f) > 1 F(4, :) = f(t(i+1), p);%Pt.(2) else F(4, :) = f(t(i+1)); end y(i+1, :) = y(i‐1, :) + (h/3)*(F(2, :) + 4*F(3, :) + F(4, :));%Pt.(3) F(1, :) = F(2, :); F(2, :) = F(3, :); if nargin(f) > 1 F(3, :) = f(t(i+1), y(i+1, :)); else F(3, :) = f(t(i+1)); end end
Để giải phương trình ta dùng chương trình ctmilne.m: clear all, clc a = 0; b = 1; y = @f2; ya = 1; n = 10; [t, y] = milne(y, a, b, ya, n); plot(t, y) §10. BÀI TOÁN GIÁ TRỊ BIÊN 1. Khái niệm chung: Ta xét bài toán tìm nghiệm của phương trình: 384
y′′ = f(x, y,y′) y(a) = α ,y(b) = β
Đây là bài toán tìm nghiệm của phương trình vi phân khi biết điều kiện biên và được gọi là bài toán giá trị biên hai điểm. Trong bài toán giá trị đầu ta có thể bắt đầu tìm nghiệm ở điểm có các giá trị đầu đã cho và tiếp tục cho các thời điểm sau. Kỹ thuật này không áp dụng được cho bài toán giá trị biên vì không có đủ điều kiện đầu ở các biên để có nghiệm duy nhất. Một cách để khác phục khó khăn này là cho các giá trị còn thiếu. Nghiệm tìm được dĩ nhiên sẽ không thoả mãn điều kiện ở các biên. Tuy nhiên ta có thể căn cứ vào đó để thay đổi điều kiện đầu trước khi tích phân lại. Phương pháp này cũng giống như bắn bia. Trước hết ta bắn rồi xem có trúng đích hay không, hiệu chỉnh và bắn lại. Do vậy phương pháp này gọi là phương pháp bắn. Một phương pháp khác để giải bài toán giá trị biên là phương pháp sai phân hữu hạn trong các đạo hàm được thay bằng các xấp xỉ bằng sai phân hữu hạn tại các nút lưới cách đều. Như vậy ta sẽ nhận được hệ phương trình đại số đối với các sai phân. Cả hai phương pháp này có một vấn đề chung: chúng làm tăng số phương trình phi tuyến nếu phương trình vi phân là phi tuyến. Các phương trình này được giải bằng phương pháp lặp nên rất tốn thời gian tính toán. Vì vạy việc giải bài toán biên phi tuyến rất khó. Ngoài ra, đối với phương pháp lặp, việc chọn giá trị đầu rất quan trọng. Nó quyết định tính hội tụ của phương pháp lặp. 2. Phương pháp shooting: Ta xét bài toán biên là phương trình vi phân cấp 2 với điều kiện đầu tại x = a và x = b. Ta xét phương trình: (1) y′′ = f(x, y,y′) y(a) = α ,y(b) = β Ta tìm cách đưa bài toán về dạng bài toán giá trị đầu: y′′ = f(x, y,y′) y(a) = α ,y′(a) = u
(2)
Chìa khoá thành công là tìm ra giá trị đúng u. ta có thể thực hiện việc này bằng phương pháp “thử và sai”: cho một giá trị u và giải bài toán giá trị đầu bằng cách đi từ a đến b. Nếu nghiệm giống với điều kiện biên mô tả y(b) = β 385
thì ta đã có nghiệm của bài toán. Nếu không ta phải hiệu chỉnh u và làm lại. Tuy nhiên làm như vậy chưa hay. Do nghiệm của bài toán giá trị đầu phụ thuộc u nên giá trị biên tính được y(b) là hàm của u, nghĩa là: y(b) = θ(u) Do đó u là nghiệm của phương trình: r(u) = θ(u) ‐ β = 0 (3) Trong đó θ(u) gọi là số dự biên(hiệu số giữa giá trị tính được và giá trị biên cho trước). Phương trình (3) có thể gải bằng các phương pháp tìm nghiệm trong chương trước. Tuy nhiên phương pháp chia đôi cung đòi hỏi tính toán lâu còn phương pháp Newton ‐ Raphson đòi hỏi tìm đạo hàm dθ/dt. Do vậy cúng ta sẽ dùng phương pháp Brent. Tóm lại thuật oán giải bài toán giá trị biên gồm các bước: ‐ Mô tả giá trị u1 và u2 vây nghiệm u của (3) ‐ Dùng phương pháp Brent tìm nghiệm u của (3). Chú ý là mỗi bước lặp đòi hỏi tính θ(u) bằng cách giải phương trình vi phân như là bài toán điều kiện đầu. ‐ Khi đã có u, giải phương trình vi phân lần nữa để tìm nghiệm Ta xây dựng hàm bvp2shoot() để giải phương trình bậc 2: function [t, x] = bvp2shoot(f, t0, tf, x0, xf, n, tol, kmax) %Giai phuong trinh: [x1, x2]ʹ = f(t, x1, x2) voi x1(t0) = x0, x1(tf) = xf if nargin
View more...
Comments