Kết hợp hai phương pháp số để giải bài toán cauchy trong phương trình vi phân thường

112 16 0
Kết hợp hai phương pháp số để giải bài toán cauchy trong phương trình vi phân thường

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

TRƯỜNG ĐẠI HỌC SƯ PHẠM ĐÀ NẴNG KHOA TOÁN −−−⋆−−− TRẦN THỊ THẮM KẾT HỢP HAI PHƯƠNG PHÁP SỐ ĐỂ GIẢI BÀI TỐN CAUCHY TRONG PHƯƠNG TRÌNH VI PHÂN THƯỜNG Chun ngành: Cử nhân Tốn ứng dụng KHĨA LUẬN TỐT NGHIỆP HỆ ĐẠI HỌC CHÍNH QUY Người hướng dẫn: Th.S NGUYỄN HỒNG THÀNH Đà Nẵng, 4/2015 Mục lục Lời nói đầu Kiến thức sở 1.1 Phương trình vi phân 1.2 Bài toán Cauchy cách tiếp cận lời giải số 1.3 1.2.1 Định lý tồn nghiệm 1.2.2 Tiếp cận lời giải số Phương pháp số tổng quát 1.3.1 Cấp xác phương pháp số 1.3.2 Tính phù hợp phương pháp số 10 1.3.3 Tính zero - ổn định phương pháp số 12 1.3.4 Sự hội tụ phương pháp số 12 1.4 Phương pháp lặp đơn 13 1.4.1 Phương pháp lặp đơn 13 1.5 Đa thức nội suy Newton lùi với mốc cách 14 1.6 Phương trình Riccati 15 1.6.1 Dạng tắc phương trình Riccati 15 1.6.2 Một số tính chất 15 1.6.3 Dạng đặc biệt phương trình Riccati 16 1.7 Phương pháp Runge - Kutta 16 Các phương pháp số để giải tốn Cauchy phương trình vi phân thường 2.1 19 Các phương pháp tuyến tính đa bước −2− 19 2.1.1 Khái niệm chung 19 2.1.2 Sự hội tụ phương pháp tuyến tính k bước 21 2.1.3 Cấp xác 22 2.2 Phương pháp Adams - Bashforth 22 2.2.1 Xây dựng công thức 22 2.2.2 Một số phương pháp Adams - Bashforth 24 2.3 Phương pháp Adams - Moulton 2.4 26 2.3.1 Xây dựng công thức 26 2.3.2 Một vài công thức Adams - Moulton 28 Phng phỏp Nystroăm 30 2.5 Phương pháp BDF 34 2.5.1 Phát biểu công thức BDF 34 2.5.2 Xét hội tụ cấp xác phương pháp BDF bước, bước 36 2.6 Phương pháp Milne - Simpson 39 2.6.1 2.7 Giới thiệu 39 2.6.2 Cấp xác phương pháp Milne - Simpson 41 2.6.3 Sự hội tụ phương pháp Milne - simpson 43 Phương pháp tuyến tính bước ẩn có cấp xác 44 Dự báo phương pháp tuyến tính đa bước hiển hiệu chỉnh phương pháp tuyến tính đa bước ẩn để giải toán Cauchy phương trình vi phân thường 48 3.1 Kết hợp phương pháp Nystroăm bc v phng phỏp Adams - Moulton bước để giải toán Cauchy 48 3.1.1 Thuật toán 48 3.1.2 Áp dụng giải số ví dụ 49 3.2 Kết hợp phương pháp Adams - Bashforth bước phương pháp tuyến tính bước để giải toán Cauchy 56 3.2.1 Thuật toán 56 3.2.2 Áp dụng giải số ví dụ 57 3.3 Kt hp phng phỏp Nystroăm bước phương pháp Adams - Moulton bước để giải toán Cauchy 65 3.3.1 Thuật toán 65 3.3.2 Áp dụng giải số ví dụ 66 3.4 Kết hợp phương pháp Adams - Bashforth bước phương pháp BDF bước để giải toán Cauchy 75 3.4.1 Thuật toán 75 3.4.2 Áp dụng giải số ví dụ 76 3.5 Kt hp phng phỏp Nystroăm bước phương pháp Milne - Simpson bước để giải toán Cauchy 84 3.5.1 Thuật toán 84 3.5.2 Áp dụng giải số ví dụ 86 Phụ lục 95 Kết luận 111 Tài liệu tham khảo 112 −4− Lời nói đầu Ngày nay, Giải tích Tốn học có biến đổi mạnh mẽ Trong đó, lĩnh vực phương trình vi phân khơng ngừng phát triển có nhiều ứng dụng thực tiễn xuất sở phát triển khoa học, kỹ thuật yêu cầu đòi hỏi thực tế Nhiều toán học, vật lý dẫn đến nghiên cứu phương trình vi phân tương ứng Để nghiên cứu phương trình vi phân, người ta thường tiếp cận theo hai hướng nghiên cứu định tính giải số Việc tìm nghiệm hay nghiệm giải tích số phương trình vi phân khó khăn lớp phương trình vi phân tìm nghiệm giải tích hẹp Trong giải tích số, người ta thường cố gắng tìm phương pháp hữu hiệu bảo đảm hội tụ có cấp 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 đảm bảo xác cao Mục đích khóa luận kết hợp cặp phương pháp số phương pháp Adams - Bashforth, Adams - Moulton, BDF, Nystroăm, Milne - Simpson v phng phỏp tuyn tớnh bước để giải tốn Cauchy phương trình vi phân thường nhằm tìm phương pháp tốt nhất, cho nghiệm xác Khóa luận gồm chương: • Chương 1: Đại cương phương pháp số giải phương trình vi phân • Chương 2: Trình bày phương pháp tuyến tính đa bước làm cặp phương pháp dự báo - hiệu chỉnh −5− • Chương 3: Sử dụng cặp phương pháp tuyến tính đa bước hiển - ẩn làm cặp dự báo - hiệu chỉnh để giải tốn Cauchy phương trình vi phân thường • Phụ lục trình bày code lập trình Maple Ở em lập trình tính tốn Maple vào số ví dụ cụ thể Cuối em xin chân thành cảm ơn thầy hướng dẫn Th.S Nguyễn Hoàng Thành, giới thiệu đề tài, cung cấp tài liệu hướng dẫn em suốt trình thực đề tài mình, hướng dẫn cho em cài đặt sử dụng Latex giúp em thu nhiều kiến thức bổ ích q trình hồn thành luận văn Em xin chân thành cảm ơn thầy Tôn Thất Tú hướng dẫn, giúp em sử dụng phần mềm Maple Đồng thời em xin gửi lời cảm ơn đến thầy khoa Tốn, trường Đại học Sư phạm Đà Nẵng tạo điều kiện giúp đỡ em hoàn thành luận văn 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 25 tháng năm 2015 Sinh viên Trần Thị Thắm −6− Chương Kiến thức sở 1.1 Phương trình vi phân Định nghĩa 1.1 Phương trình vi phân phương trình chứa ẩn hàm số đạo hàm Một phương trình vi phân cấp n thường có dạng y (n) = f (x, y, y ′, ., y (n−1)) F (x, y, y ′, ., y (n−1)) = Nghiệm phương trình vi phân hàm số y = ϕ(x) cho thay y = ϕ(x) vào phương trình vi phân ta đẳng thức 1.2 Bài toán Cauchy cách tiếp cận lời giải số Trong luận văn này, ta đề cập đến phương pháp số để giải tốn tìm giá trị ban đầu Bài tốn tìm giá trị ban đầu cịn gọi tốn Cauchy tốn tìm y(x) cho  y ′ = f (x, y) y(a) = η với f : [a, b] × Rn → Rn , y : [a, b] → Rn , η = (y1 (a), y2 (a), , yn(a)) (1.1) 1.2.1 Định lý tồn nghiệm Định lý 1.1 (Xem [10]) Cho f : [a, b] × Rn → Rn ánh xạ liên tục D = [a, b] × Rn 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 (1.2) Khi tốn Cauchy (1.1) tồn nghiệm y(x) liên tục khả vi D 1.2.2 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 y(x) toán Cauchy (1.1) tập rời rạc [a, b] Đó chia nhỏ [a, b] thành N phần b−a điểm chia {xi }N i=0 định nghĩa xi = + ih, i = 0, N , h = N Tham số h gọi bước nhảy Giả sử y(x) nghiệm hệ (1.1), đặt yn xấp xỉ nghiệm y(xn) (1.1) xn Ký hiệu yn ≈ y(xn ) Mục đích ta tìm phương pháp hữu hiệu để tính dãy giá trị xấp N xỉ {yn }N n=0 nghiệm (1.1) tập rời rạc {xn }n=0 Định nghĩa 1.2 Nghiệm số dãy xấp xỉ nghiệm toán (1.1) tập rời rạc [a, b] Định nghĩa 1.3 (Xem [10]) 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=0 , với k số bước 1.3 Phương pháp số tổng quát Định nghĩa 1.4 (Xem [10]) Phương pháp số tổng quát thường có dạng k yn+1 = αj yn+1−j + hφf (yn+1, yn , , yn+1−k, xn+1−k , h) j=1 −8− (1.3) k gọi số bước phương pháp (1.3), h gọi bước nhảy phương pháp (1.3) Với k = phương pháp số (1.3) gọi phương pháp số bước, k ≥ phương pháp số (1.3) gọi phương pháp số đa bước Nếu φf khơng phụ thuộc vào yn+1 phương pháp số (1.3) phương pháp hiển Nếu φf phụ thuộc vào yn+1 phương pháp số (1.3) phương pháp ẩn Ví dụ 1.1 a Phương pháp số yn+1 = yn + hf (xn, yn ) phương pháp hiển bước b Phương pháp số yn+1 = yn + hf (xn+1, yn+1 )là phương pháp ẩn bước c Phương pháp số h yn+1 = yn + [f (xn, yn) + f (xn+1, yn+1)] phương pháp số bước 1.3.1 Cấp xác phương pháp số Định nghĩa 1.5 (Xem [10]) Phương pháp số (1.3) gọi phương pháp 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ới o(hp+1 ) vô bé bậc với hp+1 h → Ví dụ 1.2 −9− a Phương pháp Euler hiển yn+1 = yn + hf (xn, yn ) phương pháp có cấp xác p = Ta có y(xn+1 ) = y(xn + h) = y(xn) + hy ′ (xn) + o(h2 ) ⇒ y(xn+1) − y(xn ) = hy ′ (xn) + o(h2 ) y(xn+1) − y(xn ) − hf (xn, y(xn)) = o(h2 ) b Phương pháp Euler cải tiến ( Phương pháp Euler hình thang) h yn+1 = yn + [f (xn, yn) + f (xn+1, yn+1)] phương pháp có cấp xác p = h Ta có y(xn+1 ) − y(xn ) − [f (xn, y(xn)) + f (xn+1, y(xn+1))] h ′ = y(xn+1) − y(xn) − [y (xn) + y ′ (xn+1)] h = y(xn + h) − y(xn ) − [y ′(xn) + y ′ (xn + h)] 2 h h = y(xn)+hy ′ (xn)+ y ′′ (xn)+o(h3)−y(xn)− [y ′ (xn)+y ′ (xn)+hy ′′ (xn) 2 +o(h2 )] = o(h3) 1.3.2 Tính phù hợp phương pháp số Đặt R(xn+1) = y(xn+1 )−[ k αj yn+1−j +hφf (yn+1, yn, , yn+1−k, xn+1−k , h)] j=1 Định nghĩa 1.6 R(xn+1) gọi sai số chặt cụt Định nghĩa 1.7 (Xem [10]) Phương pháp số (1.3) gọi phù hợp R(xn+1) =0 h→0 h lim Hệ 1.1 (Xem [10]) Phương pháp số (1.3) có cấp xác p ≥ phù hợp Ví dụ 1.3 − 10 − a:=parse(gtn[2]); b:=parse(gtn[3]); y0:=parse(gtn[5]); h := evalf((b-a)/n); f := unapply(ham, x, y): epsilon:=10^(-20): nmax:=100: >x[0]:=a: h1 := evalf((1/2)*h,25): x01:=evalf(x[0]+h1,20): x[1]:=evalf(x[0]+h, 25): x[2]:=evalf(x[1]+h, 25): yh[0]:=evalf(y0,25): 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((1/2)*yd[0]+(1/2)*y01+h1*((3/8)*f(x[1], H[1][0])+f(x01,y01)+(1/8)*f(x[0],yd[0])),25): i:=1: while abs(H[1][i]-H[1][i-1])>epsilon i:=i+1; H[1][i]:=evalf((1/2)*yd[0]+(1/2)*y01+h1*((3/8)*f(x[1], H[1][i-1])+f(x01,y01)+(1/8)*f(x[0],yd[0])),25); if i>nmax then break; end if; end do: yh[1]:=H[1][i]; yd[2]:=evalf(yd[1]+(1/2)*h*(3*f(x[1], yd[1])-f(x[0], yd[0])), 25); H[2][0]:=yd[2]: H[2][1]:=evalf((1/2)*yh[0]+(1/2)*yh[1]+h*((3/8)*f(x[2],H[2][0]) +f(x[1],yh[1])+(1/8)*f(x[0],yh[0])),25); i:=1: while evalf(abs(H[2][i]-H[2][i-1]),20)>epsilon i:=i+1; H[2][i]:=evalf((1/2)*yh[0]+(1/2)*yh[1]+h*((3/8)*f(x[2],H[2] − 98 − [i-1])+f(x[1],yh[1])+(1/8)*f(x[0],yd[0])),25); if i>nmax then break; end if; end do; yh[2]:=H[2][i]; for i from to n yd[i]:=evalf(yh[i-1]+h*((3/2)*f(x[i-1],yh[i-1])-((1/2)*f(x[i-2], yh[i-2]))),25); H[i][0]:=yd[i]; H[i][1]:=evalf((1/2)*yh[i-2]+(1/2)*yh[i-1]+h*((3/8)*f(x[i], H[i][0])+f(x[i-1],yh[i-1])+(1/8)*f(x[i-2],yh[i-2])),25): j:=1: while abs(H[i][j]-H[i][j-1])>epsilon j:=j+1; H[i][j]:=evalf((1/2)*yh[i-2]+(1/2)*yh[i-1]+h*((3/8)*f(x[i], H[i][j-1])+f(x[i-1],yh[i-1])+(1/8)*f(x[i-2],yh[i-2])),25): if j>nmax then break; end if; end do: yh[i]:=H[i][j]; 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 để 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‘); − 99 − 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, 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 Nystroăm bc v Adams - Moulton bc giải số phương trình vi phân − 100 − restart; with(Maplets[Elements]): GD:=Maplet([ ["Nhap ham f(x,y)= ",TextField[f]("x*exp(x)-y*cos(x)")], [ "Nhap a= ", TextField[a]("0"), " b= ", TextField[b]("1")], [ "Nhap n= ", TextField[n]("1000"), " y0= ", TextField[y0] ("0")], [Button("Chon", 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^(-20): nmax:=1000: for i from to n x[i]:=a+i*h: end do: yd[0]:=evalf(y0,25): yh[0]:=y0:x[0]:=a: x[1]:=x[0]+h:x[2]:=x[1]+h:x[3]:=x[2]+h:x[4]:=x[3]+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],y01))-h*(3/2)*f(x[0]+(h/2), y02),25); y04:=evalf( yd[0]+h*(4/3*f(x[0]+1/2*h,y02))-h*(1/3*f(x[0]-h, y03)),25); y[1]:=evalf( yd[0]+h*((1/6)*f(x[0],y01)+(2/3)*f(x[0]+h*(1/2), y02)+(1/6)*f(x[0]+h,y04)),25); − 101 − 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],y1[1])-h*(3/2)*f(x[1]+h/2, y1[2]),25); y1[4]:=evalf( y[1]+h*(4/3)*f(x[1]+(1/2)*h,y1[2])-h*(1/3)*f(x[1] -h,y1[3]),25); y[2]:=evalf( y[1]+h*((1/6)*f(x[1],y1[1])+(2/3)*f(x[1]+h*(1/2), y1[2])+(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]: yd[3]:=evalf(yd[1]+2*h*f(x[0],yh[0])); H[3][0]:=yd[3]: H[3][1]:=evalf(yh[2]+h*((3/8)*f(x[3],H[3][0])+(19/24)*f(x[2], yh[2]) -(5/24)*f(x[1],yh[1])+(1/24)*f(x[0],yh[0])),25); i:=1: while evalf(abs(H[3][i]-H[3][i-1]),20)>epsilon i:=i+1; H[3][i]:=evalf(yh[2]+h*((3/8)*f(x[3],H[3][i-1])+(19/24)*f(x[2], yh[2]) -(5/24)*f(x[1],yh[1])+(1/24)*f(x[0],yh[0])),25); if i>nmax then break; end if; end do; yh[3]:=H[3][i]; for i from to n yd[i]:=evalf(yh[i-2]+2*h*f(x[i-1],yh[i-1]),25); H[i][0]:=yd[i]: H[i][1]:=evalf(yh[i-1]+h*((3/8)*f(x[i],H[i][0])+(19/24)*f(x[i-1], yh[i-1]) -(5/24)*f(x[i-2],yh[i-2])+(1/24)*f(x[i-3],yh[i-3])),25); j:=1: while abs(H[i][j]-H[i][j-1])>epsilon − 102 − j:=j+1: H[i][j]:=evalf(yh[i-1]+h*((3/8)*f(x[i],H[i][j-1])+(19/24) *f(x[i-1],yh[i-1]) -(5/24)*f(x[i-2],yh[i-2])+(1/24)*f(x[i-3],yh[i-3])),25); if j>nmax then break; end if; end do: yh[i]:=H[i][j]; 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 để 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)),15): 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 %20A %20A\n",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; p1:=plot(ngh(t),t=a b,color=red,legend="Nghiệm xác"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue,style=point ,legend="Nghiệm hiệu chỉnh"): − 103 − plots[display](p1,p2); Code: Kết hợp phương pháp Adams - Bashforth bước BDF bước giải số phương trình vi phân restart; with(Maplets[Elements]): GD:=Maplet([ ["Nhap ham f(x,y)= ",TextField[f]("y+exp(x)*cos(y)")], [ "Nhap a= ", TextField[a]("0"), " b= ", TextField[b]("0.1")], [ "Nhap n= ", TextField[n]("100"), " y0= ", TextField[y0] ("0")],[Button("Chon", 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^(-20): nmax:=100: for i from to n x[i]:=a+i*h: end do: yd[0]:=evalf(y0,25): yh[0]:=y0:x[0]:=a: x[1]:=x[0]+h:x[2]:=x[1]+h:x[3]:=x[2]+h:x[4]:=x[3]+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],y01))-h*(3/2)*f(x[0]+(h/2), y02),25); y04:=evalf( yd[0]+h*(4/3*f(x[0]+1/2*h,y02))-h*(1/3*f(x[0]-h, − 104 − y03)),25); y[1]:=evalf( yd[0]+h*((1/6)*f(x[0],y01)+(2/3)*f(x[0]+h*(1/2), y02)+(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],y1[1])-h*(3/2)*f(x[1]+h/2, y1[2]),25); y1[4]:=evalf( y[1]+h*(4/3)*f(x[1]+(1/2)*h,y1[2])-h*(1/3)* f(x[1]-h,y1[3]),25); y[2]:=evalf( y[1]+h*((1/6)*f(x[1],y1[1])+(2/3)*f(x[1]+h*(1/2), y1[2])+(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]: yd[3]:=evalf(yh[2]+h*((23/12)*f(x[2],yh[2])-(4/3)*f(x[1],yh[1]) +(5/12)*f(x[0],yh[0])),25); H[3][0]:=yd[3]: H[3][1]:=evalf((18/11)*yh[2]-(9/11)*yh[1]+(6/11)*h*f(x[3], H[3][0])+(2/11)*yh[0],25); i:=1: while evalf(abs(H[3][i]-H[3][i-1]),20)>epsilon i:=i+1; H[3][i]:=evalf((18/11)*yh[2]-(9/11)*yh[1]+(6/11)*h*f(x[3], H[3][i-1])+(2/11)*yh[0],25); if i>nmax then break; end if; end do; yh[3]:=H[3][i]; for i from to n yd[i]:=evalf(yh[i-1]+h*((23/12)*f(x[i-1],yh[i-1])-(4/3)*f(x[i-2], yh[i-2])+(5/12)*f(x[i-3],yh[i-3])),25); − 105 − H[i][0]:=yd[i]: H[i][1]:=evalf((18/11)*yh[i-1]-(9/11)*yh[i-2]+(6/11)*h*f(x[i], H[i][0])+(2/11)*yh[i-3],25); j:=1: while abs(H[i][j]-H[i][j-1])>epsilon j:=j+1: H[i][j]:=evalf((18/11)*yh[i-1]-(9/11)*yh[i-2]+(6/11)*h*f(x[i], H[i][j-1])+(2/11)*yh[i-3],25); if j>nmax then break; end if; end do: yh[i]:=H[i][j]; 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 để 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)),15): 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 %20A %20A\n",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]))); − 106 − end do; p1:=plot(ngh(t),t=a b,color=red,legend="Nghiệm xác"): p2:=plot([seq([x[i],yh[i]],i=0 n)],color=blue,style=point ,legend="Nghim hiu chnh"): plots[display](p1,p2); Code: Kt hp phng phỏp Nystroăm bước Milne - Simpson bước giải số phương trình vi phân restart; with(Maplets[Elements]): Digits:=20: GD:=Maplet([ ["Nhap ham f(x,y)= ",TextField[f]("x^3+y^2")], [ "Nhap a= ", TextField[a]("0"), " b= ", TextField[b]("1")], [ "Nhap n= ", TextField[n]("1000"), " y0= ", TextField[y0] ("0")], [Button("Chon", 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:= 1e-19; nmax:=1000: for i from to n x[i]:=a+i*h: end do: yh[0]:=evalf(y0,25): yd[0]:=evalf(y0,25): − 107 − for z from to Y[z-1][1]:=yh[z-1]: Y[z-1][2]:=yh[z-1]+(1/2)*h*f(x[z-1],Y[z-1][1]): Y[z-1][3]:=yh[z-1]+h*((1/2)*f(x[z-1],Y[z-1][1])-(3/2) *f(x[z-1]+(1/2)*h,Y[z-1][2])): Y[z-1][4]:=yh[z-1]+h*((4/3)*f(x[z-1]+(1/2)*h,Y[z-1][2]) -(1/3)*f(x[z-1]-h,Y[z-1][3])): yd[z]:=evalf(yh[z-1]+h*((1/6)*f(x[z-1],Y[z-1][1])+ (2/3)*f(x[z-1]+(1/2)*h,Y[z-1][2])+(1/6)*f(x[z-1]+h,Y[z-1] [4])),15): yh[z]:=yd[z]: end do; yd[4]:=yd[2]+h*((7/3)*f(x[3],yh[3])-(2/3)*f(x[2],yh[2]) +(1/3)*f(x[1],yh[1])): H[4][0]:=yd[4]: H[4][1]:=evalf(yh[2]+(29/90)*h*f(x[4],H[4][0])+(124/90) *h*f(x[3],yh[3])+(24/90)*h*f(x[2],yh[2])+(4/90)*h*f(x[1], yh[1])-(1/90)*h*f(x[0],yh[0]),25); i:=1: while evalf(abs(H[4][i]-H[4][i-1]),20)>epsilon i:=i+1; H[4][i]:=evalf(yh[2]+(29/90)*h*f(x[4],H[4][i-1])+(124/90) *h*f(x[3],yh[3])+(24/90)*h*f(x[2],yh[2])+(4/90)*h*f(x[1], yh[1])-(1/90)*h*f(x[0],yh[0]),25): if i>nmax then break; end if; end do; yh[4]:=H[4][i]: for i from to n yd[i]:=yh[i-2]+h*((7/3)*f(x[i-1],yh[i-1])-(2/3) *f(x[i-2],yh[i-2])+(1/3)*f(x[i-3],yh[i-3])); H[i][0]:=yd[i]; − 108 − H[i][1]:=evalf(yh[i-2]+(29/90)*h*f(x[i],H[i][0])+(124/90) *h*f(x[i-1],yh[i-1])+(24/90)*h*f(x[i-2],yh[i-2])+(4/90)*h *f(x[i-3],yh[i-3])-(1/90)*h*f(x[i-4],yh[i-4]),25): j:=1: while abs(H[i][j]-H[i][j-1])>epsilon j:=j+1; H[i][j]:=evalf(yh[i-2]+(29/90)*h*f(x[i],H[i][j-1])+(124/90) *h*f(x[i-1],yh[i-1])+(24/90)*h*f(x[i-2],yh[i-2])+(4/90) *h*f(x[i-3],yh[i-3])-(1/90)*h*f(x[i-4],yh[i-4]),25); if j>nmax then break; end if; end do: yh[i]:=H[i][j]; 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 để 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)),15): 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 %20A %20A\n",x[i*n/10] ,yd[i*n/10],yh[i*n/10],evalf(ngh(x[i*n/10])),evalf(abs(ngh − 109 − (x[i*n/10])-yd[i*n/10])),evalf(abs(ngh(x[i*n/10])-yh[i*n/10]))); end do; p1:=plot(ngh(t),t=a b,color=red,legend="Nghiệm xác"): 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); − 110 − Kết luận Khóa luận tìm hiểu khái niệm sở giải tích số, trình bày rõ ràng cách thành lập phương pháp số Adams - Bashforth, Adams - Moulton, BDF, phương pháp tuyến tính bước ẩn cú cp chớnh xỏc bng 3, Nystroăm v Milne Simpson, kết hợp hai số phương pháp Adams - Bashforth, Adams - Moulton, BDF, phương pháp tuyến tính bước ẩn có cấp xác 3, Nystroăm v Milne Simpson gii phng trỡnh vi phân thường Nghiên cứu việc kết hợp nhiều phương pháp số 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 Hi vọng khóa luận nghiên cứu sâu nữa, kết hợp phương pháp bậc cao để tăng độ xác cho tốn − 111 − Tài liệu tham khảo [1] Phạm Kỳ Anh, Giải tích số, Nhà xuất DHQD Hà Nội, 2000 [2] Butcher.J.C (John Charles), Numerical methods for ordinary differential equations (second edition), John Wiley & Sons, Ltd, 2008 [3] Dahlquits, Convergence and stability in the numerical integration of ordinary differential equation, Math Scand 4, 1956, pp 33 - 53 [4] Phạm Văn Hạp, Lê Đình Thịnh, Phương pháp tính thuật toán, NXB Giáo dục, 2000 [5] Henrici, Discrete variable methods in ordinary differential equation, Wiley, New York, 1962 [6] 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 [7] Dỗn Tam Hịe, Tốn học tính tốn, NXB Giáo dục,2005 [8] Isaascon and H.B Keller, Analysis of numerical methods, Wiley, New York, 1966 [9] Arieh Iserles, A first course in the numerical analysis of differential equation (second edition), Cambridge University Press, New York, 2009 [10] J.D Lambert, Numerical methods for ordinary differential systems, John Wiley and Sons Ltd, 1993 [11] B V Ramana, Higher engineering mathematics, McGraw-Hill , 2006 − 112 − ... Nghiệm phương trình vi phân hàm số y = ϕ(x) cho thay y = ϕ(x) vào phương trình vi phân ta đẳng thức 1.2 Bài toán Cauchy cách tiếp cận lời giải số Trong luận văn này, ta đề cập đến phương pháp số để. .. Simpson v phương pháp tuyến tính bước để giải tốn Cauchy phương trình vi phân thường nhằm tìm phương pháp tốt nhất, cho nghiệm xác Khóa luận gồm chương: • Chương 1: Đại cương phương pháp số giải phương. .. 2015 Sinh vi? ?n Trần Thị Thắm −6− Chương Kiến thức sở 1.1 Phương trình vi phân Định nghĩa 1.1 Phương trình vi phân phương trình chứa ẩn hàm số đạo hàm Một phương trình vi phân cấp n thường có

Ngày đăng: 18/05/2021, 12:46

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan