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: 

Một phần của tài liệu Tài liệu CHƯƠNG 7: CÁC PHƯƠNG TRÌNH VI PHÂN THƯỜNG docx (Trang 26 - 29)

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))  

 

Một phần của tài liệu Tài liệu CHƯƠNG 7: CÁC PHƯƠNG TRÌNH VI PHÂN THƯỜNG docx (Trang 26 - 29)