với điều kiện đầu tại x = a và x = b. Ta xét phương trình:
′′= ′ = α = β
y f(x,y,y ) y(a) ,y(b) (1)
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) = β
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 < 8 kmax = 10; end if nargin < 7 tol = 1e‐8; end if nargin < 6 n = 100; end
dx0(1) = (xf ‐ x0)/(tf ‐ t0); % cho gia tri dau cua xʹ(t0) y0 = [x0 dx0(1)]ʹ;
e(1) = x(end,1) ‐ xf;
dx0(2) = dx0(1) ‐ 0.1*sign(e(1)); for k = 2: kmax‐1
y1 = [x0 dx0(k)]ʹ;
[t, x] = rungekutta(f, t0, tf, y1, n); %sai so giua gia tri cuoi va dich e(k) = x(end, 1) ‐ xf; % x(tf)‐ xf ddx = dx0(k) ‐ dx0(k ‐ 1); if abs(e(k))< tol | abs(ddx)< tol break;
end
deddx = (e(k) ‐ e(k ‐ 1))/ddx; dx0(k + 1) = dx0(k) ‐ e(k)/deddx; end Để giải phương trình: ′′= 2 + ′ y 2y 4xyy với điều kiện biên: y(0) = 0.25, y(1) = 1/3 Đặt: y′ =y , 1 y′′ =y2 ta đưa phương trình về hệ phương trình vi phân cấp 1: ⎧ = ⎨ = + ⎩ 1 2 2 1 2 1 y y y 2y 4xy y và biểu diễn nó bằng hàm f7(): function dx = f7(t, x) %Eq.(6.6.5) dx(1) = x(2); dx(2) = (2*x(1) + 4*t*x(2))*x(1); Để giải phương trình ta dùng chương trình ctbvp2shoot.m: clear all, clc t0 = 0; tf = 1; x0 = 1/4;
xf = 1/3; % thoi gian dau/cuoi va cac vi tri n = 100;
kmax = 10; y = @f7;
[t, x] = bvp2shoot(y, t0, tf, x0, xf, n, tol, kmax); xo = 1./(4 ‐ t.*t);
err = norm(x(:,1) ‐ xo)/(n + 1) plot(t,x(:, 1))