Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 108 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
108
Dung lượng
1,03 MB
Nội dung
TRƯỜNG ĐẠI HỌC SƯ PHẠM ĐÀ NẴNG KHOA TOÁN −−− −−− HOÀNG THỊ THÚY HẠNH KẾT HỢP MỘT PHƯƠNG PHÁP TUYẾN TÍNH ĐA BƯỚC VÀ PHƯƠNG PHÁP BDF ĐỂ GIẢI SỐ PHƯƠNG TRÌNH VI PHÂN Chun ngành: Cử Nhân Tốn LUẬN VĂN TỐT NGHIỆP Người hướng dẫn Th.S NGUYỄN HOÀNG THÀNH Đà Nẵng, 5/2012 Mục lục Lời nói đầu Một số kiến thức liên quan 1.1 Bài toán Cauchy 6 1.2 Cách tiếp cận lời giải số 1.3 1.4 Cấp xác phương pháp số Sự hội tụ phương pháp số 9 1.5 Tính phù hợp phương pháp số 10 1.5.1 Đa thức đặc trưng thứ 10 1.6 1.5.2 Khái niệm tính phù hợp phương pháp số 11 Tính zero ổn định 12 1.7 1.8 Phương pháp lặp đơn giải phương trình phi tuyến 14 Phép nội suy 14 1.9 Phương trình Riccati 16 1.9.1 Dạng tắc phương trình Riccati 17 1.9.2 Dạng đặc biệt phương trình Riccati 17 1.10 Phương pháp Runge-Kutta 18 Các phương pháp tuyến tính đa bước phương pháp BDF 20 2.1 Các phương pháp tuyến tính đa bước 20 2.1.1 Khái niệm chung 20 2.1.2 Tính zero ổn định phương pháp tuyến tính đa bước 21 2.1.3 Tính phù hợp phương pháp tuyến tính đa bước 22 −2− 2.1.4 2.2 2.3 Sự hội tụ phương pháp tuyến tính đa bước 24 2.1.5 Cấp xác phương pháp tuyến tính đa bước 25 Một số phương pháp tuyến tính đa bước hiển 27 2.2.1 2.2.2 Phương pháp Adams-Bashforth 27 Phương pháp trung điểm 30 2.2.3 Phương pháp tuyến tính bước hiển 31 Phương pháp BDF 34 2.3.1 Phát biểu công thức BDF 34 2.3.2 Xét hội tụ cấp xác phương pháp BDF bước, bước, bước 38 Sử dụng phương pháp tuyến tính đa bước phương pháp BDF vào giải số phương trình vi phân 3.1 3.2 42 Kết hợp phương pháp tuyến tính bước phương pháp BDF bước vào giải số PTVP 42 3.1.1 Kết hợp phương pháp Adams-Bashforth bước BDF bước 42 3.1.2 3.1.3 Kết hợp phương pháp trung điểm BDF bước 52 Kết hợp phương pháp tuyến tính bước BDF bước 58 Kết hợp phương pháp tuyến tính bước phương pháp BDF bước vào giải số PTVP 64 3.2.1 Kết hợp phương pháp Adams-Bashforth bước phương pháp BDF bước 64 3.2.2 3.2.3 Kết hợp phương pháp trung điểm BDF bước 75 Kết hợp phương pháp tuyến tính bước BDF bước 83 Phụ lục 93 Kết luận 106 Tài liệu tham khảo 107 −3− Lời nói đầu Đa số toán khoa học kỹ thuật đưa (hệ) phương trình vi phân thường với điều kiện biên điều kiện ban đầu Nghiệm chúng thường áp dụng cho số lớp toán hạn chế, đa số toán phải tìm nghiệm gần Có hai loại tốn (1) Bài tốn Cauchy hay cịn gọi tốn giá trị ban đầu, bao gồm (hệ) phương trình vi phân điều kiện ban đầu toán (2) Bài tốn biên, bao gồm (hệ) phương trình vi phân điều kiện biên Mặc dù có lịch sử phát triển hàng trăm năm, nhiều tốn cần giải quyết, giải số phương trình vi phân thường thu hút quan tâm mạnh mẽ nhà toán học nhà nghiên cứu ứng dụng Trong giải số phương trình vi phân, người ta thường cố gắng tìm phương pháp hữu hiệu bảo đảm hội tụ, tính ổn định tính xác cao Để làm điều này, người ta thường kết hợp phương pháp tuyến tính đa bước để nhận phương pháp có tính ổn định, hội tụ cấp xác cao Mục đích khóa luận kết hợp phương pháp tuyến tính đa bước với phương pháp BDF để giải số phương trình vi phân nhằm tìm phương pháp tốt nhất, cho nghiệm xác Bố cục khóa luận bao gồm chương phụ lục • Chương Trình bày số khái niệm giải số phương trình vi phân • Chương Trình bày phương pháp tuyến tính đa bước hiển phương pháp BDF −4− • Chương Sử dụng phương pháp tuyến tính đa bước phương pháp BDF vào giải số phương trình vi phân • Phụ lục trình bày code lập trình Maple Trong thời đại tin học việc áp dụng phương pháp tính trở nên phổ biến nhằm tăng tốc độ tính tốn cho độ xác cao Để minh họa kiểm chứng lý thuyết, em sử dụng phần mềm MAPLE để lập trình tính tốn cho số tốn cụ thể Trước trình bày nội dung khóa luận, em xin bày tỏ lòng biết ơn sâu sắc đến Thầy Nguyễn Hồng Thành người tận tình hướng dẫn để em hồn thành khóa luận Em xin tỏ lịng cám ơn đến thầy Tơn Thất Tú, hướng dẫn tận tình, giúp em việc làm quen với Maple Bên cạnh đó, em xin cảm ơn ban chủ nhiệm , thầy cô cán khoa Toán, trường Đại Học Sư Phạm, Đại Học Đà Nẵng nhiệt tình giảng dạy giúp đỡ em suốt trình học tập trường Do thời gian thực khóa luận khơng nhiều, kiến thức cịn hạn chế nên thực khóa luận khơng tránh khỏi sai sót Em mong nhận góp ý ý kiến phản biện quý thầy cô bạn đọc Xin chân thành cảm ơn! Đà Nẵng, ngày 19 tháng 05 năm 2012 Sinh viên Hoàng Thị Thúy Hạnh , −5− Chương Một số kiến thức liên quan 1.1 Bài toán Cauchy Trong khóa luận này, đề cập đến phương pháp số để giải tốn tìm giá tri ban đầu Phương trình vi phân cấp cao hay hệ phương trình vi phân ln viết dạng hệ phương trình vi phân bậc ta ln ln giả sử điều thực Bài tốn giá trị ban đầu hay cịn gọi tốn Cauchy có dạng y = f (x, y) y(a) = η (1.1) f : [a, b]×Rm → Rm , y : [a, b] → Rm , η = (y1 (a), y2 (a), , yn (a)) cho trước Định lý 1.1 (Xem [11]) Cho f : [a, b] × Rm → Rm ánh xạ liên tục D = [a, b] × Rm thỏa mãn điều kiện Lipschitz theo biến y, nghĩa tồn L ≥ cho f (x, y) − f (x, y1 ) ≤ L y − y1 ∀(x, y), (x, y1 ) ∈ D Khi toán Cauchy (1.1) tồn nghiệm y(x) liên tục có đạo hàm D −6− 1.2 Cách tiếp cận lời giải số Tất phương pháp số mà đề cập khóa luận sử dụng để tìm nghiệm tốn Cauchy tập rời rạc [a, b] Để làm việc ta chia nhỏ đoạn [a, b] thành tập điểm {xi }N i=0 cho xi = a + ih i = 0, 1, , N h = b − a N tham số h gọi độ dài bước nhảy Giả sử y(x) nghiệm hệ (1.1) Gọi yn xấp xỉ y(xn ) Kí hiệu yn ≈ y(xn ) (1.2) Mục đích tìm phương pháp hữu hiệu để tính dãy N giá trị {yn }N n=0 xấp xỉ nghiệm (1.1) tập điểm rời rạc {xn }n=0 Phương pháp số để giải toán (1.1) hệ sai phân k + giá trị xấp xỉ {yn+i }ki=1 {y(xn+i )}ki=1 để từ ta tính giá trị {yi }N i=1 biết k giá trị ban đầu Và k gọi số bước phương pháp Nếu k = phương pháp gọi phương pháp bước Nếu k > phương pháp gọi phương pháp đa bước hay k -bước Ví dụ 1.1 Phương pháp yn+1 = 2yn−1 − yn + h (f (xn+1 , yn+1 ) + 8f (xn , yn ) + 3f (xn−1 , yn−1 )) phương pháp hai bước ẩn Ví dụ 1.2 Phương pháp yn+1 = yn + h (3f (xn , yn ) − 2f (xn−1 , yn−1 )) phương pháp hai bước hiển −7− Ví dụ 1.3 Phương pháp số 1 h yn+1 = yn−2 + yn−1 − yn + (19f (xn , yn ) + 5f (xn−2 , yn−2 )) 4 phương pháp ba bước Ví dụ 1.4 Phương pháp số hai bước ∗ yn+1 = yn−1 + h (f (xn+1 , yn+1 ) + f (xn−1 , yn−1 )) với h (f (xn , yn ) − 3f (xn−1 , yn−1 )) Ví dụ 1.5 Phương pháp Adams hai bước ∗ yn+1 = 3yn − 2yn−1 + yn+1 = yn + h f (xn , yn ) − f (xn−1 , yn−1 ) 2 Ví dụ 1.6 Phương pháp Euler hiển yn+1 = yn + hf (xn , yn ) y =y Áp dụng cho toán với h = y(0) = Ta có kết sau: y1 = y0 + f (x0 , y0 ) = + = 1, y2 = y1 + f (x1 , y1 ) = 1.5 + 1.5 = 2.25 y3 = y2 + f (x2 , y2 ) = 2.25 + 2.25 = 3.375 y4 = y3 + f (x3 , y3 ) = 3.375 + 3.375 = 5.0625 Tất ví dụ phương pháp đề cập khóa luận viết dạng tổng quát sau k yn+1 = αj yn+1−j + hφf (yn+1 ,yn , , yn+1−k , xn+1−k , h) (1.3) j=1 Nếu φf khơng phụ thuộc vào yn+1 ta gọi phương pháp số (1.3) phương pháp hiển Ngược lại φf phụ thuộc vào yn+1 ta gọi (1.3) phương pháp ẩn −8− 1.3 Cấp xác phương pháp số Phương pháp số (1.3) gọi phương pháp số có cấp xác p k y(xn+1 ) − αj y(xn+1−j ) − hφf (y(xn+1 ),y(xn ), , y(xn+1−k ), xn+1−k , h) j=1 = o(hp+1 ) Ví dụ 1.7 Phương pháp Euler yn+1 = yn + hf (xn , yn ) có cấp xác Để có kết này, ta thực sau Giả thiết yn+1 = y(xn+1 ), yn = y(xn ) Khai triển Taylor y(x) x = xn ta có y(xn+1 ) = y(xn + h) = y(xn ) + hy (xn ) + ε(h).h ε(h) vơ bé h → ⇒ y(xn+1 ) − y(xn ) − hf (xn , y(xn )) = h.y (xn ) + ε(h).h − h.f (xn , y(xn )) = ε(h).h = o(h2 ) = o(h1+1 ) o(h2 ) vô bé cấp với h2 h → Suy phương pháp Euler có cấp xác 1.4 Sự hội tụ phương pháp số Giả sử xấp xỉ nghiệm x0 , x1 , , xn ∈ [a, b] toán Cauchy (1.1) cho phương pháp số (1.3) với giá trị ban đầu thích hợp yµ = ηµ (h), µ = 0, 1, , k − −9− Định nghĩa 1.1 (xem [11]) Phương pháp số (1.3) gọi hội tụ lim yn = y(xn ) h→0 với xn = a + nh, ∀x ∈ [a, b] nghiệm {yn } hệ sai phân (1.3) thỏa mãn điều kiện yµ = ηµ (h), với lim ηµ (h) = µ, µ = 0, 1, , k − Một định nghĩa tương đương khác hội tụ Định nghĩa 1.2 (xem [11]) Phương pháp số cho (1.3) gọi hội tụ max y(xn ) − yn → 0≤n≤N 1.5 h → Tính phù hợp phương pháp số 1.5.1 Đa thức đặc trưng thứ Xét phương pháp tổng quát (1.3) k yn+1 = αj yn+1−j + hφf (yn+1 ,yn , , yn+1−k , xn+1−k , h) j=1 Khi đa thức đặc trưng thứ phương pháp số (1.3) định nghĩa k k αj ξ k−j ρ (ξ) = ξ − j=1 = ξ k − (αk + αk−1 ξ + αk−2 ξ + + α1 ξ k−1 ) với ξ ∈ C biến số − 10 − yd[0]:=evalf(y0,25): y01:=evalf(yh[0]+h1*f(x[0],yd[0]),25); yd[1]:=evalf(y01+(1/2)*h1*(3*f(x01, y01)-f(x[0],yd[0])),25): H[1][0]:=yd[1]: H[1][1]:=evalf((4/3)*y01-(1/3)*yd[0]+(h1*2/3)* f(x[1],H[1][0]),25): m:=0: while abs(H[1][m+1]-H[1][m])>=epsilon m:=m+1; H[1][m+1]:=evalf((4/3)*y01-(1/3)*yd[0]+ (h1*2/3)*f(x[1],H[1][m]),25): if m+1>nmax then break; end if; end do: yh[1]:=H[1][m+1]: >for i from to n-1 x[i+1]:=x[i]+h: yd[i+1]:=evalf(yh[i]+(1/2)*h*(3*f(x[i], yh[i])f(x[i-1], yh[i-1])), 25): H[i+1][0]:=yd[i+1]; H[i+1][1]:=evalf((4/3)*yh[i]-(1/3)*yh[i-1]+ (h*2/3)*f(x[i+1],H[i+1][0]),25): k:=0: while abs(H[i+1][k+1]-H[i+1][k])>=epsilon k:=k+1; H[i+1][k+1]:=evalf((4/3)*yh[i]-(1/3)*yh[i-1]+ (h*2/3)*f(x[i+1],H[i+1][k]),25); if k+1>nmax then break; end if; end do: yh[i+1]:=H[i+1][k+1]; end do: >y:=’y’: rs:={dsolve({diff(y(t),t)=f(t,y(t)),y(0)=y0},y(t))}: − 94 − if rs={} then print(‘Khơng tìm nghiệm xác Maple cho nghiệm số phương pháp Runge-Kutta bậc 4-5 để làm sở so sánh.‘); tmp:=dsolve({diff(y(t),t)=f(t,y(t)),y(0)=y0},y(t), type=numeric,output=listprocedure,range=a b): ngh:=evalf(subs(tmp,y(t)),25): else ngh:=unapply(rhs(rs[1]),t): print(‘Nghiệm xác giải Maple‘); print(y(x)=ngh(x)); end if: >printf("%12s%16s%22s%16s%20s%20s\n","Gia tri x", "y du bao","y hieu chinh","y Maple","yM-yd","yM-yh"); >for i from to 10 printf("%10.3f%20.10f%20.10f%20.10f%20.10f%20.10f\n", x[i*n/10],yd[i*n/10],yh[i*n/10],evalf(ngh(x[i*n/10]),25), evalf(abs(ngh(x[i*n/10])-yd[i*n/10])), evalf(abs(ngh(x[i*n/10])-yh[i*n/10]))); end do; # Đồ thị minh họa > p1:=plot(ngh(t),t=a b,color=red,legend="Nghiệm Maple"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue,style=point ,symbolsize=4,legend="Nghiệm hiệu chỉnh"): plots[display](p1,p2); >p1:=plot(ngh(t),t=a b,color=red,legend="Nghiệm Maple"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue, legend="Nghiệm hiệu chỉnh"): plots[display](p2,p1); >p1:=plot(ngh(t),t=a b,color=red,legend="Nghiệm Maple"): plots[display](p1); >p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue, − 95 − legend="Nghiệm hiệu chỉnh"): plots[display](p2); >p1:=plot([seq([x[i],yd[i]],i=0 n)],color=blue, legend="Nghiệm dự báo"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=red, legend="Nghiệm hiệu chỉnh"): plots[display](p1,p2); Code:Kết hợp phương pháp trung điểm BDF bước > restart; >with(Maplets[Elements]): GD:=Maplet([ ["Nhap ham f(x,y)=",TextField[f]("-y*cos(x)+x*exp(x)")], ["Nhap a=",TextField[a]("0"),"b=",TextField[b]("0.1")], ["Nhap n=",TextField[n]("100"),"y0=",TextField[y0]("0")], [Button("Thực hiện",Shutdown([f,a,b,n,y0]))] ]): gtn:=Maplets[Display](GD); >ham:=parse(gtn[1]); n:=parse(gtn[4]); a:=parse(gtn[2]); b:=parse(gtn[3]); y0:=parse(gtn[5]); h := evalf((b-a)/n); f := unapply(ham, x, y): epsilon:=10^(-25): nmax:=100: >x[0]:=a: h1 := evalf((1/2)*h,25): x01:=evalf(x[0]+h1,20): x[1]:=evalf(x[0]+h, 25): >yh[0]:=evalf(y0,25): yd[0]:=evalf(y0,25): y01:=evalf(yh[0]+h1*f(x[0],yd[0]),25); − 96 − yd[1]:=evalf(yd[0]+2*h1*f(x01, y01), 25): H[1][0]:=yd[1]: H[1][1]:=evalf((4/3)*y01-(1/3)*yd[0]+(h1*2/3)* f(x[1],H[1][0]),25): m:=0: while abs(H[1][m+1]-H[1][m])>=epsilon m:=m+1; H[1][m+1]:=evalf((4/3)*y01-(1/3)*yd[0]+ (h1*2/3)*f(x[1],H[1][m]),25): if m+1>nmax then break; end if; end do: yh[1]:=H[1][m+1]: >for i from to n-1 x[i+1]:=x[i]+h: yd[i+1]:=yh[i-1]+2*h*f(x[i],yh[i]); H[i+1][0]:=yd[i+1]; H[i+1][1]:=evalf((4/3)*yh[i]-(1/3)*yh[i-1]+ (h*2/3)*f(x[i+1],H[i+1][0]),25): k:=0: while abs(H[i+1][k+1]-H[i+1][k])>=epsilon k:=k+1; H[i+1][k+1]:=evalf((4/3)*yh[i]-(1/3)*yh[i-1]+ (h*2/3)*f(x[i+1],H[i+1][k]),25); if k+1>nmax then break; end if; end do: yh[i+1]:=H[i+1][k+1]; end do: >y:=’y’: rs:={dsolve({diff(y(t),t)=f(t,y(t)),y(0)=y0},y(t))}: if rs={} then print(‘Khơng tìm nghiệm xác Maple cho nghiệm số phương pháp Runge-Kutta bậc 4-5 − 97 − để làm sở so sánh.‘); tmp:=dsolve({diff(y(t),t)=f(t,y(t)),y(0)=y0},y(t), type=numeric,output=listprocedure,range=a b): ngh:=evalf(subs(tmp,y(t)),25): else ngh:=unapply(rhs(rs[1]),t): print(‘Nghiệm xác giải Maple‘); print(y(x)=ngh(x)); end if: >printf("%4s%12s%14s%18s%14s%18s%18s\n","STT","Gia tri x", "y du bao","y hieu chinh","y Maple","yM-yd","yM-yh"); >for i from to 10 printf("%4.0f%10.3f%17.10f%17.10f%17.10f%20.10f%17.10f\n", i*n/10,x[i*n/10],yd[i*n/10],yh[i*n/10], evalf(ngh(x[i*n/10])),evalf(abs(ngh(x[i*n/10])-yd[i*n/10])), evalf(abs(ngh(x[i*n/10])-yh[i*n/10]))); end do; # Đồ thị minh họa >p1:=plot(ngh(t),t=a b,color=red,legend="Nghiệm Maple"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue,style=point, legend="Nghiệm hiệu chỉnh"): plots[display](p1,p2); >p1:=plot(ngh(t),t=a b,color=red,legend="Nghiệm Maple"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue, style=point,legend="Nghiệm hiệu chỉnh"): plots[display](p2,p1); >p1:=plot(ngh(t),t=a b,color=red,legend="Nghiệm Maple"): plots[display](p1); >p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue, legend="Nghiệm hiệu chỉnh"): plots[display](p2); >p1:=plot([seq([x[i],yd[i]],i=0 n)],color=blue, − 98 − legend="Nghiệm dự báo"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=red, legend="Nghiệm hiệu chỉnh"): plots[display](p1,p2); Sử dụng phương pháp tuyến tính bước phương pháp BDF bước vào giải số PTVP Chương trình giải Maple: Code: Kết hợp phương pháp Adams-Bashforth bước BDF bước >restart; with(Maplets[Elements]): GD:=Maplet([ ["Nhap ham f(x,y)= ",TextField[f]("-y*cos(x)+x*exp(x)")], [ "Nhap a= ", TextField[a]("0"), " b= ", TextField[b]("0.1")], [ "Nhap n= ", TextField[n]("100"), " y0= ", TextField[y0]("0")], [Button("Thoat", Shutdown([f,a,b,n,y0]))] ]): gtn:=Maplets[Display](GD): >ham:=parse(gtn[1]); n:=parse(gtn[4]); a:=parse(gtn[2]); b:=parse(gtn[3]); y0:=parse(gtn[5]); h := evalf((b-a)/n); f := unapply(ham, x, y): epsilon:=10^(-25): nmax:=100: >yd[0]:=evalf(y0,25): yh[0]:=y0:x[0]:=a: x[1]:=x[0]+h:x[2]:=x[1]+h: y01:=evalf( yd[0],25); y02:=evalf(yd[0]+h*1/2*f(x[0],y01),25); y03:=evalf( yd[0]+h*(1/2*f(x[0]+1/2*h,y02)),25); y04:=evalf( yd[0]+h*(f(x[0]+1/2*h,y03)),25); − 99 − y[1]:=evalf( yd[0]+h*(1/6*f(x[0],y01)+1/3*f(x[0]+1/2*h,y02) +1/3*f(x[0]+1/2*h,y03)+1/6*f(x[0]+h,y04)),25); >y1[1]:=evalf( y[1],25); y1[2]:=evalf(y[1]+h*1/2*f(x[1],y1[1]),25); y1[3]:=evalf( y[1]+h*(1/2*f(x[1]+1/2*h,y1[2])),25); y1[4]:=evalf( y[1]+h*(f(x[1]+1/2*h,y1[3])),25); y[2]:=evalf( y[1]+h*(1/6*f(x[1],y1[1])+1/3*f(x[1]+1/2*h,y1[2]) +1/3*f(x[1]+1/2*h,y1[3])+1/6*f(x[1]+h,y1[4])),25); yd[1]:=y[1]; yd[2]:=y[2]: yh[1]:=y[1]: yh[2]:=y[2]: >for i from to n-1 x[i+1]:=x[i]+h: yd[i+1]:=evalf(yh[i-1]+2*h*f(x[i],yh[i]),25); H[i+1][0]:=yd[i+1]: H[i+1][1]:=evalf((18/11)*yh[i]-(9/11)*yh[i-1]+ (2/11)*yh[i-2]+(6/11)*h*f(x[i+1],H[i+1][0]), 25): k:=0: while abs(H[i+1][k+1]-H[i+1][k])>epsilon k:=k+1: H[i+1][k+1]:=evalf((18/11)*yh[i]-(9/11)*yh[i-1]+ (2/11)*yh[i-2]+(6/11)*h*f(x[i+1], H[i+1][k]), 25); if k+1>nmax then break; end if; end do: yh[i+1]:=H[i+1][k+1]; end do: >y:=’y’: rs:={dsolve({diff(y(t),t)=f(t,y(t)),y(0)=y0},y(t))}: if rs={} then print(‘Khơng tìm nghiệm xác Maple cho nghiệm số phương pháp Runge-Kutta bậc 4-5 − 100 − để làm sở so sánh.‘); tmp:=dsolve({diff(y(t),t)=f(t,y(t)),y(0)=y0},y(t), type=numeric,output=listprocedure,range=a b): ngh:=evalf(subs(tmp,y(t)),25): else ngh:=unapply(rhs(rs[1]),t): print(‘Nghiệm xác giải Maple‘); print(y(x)=ngh(x)); end if: >printf("%12s %16s %22s %16s %20s %20s\n","Gia tri x", "y du bao","y hieu chinh","y Maple","yM-yd","yM-yh"); for i from to 10 printf("%10.3f %20.15f %20.15f %20.15f %20.15f %20.15f\n" ,x[i*n/10],yd[i*n/10],yh[i*n/10],evalf(ngh(x[i*n/10]),25), evalf(abs(ngh(x[i*n/10])-yd[i*n/10]),15), evalf(abs(ngh(x[i*n/10])-yh[i*n/10]),15)); end do; >p1:=plot(ngh(t),t=a b,color=red,legend="Nghiệm Maple"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue, style=point,symbolsize=4,legend="Nghiệm hiệu chỉnh"): plots[display](p1,p2); >p1:=plot(ngh(t),t=a b,color=red,legend="Maple"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue, legend="Nghiệm hiệu chỉnh"): plots[display](p2,p1); >p1:=plot(ngh(t),t=a b,color=red,legend="Nghiệm Maple"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue, legend="Nghiệm hiệu chỉnh"): plots[display](p2,p1); >p1:=plot(ngh(t),t=a b,color=red,legend="Nghiệm Maple"): plots[display](p1); >p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue, − 101 − legend="Nghiệm hiệu chỉnh"): plots[display](p2); >p1:=plot([seq([x[i],yd[i]],i=0 n)],color=blue, legend="Nghiệm dự báo"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=red, legend="Nghiệm hiệu chỉnh"): plots[display](p1,p2); Code: Kết hợp phương pháp tuyến tính bước BDF bước >restart; with(Maplets[Elements]): GD:=Maplet([ ["Nhap ham f(x,y)=",TextField[f]("-y*cos(x)+x*exp(x)")], ["Nhap a=",TextField[a]("0")," b= ",TextField[b]("0.1")], ["Nhap n=",TextField[n]("100"),"y0=",TextField[y0]("0")], [Button("Thoat", Shutdown([f,a,b,n,y0]))] ]): gtn:=Maplets[Display](GD): >ham:=parse(gtn[1]); n:=parse(gtn[4]); a:=parse(gtn[2]); b:=parse(gtn[3]); y0:=parse(gtn[5]); h := evalf((b-a)/n); f := unapply(ham, x, y): epsilon:=10^(-25): nmax:=100: >yd[0]:=evalf(y0,25): yh[0]:=y0:x[0]:=a: x[1]:=x[0]+h:x[2]:=x[1]+h: y01:=evalf( yd[0],25); y02:=evalf(yd[0]+h*1/2*f(x[0],y01),25); y03:=evalf( yd[0]+h*(1/2*f(x[0]+1/2*h,y02)),25); y04:=evalf( yd[0]+h*(f(x[0]+1/2*h,y03)),25); − 102 − y[1]:=evalf( yd[0]+h*(1/6*f(x[0],y01)+1/3*f(x[0]+1/2*h,y02) +1/3*f(x[0]+1/2*h,y03)+1/6*f(x[0]+h,y04)),25); >y1[1]:=evalf( y[1],25); y1[2]:=evalf(y[1]+h*1/2*f(x[1],y1[1]),25); y1[3]:=evalf( y[1]+h*(1/2*f(x[1]+1/2*h,y1[2])),25); y1[4]:=evalf( y[1]+h*(f(x[1]+1/2*h,y1[3])),25); y[2]:=evalf( y[1]+h*(1/6*f(x[1],y1[1])+1/3*f(x[1]+1/2*h,y1[2]) +1/3*f(x[1]+1/2*h,y1[3])+1/6*f(x[1]+h,y1[4])),25); yd[1]:=y[1]; yd[2]:=y[2]: yh[1]:=y[1]: yh[2]:=y[2]: >for i from to n-1 x[i+1]:=x[i]+h: yd[i+1]:=evalf((1/2)*yh[i]+(1/2)*yh[i-1]+ h*((7/4)*f(x[i], yh[i])-(1/4)*f(x[i-1],yh[i-1])),25): H[i+1][0]:=yd[i+1]: H[i+1][1]:=evalf((18/11)*yh[i]-(9/11)*yh[i-1]+ (2/11)*yh[i-2]+(6/11)*h*f(x[i+1],H[i+1][0]),25): k:=0: while abs(H[i+1][k+1]-H[i+1][k])>epsilon k:=k+1: H[i+1][k+1]:=evalf((18/11)*yh[i]-(9/11)*yh[i-1]+ (2/11)*yh[i-2]+(6/11)*h*f(x[i+1], H[i+1][k]), 25); if k+1>nmax then break; end if; end do: yh[i+1]:=H[i+1][k+1]; end do: >y:=’y’: rs:={dsolve({diff(y(t),t)=f(t,y(t)),y(0)=y0},y(t))}: if rs={} then print(‘Khơng tìm nghiệm xác Maple cho − 103 − nghiệm số phương pháp Runge-Kutta bậc 4-5 để làm sở so sánh.‘); tmp:=dsolve({diff(y(t),t)=f(t,y(t)),y(0)=y0},y(t), type=numeric,output=listprocedure,range=a b): ngh:=evalf(subs(tmp,y(t)),25): else ngh:=unapply(rhs(rs[1]),t): print(‘Nghiệm xác giải Maple‘); print(y(x)=ngh(x)); end if: >printf("%12s%16s%22s %16s%20s%20s\n","Gia tri x", "y du bao","y hieu chinh","y Maple","yM-yd","yM-yh"); for i from to 10 printf("%10.3f %20.15f %20.15f %20.15f%20.15f%20.15f\n" ,x[i*n/10],yd[i*n/10],yh[i*n/10],evalf(ngh(x[i*n/10]),25), evalf(abs(ngh(x[i*n/10])-yd[i*n/10]),15), evalf(abs(ngh(x[i*n/10])-yh[i*n/10]),15)); end do; >p1:=plot(ngh(t),t=a b,color=red,legend="Nghiệm Maple"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue, style=point,symbolsize=4,legend="Nghiệm hiệu chỉnh"): plots[display](p1,p2); >p1:=plot(ngh(t),t=a b,color=red,legend="Maple"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue, legend="Nghiệm hiệu chỉnh"): plots[display](p2,p1); >p1:=plot(ngh(t),t=a b,color=red,legend="Nghiệm Maple"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue, legend="Nghiệm hiệu chỉnh"): plots[display](p2,p1); >p1:=plot(ngh(t),t=a b,color=red,legend="Nghiệm Maple"): plots[display](p1); − 104 − >p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue, legend="Nghiệm hiệu chỉnh"): plots[display](p2); >p1:=plot([seq([x[i],yd[i]],i=0 n)],color=blue, legend="Nghiệm dự báo"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=red, legend="Nghiệm hiệu chỉnh"): plots[display](p1,p2); Code cặp phương pháp lại tương tự code trình bày − 105 − Kết luận Trong khóa luận em hệ thống lại số khái niệm phương pháp số giải phương trình vi phân Nghiên cứu việc kết hợp số phương pháp tuyến tính đa bước hiển với phương pháp BDF vào giải số toán Cauchy, đưa nghiệm gần có sai số nhỏ so với nghiệm xác Lập trình Maple, minh họa đồ thị cách trực quan sinh động Tuy nhiên, trình nghiên cứu em nhận thấy việc kết hợp phương pháp tuyến tính đa bước với phương pháp BDF chưa thực cho kết tốt mong muốn Điều buộc ta phải sử dụng h nhỏ để tăng độ xác cho toán − 106 − Tài liệu tham khảo [1] Phạm Kỳ Anh, Giải tích số, Nhà xuất đại học quốc gia Hà Nội, 2000 [2] Butcher J.C (John Charles), Numerical methods for ordinary differential (Second edition), John Wiley & Sons 2008 [3] Dahlquits, Convergence and stability in the numerical integration of ordinary differential equation, Math Scand 4, 1956, pp 33 - 53 [4] Nguyễn Hữu Điển, Hướng dẫn sử dụng Maple V, NXB Thống Kê, 1999 [5] Phạm Văn Hạp, Lê Đình Thịnh, Phương pháp tính thuật tốn, NXB Giáo Dục, 2000 [6] Henrici , Discrete variable methods in ordinary differential equation, Wiley, New York, 1962 [7] Dỗn Tam Hịe, Tốn học tính tốn, NXB Giáo Dục, 2005 [8] Nguyễn Thế Hồn, Cơ sở phương trình vi phân lý thuyết ổn định, NXB Giáo Dục, 2000 [9] Isaascon and H.B Keller, Analysis of numerical methods, Wiley, New York, 1966 [10] Arieh Iserles, A first course in the numerical analysis of differential equation (Second Edition), Cambridge University Press, New York, 2009 [11] J.D Lambert, Numerical Methods for ordinary differential systems, John Wiley and Sons Ltd, Reprinted May 1993 − 107 − [12] B V Ramana, Higher engineering mathematics, The McGraw-Hill Companies,2006 [13] Hoàng Trọng Thái, Trần Thị Ngọc Diệp, Lê Quang Phan, Nguyễn Văn Tuấn, Sử dụng phần mềm toán học, Nhà xuất đại học sư phạm Hà Nội, 2007 [14] Lê Trọng Vinh, Giải tích số, NXB Khoa Học Kỹ Thuật Hà Nội, 2000 [15] Dương Thủy Vỹ, Giáo trình phương pháp tính, NXB Khoa Học Kỹ Thuật Hà Nội, 1999 − 108 − ... phương pháp tuyến tính đa bước phương pháp BDF vào giải số phương trình vi phân 3.1 3.2 42 Kết hợp phương pháp tuyến tính bước phương pháp BDF bước vào giải số PTVP 42 3.1.1 Kết. .. phương pháp BDF bước có cấp xác − 41 − Chương Sử dụng phương pháp tuyến tính đa bước phương pháp BDF vào giải số phương trình vi phân 3.1 Kết hợp phương pháp tuyến tính bước phương pháp BDF bước. .. giải số phương trình vi phân • Chương Trình bày phương pháp tuyến tính đa bước hiển phương pháp BDF −4− • Chương Sử dụng phương pháp tuyến tính đa bước phương pháp BDF vào giải số phương trình vi