intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Chương 7: Giải phương trình vi phân

Chia sẻ: Đinh Trường Gấu | Ngày: | Loại File: DOC | Số trang:8

155
lượt xem
12
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Chương 7: Giải phương trình vi phân trình bày những nội dung về bài toán Cauchy, phương pháp Euler và Euler cải tiến, phương pháp Runge-Kutta. Hy vọng, đây là tài liệu tham khảo hữu ích dành cho các bạn.

Chủ đề:
Lưu

Nội dung Text: Chương 7: Giải phương trình vi phân

  1. CHƯƠ NG  7: GIẢI PHƯƠ NG  TRÌNH  VI PHÂN §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à y o 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 ) y2 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  y 1, y 2,..., y n  sao cho: Y ( x) f( x , X) Y(a ) với: y1 f1 y1 y2 f2 y2 Y .. F .. Y .. .. .. .. yn fn yn 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ị  x o   đã  cho  ta  cho  y(x o ),  y (xo ), y (xo),.... 168
  2. 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 VÀ EULER CẢI TIẾN 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  [x o ,x ] thành  n  ph ầ n  bởi các điể m   chia: xo 
  3. 1 f(c i , y ( c i )) f( x i , y i ) f( x i 1 , y i 1 ) 2 Từ đó  ta có công  th ức Euler  cải tiến : h yi 1 yi f( x i , y i ) f( x i 1 , y i 1 ) (3) 2 Trong  công  thức này  giá trị  y i+1 chưa biết. Do đó  khi đã  biết y i ta ph ải tìm  y i+1  bằng  cách  giải ph ươ ng  trình  đại  số  tuyế n  tính  (3). Ta thườ ng  giải (3) bằng   cách  lặp  nh ư  sau:  tr ước hết  chọn  xấp  xỉ đầ u  tiên  của phép  lặp   y (i 0 )1 chính  là  giá trị  y i+1 tính  được theo  ph ươ ng  pháp  Euler  sau  đó  dùng  (3) để  tính  các  y (i s )1 ,  cụ thể  là: y (i 0 )1 y i hf ( x i , y i ) h y (i s )1 yi f ( x i , y i ) f ( x i 1 , y (i s 11) ) 2 Quá  trình  tính  kết thúc  khi  y (i s ) đủ  gầ n  y (i s 1) Chươ ng  trình  giải ph ươ ng  trình  vi phân  theo  ph ươ ng  pháp  Euler  nh ư  sau: Chương trình 7­1 / / p p_Euler; #include   #include   #include   float f(float x,float y)   { float a=x+y; return(a);   } void  main()   {     int i,n; float a,b,t,z,h,x0,y0,c1,c2; float x[100],y[100]; clrscr(); printf("Cho  can duoi  a = "); scanf("%f",&a); printf("Cho  can tren  b = "); scanf("%f",&b); printf("Cho  so buoc tinh  n = "); scanf("%d",&n); 170
  4. printf("Cho  so kien  x0 = "); scanf("%f",&x0); printf("Cho  so kien  y0 = "); scanf("%f",&y0); printf("\n"); printf("Bang ket qua \ n"); printf("\n"); printf("Phuong  phap  Euler \n"); h=(b­a)/n; x[1]=x0; y[1]=y0; printf("  x           y"); printf("\n"); for (i=1;i
  5. 0.2 0.01 0.02 0.3 0.03 0.05 0.4 0.06 0.09 0.5 0.11 0.15 0.6 0.17 0.22 0.7 0.25 0.31 0.8 0.34 0.42 0.9 0.46 0.56 1.0 0.59 0.71 §3. PHƯƠNG  PHÁP RUNGE ­ KUTTA Xét bài  toán  Cauchy  (1). Giả  sử  ta  đã  tìm  được giá  trị  gần  đúng  y i của   y(x i) và mu ố n  tính  y i+1 của y(x i+1). Trước hết ta viết công  thức Taylor: h2 h m (m ) h m 1 ( m 1) y(x i 1 ) y(x i ) h y (x i ) y (x i ) y (x i ) y ( c) (11) 2 m! m! với c  (xi, xi+1) và: y (x i ) f x i , y(x i ) (k) dk 1 y (x i ) f x i , y(x i ) dx k 1 Ta viết lại (11) d ưới dạ ng: h2 h m (m ) h m 1 ( m 1) y i 1 y i h y (x i ) y (x i ) y (x i ) y (c) (12) 2 m! m! Ta đã  kéo dài  khai  triển  Taylor  để  kết quả  chính  xác hơ n. Để  tính  y i, y i v.v.  ta có thể  dùng  ph ươ ng  pháp  Runge­Kutta  bằng  cách đặ t: y i 1 y i r1 k (1i ) r2 k (2i ) r3 k (3i ) r4 k (4i ) (13) trong  đó: k (1i ) hf ( x i , y i ) k (2i ) hf ( x i ah , y i k (1i ) ) (14) k (3i ) hf ( x i bh , y i k (1i ) k (2i ) ) ....... và  ta  cần xác đị nh  các hệ  số  a, b,..;  ,  ,  ,...; r 1, r 2,.. sao  cho  vế  ph ải  của (13)  khác với vế  ph ải của (12) một vô cùng  bé cấp cao nh ất có thể  có đối với h. Khi dùng  công  thức Runge­Kutta  bậc hai ta có: k (1i ) hf ( x i , y i ) (15) k (2i ) hf ( x i ah , y i k (1i ) ) và  y i 1 y i r1 k (1i ) r2 k (2i ) (16) Ta có:  y (x) = f[x,y(x)] y ( x) fx x , y ( x) fy x , y ( x) 172
  6. ................ Do đó  vế  phải của (12) là: h2 hf ( x i , y i ) fx ( x i , y i ) fy ( x i , y i ) y ( x) (17) 2 Mặt khác theo  (15) và theo  công  thức Taylor  ta có: k (1i ) hf ( x i , y i ) h y i k (2i ) h [f ( x i , y i ) ah fx ( x i , y i ) k (1i ) fy ( x i , y i ) ] Do đó  vế  phải của (16) là: h ( r1 r2 )f( x i , y i ) h 2 [ar 2 fx ( x i , y i ) r2 y i fy ( x i , y i )] (18) Bây giờ  cho (17) và  (18) khác  nhau  một  vô cùng  bé cấp O(h ) ta tìm  được các   3 hệ  số chưa biết khi cân bằ ng các số hạ ng  chứa h và chứa h 2: r 1 + r 2 = 1 a.r 1 = 1/  2 .r 2 = 1 Nh ư  vậy:   = a, r 1 = (2a ­ 1)/  2a, r 2 = 1/  2a   với a đượ c chọn bất kì. Nế u  a = 1 /  2 thì r 1 = 0 và  r 2 = 1. Lúc này  ta nhậ n  đượ c công  thức Euler. N ế u   a=1 thì r 1 = 1 /  2 và r 2 = 1/2.  Lúc này  ta nh ậ n  đượ c công  th ức Euler  cải tiến. Một cách  tương  tự  chúng  ta nhậ n  được công  thức Runge  ­ Kutta  bậc 4.   Công  thức này  hay  đượ c dùng  trong  tính  toán  thực tế  : k 1 = h.f(x i, y i) k 2 = h.f(x i+h/  2, y i + k 1/  2) k 3 = h.f(x i+h/  2, y i + k 2/  2) k 4 = h.f(x i+h, y i + k 3) yi +1 = yi + (k 1 + 2k 2 + 2k 3 + k 4) /  6 Chươ ng  trình  giải ph ươ ng  trình  vi phân  bằng  công  thức Runge  ­ Kutta  bậc 4   như  sau: Chương trình 7­2 / / P h uong  phap  Runge_Kutta; #include   #include   #include   #define  k 10 float f(float x,float y)   { float a=x+y; return(a);   } 173
  7. void  main()   { float a,b,k1,k2,k3,k4; int i,n; float x0,y0,h,e; float x[k],y[k]; clrscr(); printf("Phuong  phap  Runge  ­ Kutta \n"); printf("Cho  can duoi  a = "); scanf("%f",&a); printf("Cho  can tren  b = "); scanf("%f",&b); printf("Cho  so kien  y0 = "); scanf("%f",&y[0]); printf("Cho  buoc tinh  h = "); scanf("%f",&h); n=(int)((b­a)/h); printf("          x              y\n"); for (i=0;i
  8. 0.9 3.0190 1.0 3.4362 175
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2