YOMEDIA
ADSENSE
Chương 7: Giải phương trình vi phân
160
lượt xem 12
download
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.
AMBIENT/
Chủ đề:
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Chương 7: Giải phương trình vi phân
- 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
- 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
- 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 71 / / 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
- 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=(ba)/n; x[1]=x0; y[1]=y0; printf(" x y"); printf("\n"); for (i=1;i
- 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 RungeKutta 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 RungeKutta 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
- ................ 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 72 / / 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
- 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)((ba)/h); printf(" x y\n"); for (i=0;i
- 0.9 3.0190 1.0 3.4362 175
ADSENSE
Thêm tài liệu vào bộ sưu tập có sẵn:
Báo xấu
LAVA
AANETWORK
TRỢ GIÚP
HỖ TRỢ KHÁCH HÀNG
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn