Chuong 7 - Giáo trình Matlab, BK Đà Nẵng

March 28, 2017 | Author: tienanh_08 | Category: N/A
Share Embed Donate


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

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF