Professional Documents
Culture Documents
Đà Nẵng - 2012
Mục lục
−1−
2.1.1 Cấp chính xác của phương pháp tuyến tính đa bước 28
2.1.2 Tính phù hợp . . . . . . . . . . . . . . . . . . . . 29
2.1.3 Tính zero - ổn định . . . . . . . . . . . . . . . . . 29
2.1.4 Sự hội tụ của phương pháp tuyến tính k bước . . . 30
2.2 Công thức Adams - Bashforth . . . . . . . . . . . . . . . 30
2.2.1 Xây dựng công thức . . . . . . . . . . . . . . . . . 30
2.2.2 Một vài phương pháp Adams - Bashforth . . . . . 32
2.2.3 Các phương pháp Adams - Bashforth bậc cao . . . 36
2.3 Công thức Adams - Moulton . . . . . . . . . . . . . . . . 40
2.3.1 Xây dựng công thức . . . . . . . . . . . . . . . . . 40
2.3.2 Một vài công thức Adams - Moulton . . . . . . . . 42
2.3.3 Các phương pháp Adams - Moulton bậc cao . . . . 44
Phụ lục 73
−2−
LỜI CẢM ƠN
Em xin bày tỏ lòng biết ơn sâu sắc tới thầy Nguyễn Hoàng Thành,
người đã giới thiệu đề tài, cung cấp tài liệu và tận tình hướng dẫn em
trong suốt quá trình thực hiện khóa luận. Em xin chân thành cảm ơn
thầy Tôn Thất Tú đã giúp đỡ em cách cài đặt và sử dụng Latex, cách lập
trình Maple ứng dụng giải số phương trình vi phân.
Em cũng xin bày tỏ lòng biết ơn chân thành tới toàn thể các thầy cô
giáo trong khoa Toán, trường Đại học Sư phạm, Đại học Đà Nẵng đã
cho em những kiến thức toán học bổ ích trong suốt quá trình học tập tại
trường.
Nhân dịp này em cũng xin được gửi lời cảm ơn chân thành tới gia
đình, bạn bè đã luôn bên em, cổ vũ, động viên, giúp đỡ em trong suốt
quá trình học tập và thực hiện khóa luận tốt nghiệp.
−3−
LỜI MỞ ĐẦU
Phương trình vi phân là mô hình mô tả khá tốt các qui luật trong tự
nhiên và kỹ thuật. Để nghiên cứu phương trình vi phân, người ta thường
tiếp cận theo hai hướng là nghiên cứu định tính và giải số.
Mặc dù đã có lịch sử phát triển hàng trăm năm, do còn có nhiều bài
toán thuộc lĩnh vực khoa học kỹ thuật quy về việc tìm nghiệm của phương
trình vi phân, giải số phương trình vi phân thường vẫn thu hút sự quan
tâm mạnh mẽ của các nhà toán học và cá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 ra
những phương pháp hữu hiệu bảo đảm sự hội tụ, tính ổn định và tính
chính xác cao. Để làm được điều này người ta thường tổ hợp các phương
pháp đa bước để nhận được các phương pháp mới đảm bảo độ chính xác
cao hơn. Phương pháp đa bước hiện ( yn+1 tính được tường minh thông
qua yn , yn−1 , . . . ) dùng để dự báo (predict ) nghiệm. Phương pháp đa
bước ẩn ( yn+1 tính được bằng cách giải một phương trình phi tuyến
yn+1 = ϕ (yn+1 )) cho lượng hiệu chỉnh nghiệm (corrector). Từ đó có tên
gọi phương pháp dự báo- hiệu chỉnh (predict- corrector viết tắt là P-C).
Trong luận văn này em sẽ sử dụng một cặp phương pháp Adams gồm
phương pháp Adams-Bashforth và phương pháp Adams-Moulton, làm
một cặp phương pháp dự báo- hiệu chỉnh để giải số phương trình vi phân
nhằm tăng độ chính xác của nghiệm.
Bố cục của khóa luận bao gồm ba chương và một phụ lục
• Chương 1 của khóa luận trình bày những khái niệm cơ bản của
phương pháp số giải phương trình vi phân và các kiến thức liên
quan.
• Chương 2 của khóa luận tập trung trình bày cặp phương pháp tuyến
tính đa bước sử dụng làm cặp phương pháp dự báo- hiệu chỉnh là
−4−
phương pháp Adams-Bashforth và phương pháp Adams-Moulton.
• Chương 3 tập trung trình bày ý tưởng, thuật toán sử dụng cặp
phương pháp dự báo- hiệu chỉnh trên để giải số phương trình vi
phân.Cuối chương có sử dụng phần mềm Maple vào giải số một số
ví dụ cụ thể và minh họa bằng hình vẽ.
• Phụ lục trình bày một số đoạn code bằng Maple để giải phương trình
vi phân.
Do thời gian thực hiện khóa luận không nhiều, kiến thức còn hạn chế nên
khi làm khóa luận không tránh khỏi những sai sót. Em rất mong nhận
được sự góp ý và những ý kiến phản biện của quý thầy cô và các bạn.
Xin chân thành cảm ơn!
−5−
Chương 1
Chia [a, b] thành N phần bằng nhau bởi các điểm chia
−6−
Mục đích của ta là tìm một phương pháp hữu hiệu để tính dãy giá trị
xấp xỉ {yn }N N
n=0 nghiệm của bài toán (1.1) trên tập rời rạc {xn }n=0
Định nghĩa 1.1. Cho hàm f(x,y) xác định trên miền D ⊂ R2 . Ta nói f
thỏa điều kiện Lipschitz theo biến y trên D nếu tồn tại hằng số dương L
(gọi là hằng số Lipschitz) sao cho
Nhận xét 1.1. Điều kiện Lipschitz là mạnh hơn so với điều kiện giới
∂f
nội của đạo hàm riêng trên D.
∂y
∂f ∂f
Thật vậy, giả sử liên tục và ≤ L khi đó áp dụng định lý
∂y ∂y
Lagrange cho hàm f(x,y) theo biến y ta được
∂f
f (x, y1 ) − f (x, y2 ) = (y1 − y2 ) [x, y1 + θ (y2 − y1 )]
∂y
Định lý 1.1. (Xem[13]) Giả sử hàm số f(x,y) trong bài toán Cauchy liên
tục và thỏa mãn điều kiện Lipschitz theo biến y trên hình chữ nhật
( )
D = (x, y) ∈ R2 |x − x0 | ≤ a; |y − y0 | ≤ b
−7−
Chứng minh. Giả sử y(x) là nghiệm của bài toán Cauchy, tích phân 2 vế
của phương trình y 0 (x) = f (x, y) ta được phương trình tích phân đối
với y(x) là
Zx
y (x) = y0 + f (t, y (t)) dt
x0
Ta chứng minh hai bước là sự tồn tại nghiệm và tính duy nhất.
* Sự tồn tại
Ta chứng minh rằng phép lặp Picard hội tụ đều trên I đến một nghiệm
của bài toán Cauchy.
Trước tiên ta chứng minh bằng quy nạp rằng
k |x− x0 |k+1
|yk+1 (x) − yk (x)| ≤ M L ; ∀x ∈ I
(k + 1)!
−8−
Trường hợp x0 − h ≤ x ≤ x0 ta đánh giá tương tự.
Xét dãy hàm {yk (x)} trên I, ta có
|yk+p (x) − yk (x)| ≤ |yk+p (x) − yk+p−1 (x)| + |yk+p−1 (x) − yk+p−2 (x)|
+... + |yk+1 (x) − yk (x)|
( )
k+p k+1
M (L |x − x0 |) (L |x − x0 |)
≤ + ... +
L (k + p)! (k + 1)!
M X (L.h)j
≤ .
L j≥k+1 j!
∞
X (L.h)j X (L.h)j
Chuỗi số là hội tụ cho nên có thể bé tùy ý khi k
j=0
j! j≥k+1
j!
đủ lớn. Theo tiêu chuẩn Cauchy, dãy {yk (x)} hội tụ đều trên I đến hàm
y(x). Để chứng minh y(x) là nghiệm ta chỉ cần qua giới hạn trong đẳng
thức
Zx
yk+1 (x) = y0 + f (t, yk (t)) dt
x0
Vì dãy hàm {yk (x)} hội tụ đều, f liên tục trên hình chữ nhật D nên dãy
hàm {f (t, yk (t))} hội tụ đều trên I đến hàm f (t, yk (t)). Do đó có thể
chuyển giới hạn qua dấu tích phân để được đẳng thức
Zx
y (x) = y0 + f (t, y (t)) dt
x0
−9−
suy ra
x
Z
|y (x) − z (x)| = [f (t, y (t)) − f (t, z (t))] ≤ 2M |x − x0 |
x0
từ đó
Rx Rx
|y (x) − z (x)| = [f (t, y (t)) − f (t, z (t))] ≤ L |y (t) − z (t)|dt
x0 x0
|x − x0 |2
≤ 2M L
2
Lặp lại quá trình trên, ta dễ dàng chứng minh được rằng với mọi số tự
nhiên k ta có
k |x − x0 |k+1
|y (x) − z (x)| ≤ 2M L ; ∀x ∈ I
(k + 1)!
Nhiều bài toán khoa học kỹ thuật quy về việc tìm nghiệm phương
trình vi phân thỏa mãn một số điều kiện nào đó. Những phương pháp
giải đúng chỉ áp dụng được cho một lớp rất hẹp các phương trình vi
phân. Đa số các phương trình vi phân mô tả những hệ cơ học, lý học,
hóa học, sinh học còn phức tạp hơn rất nhiều và không có hy vọng giải
đúng buộc ta phải sử dụng phương pháp giải gần đúng. Người ta phân
biệt có hai loại phương pháp giải gần đúng là các phương pháp giải tích
và các phương pháp số.
− 10 −
Các phương pháp giải tích cho phép tìm nghiệm gần đúng dưới dạng
biểu thức, tuy nhiên miền áp dụng của chúng khá hẹp. Các phương pháp
giải tích thường dùng là phương pháp xấp xỉ Picard và phương pháp
chuỗi nguyên.
Các phương pháp số liên quan đến việc tính nghiệm trên một tập rời
rạc các điểm {xn }N n=0 của đoạn [a, b] được xác định bởi xn = a + nh,
b−a
n = 0, 1, 2, ..., N = . Tham số h được gọi là bước nhảy, nó được coi
h
như một hằng số, mặc dù nhiều thuật toán hiện đại có khả năng thay
đổi h bằng quá trình tính toán tự động. Chúng ta gọi {yn } là một lời giải
xấp xỉ của y (xn ) tại {xn } và đặt mục tiêu là để tìm ra một dãy các giá
trị {yn } của các điểm rời rạc {xn } như một trình tự tạo nên một lời giải
số cho bài toán Cauchy.
Một phương pháp số là một phương trình sai phân liên quan đến một số
liên tiếp xấp xỉ yn+1−i , i = 0, 1, 2, .., k từ đó ta sẽ tính toán theo tuần tự
dãy {yn } , n = 0, 1, 2, ..., N , phương trình sai phân này sẽ liên quan đến
yếu tố hàm f. Số nguyên k được gọi là số bước của phương pháp, nếu
k = 1 thì phương pháp được gọi là phương pháp một bước, khi k > 1
phương pháp được gọi là phương pháp nhiều bước hay k-bước.
Ví dụ 1.1.
h
yn+2 + yn+1 − 2yn = f (xn+2 , yn+2 ) + 8f (xn+1 , yn+1 ) + 3f (xn , yn )
4
Ví dụ 1.2.
h
yn+2 − yn+1 = 3f (xn+1 , yn+1 ) − 2f (xn , yn )
3
Ví dụ 1.3.
1 1 3 h
yn+3 + yn+2 − yn+1 − yn = 19f (xn+2 , yn+2 ) + 5f (xn , yn )
4 2 4 8
− 11 −
Ví dụ 1.4.
∗
yn+2 − yn = h [f (xn+2 , yn+2 ) + f (xn , yn )]
trong đó
∗ h
yn+2 = 3yn+1 − 2yn = f (xn+1 , yn+1 ) − 3f (xn , yn )
2
Ví dụ 1.5.
h
yn+1 − yn = (k1 + 3k3 )
4
ở đây
k1 = f (xn , yn )
2 2
k3 = f xn + h, yn + hk2
3 3
Ví dụ 1.6.
h
yn+1 − yn = (k1 + k2 )
2
ở đây
k1 = f (xn , yn )
1 1
k2 = f xn + h, yn + hk1 + hk2
2 2
Rõ ràng ở ví dụ 1.5 và 1.6 là phương pháp một bước , đặt y0 = η dãy
{yn } có thể được tính toán một cách liên tiếp bởi tập hợp n = 0, 1, 2, ...
trong hằng số sai phân. Ví dụ 1.1, 1.2 và 1.4 là phương pháp 2 bước và nó
cần cung cấp 1 giá trị khởi đầu y1 trước khi dãy {yn } được tính. Trong
trường hợp ví dụ 1.3 là một phương pháp 3 bước, nó cần được cung cấp
2 giá trị ban đầu y1 và y2 . Tìm những giá trị ban đầu không có gì là khó
khăn và ta thường sử dụng các phương pháp một bước.
Một phương pháp số tổng quát thường có dạng
k
X
yn+1 = αj yn+1−j + hΦf (yn+1 , yn , ...yn+1−k , xn+1−k , h) (1.2)
j=1
− 12 −
(trong đó h là bước nhảy; k = 1 là phương pháp số một bước, k ≥ 2 là
phương pháp số đa bước.)
Nếu Φf không phụ thuộc vào yn+1 thì phương pháp (1.2) là phương pháp
hiển. Nếu Φf phụ thuộc vào yn+1 thì phương pháp số (1.2) là phương
pháp ẩn.
Định lý 1.2. (Xem [13]) Phương pháp số (1.2) gọi là phương pháp có
cấp chính xác là p nếu
k
X
y(xn+1 ) − αj y (xn+1−j ) − hφf [y (xn+1 ) , ..., y (xn+1−k ) , xn+1−k , h] = 0(hp+1 )
j=1
Ví dụ 1.7. Tính cấp chính xác của phương pháp Euler hiển
(
yn+1 = yn + hf (xn , yn )
y0 = y(x0 )
Ta có
− 13 −
Ta có
h
y(xn+1 ) − y(xn ) − [f (xn , y(xn )) + f (xn+1 , y(xn+1 ))]
2
h
= y(xn+1 ) − y(xn ) − [y 0 (xn ) + y 0 (xn+1 )]
2
h
= y(xn + h) − y(xn ) − [y 0 (xn ) + y 0 (xn + h)]
2
2
h
= y(xn ) + hy 0 (xn ) + y 00 (xn ) + 0(h3 ) − y(xn )
2
h 0
− [y (xn ) + y 0 (xn ) + hy 00 (xn ) + 0(h2 )] = 0(h3 )
2
Vậy phương pháp Euler ẩn có cấp chính xác p = 2.
Đặt R(xn+1 ) =
k
X
y(xn+1 ) − αj y (xn+1−j ) + hφf [y (xn+1 ) , ..., y (xn+1−k ) , xn+1−k , h]
j=1
là sai số chặt cụt.
Định nghĩa 1.2. (Xem [13]) Phương pháp số (1.2) gọi là phù hợp nếu
R (xn+1 )
lim =0
h→0 h
.
Hệ quả 1.1. Nếu phương pháp số (1.2) có cấp chính xác p ≥ 1 thì
phương pháp số (1.2) là phù hợp.
Định lý 1.3. (Xem [13]) Phương pháp số (1.2) phù hợp khi và chỉ khi
ρ (1) = 0
φf (yn+1 , ..., yn+1−k , xn+1−k , 0)
= f (xn+1−k , yn+1−k )
ρ0 (1)
− 14 −
X k
1− αj = 0
j=1
hay φ f (y n+1 , ..., yn+1−k , xn+1−k , 0)
k
= f (xn+1−k , yn+1−k )
X
k− (k − j) αj
j=1
k
(trong đó ρ(ξ) = ξ k − αj ξ k−j là đa thức đặc trưng thứ nhất của
P
j=1
phương pháp số (1.2) )
Định nghĩa 1.3. Đa thức đặc trưng thứ nhất của phương pháp số (1.2)
gọi là thỏa mãn điều kiện nghiệm nếu mọi nghiệm của nó đều có modul
nhỏ hơn hoặc bằng 1, nghiệm có modul bằng 1 phải là nghiệm đơn.
Định nghĩa 1.4. (Xem [10]) Phương pháp số (1.2) được gọi là zero - ổn
định nếu đa thức đặc trưng thứ nhất thỏa mãn điều kiện nghiệm.
Định nghĩa 1.5. (Xem [3]) Phương pháp số (1.2) gọi là hội tụ nếu
Định lý 1.4. (Xem [10]) Phương pháp số (1.2) hội tụ khi và chỉ khi nó
phù hợp và zero - ổn định .
− 15 −
Để xét tính hội tụ của phương pháp Euler hiển thì theo định lý trên
ta cần xét tính phù hợp và zero - ổn định của nó.
Như ta đã tính cấp chính xác của phương pháp Euler hiển p=1, áp dụng
hệ quả 1.1 ta thấy phương pháp Euler hiển là phù hợp vì có cấp chính
xác p ≥ 1. Hoặc sử dụng định lý 1.3, đa thức đặc trưng thứ nhất là
ρ (ξ) = ξ − 1 khi đó ta cũng suy ra phương pháp Euler hiển phù hợp vì
ρ (1) = 0
φf (yn+1 , ..., yn , xn , 0)
= φf (yn+1 , yn , xn , 0) = f (xn , yn )
ρ0 (1)
Ta có nghiệm của đa thức đặc trưng thứ nhất ξ = 1 thỏa mãn điều kiện
nghiệm. Do đó phương pháp Euler hiển là zero - ổn định. Vậy phương
pháp Euler hiển hội tụ.
− 16 −
1 1
và ρ0 (ξ) = 3ξ 2 + ξ − ⇒ ρ0 (1) = 3
2 2
suy ra
1
φf (yn+1 , yn , yn−1 , yn−2 , xn−2 , h) = 19f (xn , yn ) + 5f (xn−2 , y−2 )
8
⇒ φf (yn+1 , yn , yn−1 , yn−2 , xn−2 , 0) = 3f (xn−2 , yn−2 )
φf (yn+1 , yn , yn−1 , yn−2 , xn−2 , 0)
⇒ = f (xn−2 , yn−2 )
3
Vậy phương pháp số này hội tụ.
Định nghĩa 1.6. (Xem [1]) Giả sử y=f(x) là một hàm số thực, xác định
trên đoạn [a, b], h = const 6= 0 .
Khi đó hiệu số ∆f (x) = f (x + h) − f (x) là sai phân cấp một của hàm
số y=f(x) tại x. Một cách tổng quát
∆0 f (x) = f (x)
∆1 f (x) = f (x + h) − f (x)
.......................................
∆n f (x) = ∆ ∆n−1 f (x) ; n ∈ N, n ≥ 1
lần lượt là sai phân cấp 0, cấp 1,.., cấp n của hàm số y=f(x) tại x.
Chứng minh. Ta có
∆ (xn ) = (x + h)n − xn = nhxn−1 + ...
− 17 −
∆2 (xn ) = ∆ (∆ (xn )) = ∆ nhxn−1 + ... = n (n − 1) h2 xn−2 + ...
...............................
∆n (xn ) = ∆ ∆n−1 (xn ) = n!hn
Chứng minh. Ta có
n
∆n f (x) = [(1 + ∆) − 1]n f (x) = (−1)i Cni (1 + ∆)n−i f (x)
P
i=0
n
i
(−1) Cni f [x + (n − i) h]
P
=
i=0
Tính chất 1.7. Giả sử f ∈ C n [a, b] và (x, x + nh) ⊂ [a, b] khi đó:
∆n f (x)
n
= f (n) (x + θnh) ; θ ∈ (0, 1) (*)
h
Chứng minh. Với n = 1 ta có công thức số gia hữu hạn
f (x + h) − f (x)
= f 0 (x + θh)
h
Giả sử (*) đúng với mọi k ≤ n ta chứng minh cho trường hợp k = n + 1.
Thật vậy
− 18 −
∆n+1 f (x) = ∆ [∆n f (x)] = ∆ hn f (n) (x + θ0 nh) .
Áp dụng công thức số gia hữu hạn cho f (n) (x + θ0 nh), ta được
∆n+1 f (x) = hn ∆f (n) (x + θ0 nh)
= hn f (n) (x + θ0 nh + h) − f (n) (x + θ0 nh)
1.8.2 Đa thức nội suy cuối bảng với mốc cách đều
− 19 −
n suy ra
∆yn−1 = ∇yn
∆2 yn−2 = ∇2 yn
∆3 yn−3 = ∇3 yn
.................
∆k yn−k = ∇k yn
khi đó ta có công thức nội suy Newton dạng sai phân lùi
∇yn ∇ 2 yn ∇n y n
Pn (t) = yn + t+ t (t + 1) + .. + t (t + 1) .. (t + n − 1)
1! 2! n!
(1.3)
x 0 1 2 3 4
y 4 8 13 16 18
Hãy tìm đa thức nội suy Newton ở cuối bảng cho bởi bảng trên.
Ta có
∇y4 = y4 − y3 = 18 − 16 = 2
∇2 y4 = ∇y4 − ∇y3 = y4 − 2y3 + y2 = −1
∇3 y4 = ∇2 y4 − ∇2 y3 = y4 − 3y3 + 3y2 − y1 = 1
∇4 y4 = ∇3 y4 − ∇3 y3 = y4 − 4y3 + 6y2 − 4y1 + y0 = 4
− 20 −
1.9 Phương trình Riccati
trong đó P(x), Q(x), R(x) là các hàm liên tục trên khoảng (a,b) nào đó.
P(x), Q(x) không đồng nhất bằng 0 trên (a,b)
Tính chất 1.8. Nếu biết được một nghiệm của phương trình Riccati thì
có thể đưa nó về phương trình Bernoulli.
Chứng minh. Thật vậy, giả sử y1 (x) là một nghiệm đã biết của phương
trình (1.4) thì ta có
Ta đặt y = y1 (x) + z với z là hàm số phải tìm, thay vào phương trình
− 21 −
(1.4) ta được
y10 + z 0 = p (x) y12 + 2p (x) y1 z + p (x) z 2 + q (x) y1 + q (x) z + r (x)
= p (x) y12 (x) + q (x) y1 (x) + r (x) + 2p (x) y1 (x) z + p (x) z 2 + q (x) z(∗)
Theo giả thiết
z 0 + 2z (z + x) = 0
u0 − 2xu = 2
− 22 −
Vậy nghiệm tổng quát của phương trình đã cho là
2
e−x
y =x+ R ;y = x
C + 2 e−x2 dx
Ví dụ 1.13. Giải phương trình y 0 = xy 2 + x2 y − 2x3 + 1
u0 + 3x2 u = −x
đây là phương trình tuyến tính cấp 1, nghiệm tổng quát của nó là
Z
−x3 x4
u=e C− e xdx
3
ex
y =x+ Z
3
C − ex xdx
y = ϕ (y) , ϕ : Rm → Rm (1.6)
− 23 −
Lập dãy lặp yn+1 = ϕ(yn ) (*) với y0 được cho một cách thích hợp, ta
nhận được dãy {yn }.
Định lý sau chỉ ra điều kiện để phương trình y = ϕ(y)) có duy nhất
nghiệm.
Định lý 1.5. (Xem [13]) Cho ϕ (y) thỏa mãn điều kiện Lipschitz
kϕ (y) − ϕ (y ∗ )k ≤ M ky − y ∗ k
− 24 −
Định nghĩa 1.7. Phương pháp số dạng
s
P
Y
ni
= y n + h aij f (xn + cj h, Ynj ), i = 1, s
j=1
s
P
yn+1 = yn + h bj f (xn + cj h, Ynj )
j=1
0 0 0 0 0
1 1
2 2 0 0 0
1 1
2 0 2 0 0
1 0 0 1 0
1 1 1 1
6 3 3 6
− 25 −
Ví dụ 1.15. Với bảng Butcher
0 0 0 0 0
1 1
2 2 0 0 0
1 −3
-1 2 2 0 0
4 −1
1 0 3 3 0
1 2 1
6 3 0 6
− 26 −
Chương 2
Định nghĩa 2.1. Một phương pháp số gọi là phương pháp tuyến tính k
bước nếu phương pháp số cho bởi
k
X k
X
yn+1 = αj yn+1−j + h βj f (xn+1−j , yn+1−j ) (2.1)
j=1 j=0
− 27 −
2.1.1 Cấp chính xác của phương pháp tuyến tính đa bước
Định lý 2.1. (Xem [10]) Phương pháp số (2.1) có cấp chính xác là p ≥ 1
khi và chỉ khi tồn tại c 6= 0 sao cho
Ví dụ 2.4. Tính cấp chính xác của phương pháp BDF 2 bước
4 1 2
yn+1 = yn − yn−1 + h f (xn+1 , yn+1 )
3 3 3
− 28 −
2.1.2 Tính phù hợp
Định lý 2.2. ( Xem [13] ) Phương pháp số (2.1) phù hợp khi và chỉ khi
ρ (1) = 0
k
X
βj f (xn+1−j , yn+1−j )
j=0
k
= f (xn+1−k , yn+1−k )
X
k− αj (k − j)
j=1
k
X
1−
αj = 0
j=1
Xk
⇔ βj
j=0
[f (xn+1−k , yn+1−k )] k
= f (xn+1−k , yn+1−k )
X
k− αj (k − j)
j=1
Xk
αj = 1
j=1
⇔ k k
X X
βj = k − αj (k − j)
j=0 j=1
Định nghĩa 2.2. Đa thức đặc trưng thứ nhất của phương pháp số (2.1)
gọi là thỏa mãn điều kiện nghiệm nếu mọi nghiệm của nó đều có modul
nhỏ hơn hoặc bằng 1, nghiệm có modul bằng 1 phải là nghiệm đơn.
Định nghĩa 2.3. ( Xem [13] ) Phương pháp số (2.1) được gọi là zero -
ổn định nếu đa thức đặc trưng thứ nhất thỏa mãn điều kiện nghiệm.
− 29 −
2.1.4 Sự hội tụ của phương pháp tuyến tính k bước
Định lý 2.3. (Xem [13]) Phương pháp số (2.1) hội tụ khi và chỉ khi nó
phù hợp và zero - ổn định
Xét bài toán Cauchy (1.1), tích phân 2 vế từ xn đến xn+1 của phương
trình y 0 (x) = f (x, y(x)) ta có
x
Zn+1 x
Zn+1
y 0 (x) dx = f (x, y(x))dx
xn xn
− 30 −
x
Zn+1
⇒ y (xn+1 ) − y (xn ) = f (x, y(x))dx
xn
x
Zn+1
⇒ y (xn+1 ) = y (xn ) + f (x, y(x))dx
xn
x
Zn+1
⇒ yn+1 = yn + y 0 (x)dx
xn
Đặt x = xn + th ta có
Z1
yn+1 = yn + h y 0 (xn + th)dt (2.2)
0
Áp dụng công thức nội suy Newton lùi cho y 0 n+t := y 0 (xn + th) ta được
k
X
yn+1 = yn + h ai ∇i yn0 (2.4)
i=0
trong đó
Z1
t (t + 1) ... (t + i − 1)
a0 = 1; ai = dt; i = 1, k
i!
0
− 31 −
Z1
t (t + 1) (t + 2) 3
a3 = dt =
3! 8
0
Z1
t (t + 1) (t + 2) (t + 3) 251
a4 = dt =
4! 720
0
Z1
t (t + 1) (t + 2) (t + 3) (t + 4) 95
a5 = dt =
5! 288
0
Z1
t (t + 1) (t + 2) (t + 3) (t + 4) (t + 5) 19087
a6 = dt =
6! 60480
0
Z1
t (t + 1) (t + 2) (t + 3) (t + 4) (t + 5) (t + 6) 5257
a7 = dt =
7! 17280
0
Z1
t (t + 1) (t + 2) (t + 3) (t + 4) (t + 5) (t + 6) (t + 7) 1070017
a8 = dt =
8! 3628800
0
Z1
t (t + 1) (t + 2) ..... (t + 8) 25713
a9 = dt =
9! 89600
0
Z1
t (t + 1) (t + 2) ..... (t + 9) 26842253
a10 = dt =
10! 95800320
0
Suy ra công thức Adams - Bashforth
1 5 3 251 4 95 5 19087 6
yn+1 = yn + h 1 + ∇ + ∇2 + ∇3 + ∇ + ∇ + ∇
2 12 8 720 288 60480
5257 7 1070017 8 25713 9 26842253 10
+ ∇ + ∇ + ∇ + ∇ + ..... yn0 (2.5)
17280 3628800 89600 95800320
Ví dụ 2.6. Phương
pháp Adams - Bashforth 4 bước
55 59 37
yn+1 = yn + h f (xn , yn ) − f (xn−1 , yn−1 ) + f (xn−2 , yn−2 )−
24 24 24
− 32 −
3
− f (xn−3 , yn−3 )
8
Đa thức đặc trưng thứ nhất
ρ (ξ) = ξ 4 − ξ 3
nhận thấy ρ (ξ) thỏa mãn điều kiện nghiệm do đó phương pháp trên
zero - ổn định.
Ta có
X4
αj = α1 = 1
j=1
4
X 55 59 37 3
βj = β0 + β1 + β2 + β3 + β4 = 0 + − + − =1
j=0
24 24 24 8
4
X
4− αj (4 − j) = 4 − (4 − 1) = 1
j=1
− 33 −
Ví dụ 2.7. Phương
pháp Adams - Bashforth 5 bước
1901 1387 109
yn+1 = yn + h f (xn , yn ) − f (xn−1 , yn−1 ) + f (xn−2 , yn−2 )−
720 360 30
637 251
− f (xn−3 , yn−3 ) + f (xn−4 , yn−4 )
360 720
Đa thức đặc trưng thứ nhất
ρ (ξ) = ξ 5 − ξ 4
đa thức đặc trưng thứ nhất thỏa mãn điều kiện nghiệm suy ra phương
pháp trên zero - ổn định.
Xét
5
X
αj = α1 = 1
j=1
X5 5
X
βj = 5 − αj (5 − j) = 1
j=0 j=1
− 34 −
Ví dụ 2.8. Phương
pháp Adams - Bashforth 6 bước
4277 2641 4991
yn+1 = yn + h f (xn , yn ) − f (xn−1 , yn−1 ) + f (xn−2 , yn−2 )−
1440 480 720
3649 959 95
− f (xn−3 , yn−3 ) + f (xn−4 , yn−4 ) − f (xn−5 , yn−5 )
720 480 288
ρ (ξ) = ξ 6 − ξ 5
Đa thức đặc trưng thứ hai
4277 5 2641 4 4991 3 3649 2 959 95
σ (ξ) = ξ − ξ + ξ − ξ + ξ−
1440 480 720 720 480 288
Khi đó
6 5
+ 1) − σ(ξ + 1) ln(ξ + 1) = [(ξ + 1) − (ξ + 1) ]−
ρ(ξ
4277 2641 4991 3649
(ξ + 1)5 − (ξ + 1)4 + (ξ + 1)3 − (ξ + 1)2 +
1440 480 720 720
2 3 4 5 6 7
959 95 ξ ξ ξ ξ ξ ξ 19087 7
+ (ξ +1)− ξ − + − + − + ... = ξ +0(ξ 8 )
480 288 2 3 4 5 6 7 60480
Vậy phương pháp Adams - Bashforth 6 bước có cấp chính xác p = 6
Ta lại có
ρ (ξ) = 0 ⇒ ξ 6 − ξ 5 = 0 ⇒ ξ1,..,5 = 0, ξ6 = 1
đa thức đặc trưng thứ nhất thỏa mãn điều kiện nghiệm suy ra phương
pháp trên zero - ổn định.
Xét
X6
αj = α1 = 1
j=1
6
X 4277 2641 4991 3649 959 95
βj = 0 + − + − + − =1
j=0
1440 480 720 720 480 288
5
X
6− αj (6 − j) = 6 − (6 − 5) = 1
j=1
− 35 −
2.2.3 Các phương pháp Adams - Bashforth bậc cao
ρ (ξ) = ξ 9 − ξ 8
− 36 −
862303 4 45586321 3 19416743 2 4832053 1070017
+ ξ − ξ + ξ − ξ+
22680 1814400 1814400 1814400 3628800
Khi đó
ρ(ξ + 1) − σ(ξ + 1) ln(ξ + 1) = [(ξ + 1)9 − (ξ + 1)8 ]−
14097247 21562603 47738393
− (ξ + 1)8 − (ξ + 1)7 + (ξ + 1)6 −
3628800 1814400 1814400
69927631 862303 45586321
− (ξ + 1)5 + (ξ + 1)4 − (ξ + 1)3 +
1814400 22680 1814400
19416743 4832053 1070017
+ (ξ + 1)2 − (ξ + 1) +
1814400 1814400 3628800
ξ 2 ξ 3 ξ 4 ξ 5 ξ 6 ξ 7 ξ 8 ξ 9 ξ 10
ξ− + − + − + − + − ...
2 3 4 5 6 7 8 9 10
25713 10
= ξ + 0(ξ 11 )
89600
nhận thấy ρ (ξ) thỏa mãn điều kiện nghiệm do đó phương pháp trên
zero - ổn định.
Xét
X 9
αj = α1 = 1
j=1
9
14097247 21562603 47738393 69927631 862303
X
βj = − + − + −
j=0
3628800 1814400 1814400 1814400 22680
45586321 19416743 4832053 1070017
− + − + =1
1814400 1814400 1814400 3628800
X9
9− αj (9 − j) = 9 − (9 − 1) = 1
j=1
− 37 −
suy ra phương pháp trên cũng phù hợp.
Vậy phương pháp Adams - Bashforth 9 bước hội tụ.
* Với k = 10 ta
cũng tìm được phương pháp Adams - Bashforth 10 bước
4325321 104995189
yn+1 = yn + h f (xn , yn ) − f (xn−1 , yn−1 )+
1036800 7257600
6648317 28416361
+ f (xn−2 , yn−2 ) − f (xn−3 , yn−3 )+
181440 453600
269181919 222386081
+ f (xn−4 , yn−4 ) − f (xn−5 , yn−5 )+
3628800 3628800
15788639 2357683
+ f (xn−6 , yn−6 ) − f (xn−7 , yn−7 )+
453600 181440
20884811 25713
+ f (xn−8 , yn−8 ) − f (xn−9 , yn−9 )
7257600 89600
Ta tính cấp chính xác và xét sự hội tụ của phương pháp Adams - Bash-
forth 10 bước.
Đa thức đặc trưng thứ nhất
ρ (ξ) = ξ 10 − ξ 9
Khi đó
ρ(ξ + 1) − σ(ξ + 1) ln(ξ + 1) = [(ξ + 1)10 − (ξ + 1)9 ]−
4325321 104995189 6648317
− (ξ + 1)9 − (ξ + 1)8 + (ξ + 1)7 −
1036800 7257600 181440
− 38 −
28416361 269181919 222386081
− (ξ + 1)6 + (ξ + 1)5 − (ξ + 1)4 +
453600 3628800 3628800
15788639 2357683 20884811 25713
+ (ξ + 1)3 − (ξ + 1)2 + (ξ + 1) −
453600 181440 7257600 89600
ξ 2 ξ 3 ξ 4 ξ 5 ξ 6 ξ 7 ξ 8 ξ 9 ξ 10 ξ 11
ξ− + − + − + − + − + − ...
2 3 4 5 6 7 8 9 10 11
26842253 11
= ξ + 0(ξ 12 )
95800320
− 39 −
3539798831 82260679
+ f (xn−4 , yn−4 ) − f (xn−5 , yn−5 )+
26611200 623700
2492064913 186080291
+ f (xn−6 , yn−6 ) − f (xn−7 , yn−7 )+
26611200 3991680
2472634817 52841941
+ f (xn−8 , yn−8 ) − f (xn−9 , yn−9 )+
159667200 17107200
26842253
f (xn−10 , yn−10 )
95800320
k
X
0
yn+1 = yn + h ai ∇i yn+1 (2.7)
i=0
trong đó
Z1
(t − 1)t... (t + i − 2)
a0 = 1; ai = dt; i = 1, k
i!
0
− 40 −
Z1
(t − 1) t 1
a2 = dt = −
2! 12
0
Z1
(t − 1) t (t + 1) 1
a3 = dt = −
3! 24
0
Z1
(t − 1) t (t + 1) (t + 2) 19
a4 = dt = −
4! 720
0
Z1
(t − 1) t (t + 1) (t + 2) (t + 3) 3
a5 = dt = −
5! 160
0
Z1
(t − 1) t (t + 1) (t + 2) (t + 3) (t + 4) 863
a6 = dt = −
6! 60480
0
Z1
(t − 1) t (t + 1) (t + 2) (t + 3) (t + 4) (t + 5) 275
a7 = dt = −
7! 24192
0
Z1
(t − 1) t (t + 1) ..... (t + 6) 33953
a8 = dt = −
8! 3628800
0
Z1
(t − 1) t (t + 1) ..... (t + 7) 8183
a9 = dt = −
9! 1036800
0
Suy ra công thức Adams - Moulton
1 1 1 19 4 3 5 863 6
yn+1 = yn + h 1 − ∇ − ∇2 − ∇3 − ∇ − ∇ − ∇
2 12 24 720 160 60480
275 7 33953 8 8183 0
− ∇ − ∇ − ∇9 − .... yn+1
24192 3628800 1036800
(2.8)
− 41 −
2.3.2 Một vài công thức Adams - Moulton
ρ (ξ) = ξ 2 − ξ
ρ (ξ) thỏa mãn điều kiện nghiệm do đó phương pháp trên zero - ổn định.
Xét
2
X
αj = α1 = 1
j=1
2
X 5 2 1
βj = + − =1
j=0
12 3 12
2
X
2− αj (2 − j) = 2 − (2 − 1) = 1
j=1
− 42 −
Ví dụ 2.10. Công
thức Adams - Moulton 3 bước
3 19 5
yn+1 = yn + h f (xn+1 , yn+1 ) + f (xn , yn ) − f (xn−1 , yn−1 )+
8 24 24
1
+ f (xn−2 , yn−2 )
24
ρ (ξ) = ξ 3 − ξ 2
ξ2 ξ3 ξ4 ξ5
3 3 19 2 5 1
− (ξ + 1) + (ξ + 1) − (ξ + 1) + ξ− + − +
8 24 24 24 2 3 4 5
ξ6
19 5
− ... = − ξ + 0(ξ 6 )
6 720
Vậy cấp chính xác của phương pháp Adams - Moulton 3 bước là p = 4
Ta có
ρ (ξ) = 0 ⇒ ξ 3 − ξ 2 = 0 ⇒ ξ1,2 = 0, ξ3 = 1
ρ (ξ) thỏa mãn điều kiện nghiệm do đó phương pháp trên zero - ổn định.
Xét
3
X
αj = α1 = 1
j=1
3
X 3 19 5 1
βj = + − + =1
j=0
8 24 24 24
3
X
3− αj (3 − j) = 3 − (3 − 1) = 1
j=1
− 43 −
suy ra phương pháp trên phù hợp.
Vậy phương pháp Adams - Moulton 3 bước hội tụ.
Tính cấp chính xác và xét sự hội tụ của phương pháp trên.
− 44 −
Đa thức đặc trưng thứ nhất
ρ(ξ) = ξ 8 − ξ 7
Khi đó
ρ(ξ + 1) − σ(ξ + 1) ln(ξ + 1) = [(ξ + 1)8 − (ξ + 1)7 ]−
1070017 2233547 2302297
− (ξ + 1)8 + (ξ + 1)7 − (ξ + 1)6 +
3628800 1814400 181440
2797679 31457 1573169
+ (ξ + 1)5 − (ξ + 1)4 + (ξ + 1)3 −
1814400 22680 1814400
ξ2 ξ3
645607 2 156437 33953
− (ξ + 1) + (ξ + 1) − ξ− + −
1814400 1814400 3628800 2 3
ξ 4 ξ 5 ξ 6 ξ 7 ξ 8 ξ 9 ξ 10 ξ 11 ξ 12 ξ 13 ξ 14 ξ 15 ξ 16
− + − + − + − + − + − + − ...
4 5 6 7 8 9 10 11 12 13 14 15 16
8183 10
=− ξ + 0(ξ 11 )
1036800
Vậy cấp chính xác của phương pháp Adams - Moulton 8 bước là p = 9.
Ta có
ρ (ξ) = 0 ⇒ ξ 8 − ξ 7 = 0 ⇒ ξ1,..,7 = 0, ξ8 = 1
ρ (ξ) thỏa mãn điều kiện nghiệm do đó phương pháp trên zero - ổn định.
− 45 −
Xét
X8
αj = α1 = 1
j=1
8
1070017 2233547 2302297 2797679 31457
X
βj = + − + −
j=0
3628800 1814400 181440 1814400 22680
1573169 645607 156437 33953
+ − + − =1
1814400 1814400 1814400 3628800
X8
8− αj (8 − j) = 8 − 7 = 1
j=1
ρ (ξ) = ξ 9 − ξ 8
− 46 −
6755041 4 462127 3 335983 2 116687 8183
+ ξ − ξ + ξ − ξ+
3628800 453600 907200 1451520 1036800
Khi đó
ρ(ξ + 1) − σ(ξ + 1) ln(ξ + 1) = [(ξ + 1)8 − (ξ + 1)7 ]−
25713 9449717 1408913
− (ξ + 1)9 + (ξ + 1)8 − (ξ + 1)7 +
89600 7257600 907200
200029 8641823 6755041
+ (ξ + 1)6 − (ξ + 1)5 + (ξ + 1)4 −
90720 3628800 3628800
462127 335983 116687
− (ξ + 1)3 + (ξ + 1)2 − (ξ + 1)+
453600 907200 1451520
ξ2 ξ3 ξ4 ξ5 ξ6 ξ7 ξ8
8183
+ ξ− + − + − + − +
1036800 2 3 4 5 6 7 8
ξ 9 ξ 10 ξ 11 ξ 12 ξ 13 ξ 14 ξ 15 ξ 16 ξ 17 ξ 18
+ − + − + − + − + − ...
9 10 11 12 13 14 15 16 17 18
3250433 11
=− ξ + 0(ξ 12 )
479001600
Vậy cấp chính xác của phương pháp Adams - Moulton 9 bước là p = 10.
Ta có
ρ (ξ) = 0 ⇒ ξ 9 − ξ 8 = 0 ⇒ ξ1,..,8 = 0, ξ9 = 1
ρ (ξ) thỏa mãn điều kiện nghiệm do đó phương pháp trên zero - ổn định.
− 47 −
Xét
X9
αj = α1 = 1
j=1
8
25713 9449717 1408913 200029 8641823
X
βj = + − + −
j=0
89600 7257600 907200 90720 3628800
6755041 462127 335983 116687 8183
+ − + − + =1
3628800 453600 907200 1451520 1036800
X9
9− αj (9 − j) = 9 − 8 = 1
j=1
− 48 −
Chương 3
• Chia [a, b] thành n phần bằng nhau bởi các điểm chia
a = x0 , x1 , x2 , ..., xn = b
b−a
khi đó h =
n
− 49 −
• Chia đôi [x0 , x1 ] bởi điểm chia
h 0
• Sử dụng phương pháp Euler hiển tính giá trị y10 với h1 = ,x =
2 1
x0 + h1 .
• Tính giá trị y20 bằng phương pháp Adams - Bashforth 2 bước, khi
đó y20 chính là giá trị y1 dự báo, kí hiệu y1d
• Sử dụng phương pháp Adams - Moulton 2 bước hiệu chỉnh giá trị y1d
lần thứ nhất được giá trị y1∗1 . Tiếp tục hiệu chỉnh sao cho y1∗k −y1∗k−1 <
ε thì dừng lại được giá trị y1∗k , khi đó y1∗ = y1∗k
• Hiệu chỉnh giá trị y2d lần thứ nhất được giá trị y2∗1 . Tiếp tục hiệu
chỉnh sao cho y2∗k − y2∗k−1 < ε thì dừng lại được giá trị y2∗k , khi đó
y2∗ = y2∗k
..............................
Thực hiện quá trình này cho đến giá trị yn
Tiếp tục chia đoạn [x0 , x1 ] làm 2 phần bằng nhau bởi điểm chia
Tính giá trị y20 bằng phương pháp Adams - Bashforth 2 bước
3 1
0 0 0 0
y2 = y1 + h1 f (x1 , y1 ) − f (x0 , y0 ) = 0.937523.10−9
2 2
5 2 1
y1∗2 = y1 0 + h1 f (x1 , y11 ∗ ) + f (x1 0 , y1 0 ) − f (x0 , y0 )
12 3 12
= 0.2500323.10−8
5 2 1
y1∗3 = y1 0 + h1 f (x1 , y12 ∗ ) + f (x1 0 , y1 0 ) − f (x0 , y0 )
12 3 12
= 0.2500323.10−8
− 51 −
xét |y1∗3 − y1∗2 | = 0 < ε do đó y1∗ = y1∗3 = 0.2500323.10−8
Tiếp tục dự báo giá trị y2 với y1 = y1∗ bằng phương pháp Adams -
Bashforth 2 bước ta được
y2d = 0.17502573.10−7
và hiệu chỉnh bằng phương pháp Adams - Moulton 2 bước nhiều lần ta
được
y2∗ = 0.42521746.10−7
− 52 −
Giá Giá trị yn Giá trị yn Giá trị yn
trị xn dự báo hiệu chỉnh chính xác
0 0 0 0
0.01 0.937523.10−9 0.2500323.10−8 0.250593.10−8
0.02 0.17502573.10−7 0.42521746.10−7 0.40015373.10−7
0.03 0.157594518.10−6 0.20770752.10−6 0.203088571.10−6
0.04 0.573234613.10−6 0.648591797.10−6 0.648640108.10−6
0.05 0.147572347.10−5 0.157655089.10−5 0.1582836455.10−5
0.06 0.3137837235.10−5 0.326443728.10−5 0.3272628237.10−5
0.07 0.5894645558.10−5 0.6047397801.10−5 0.6051336629.10−5
0.08 0.1014451604.10−4 0.10323878293.10−4 0.1031865335.10−4
0.09 0.1635030792.10−4 0.16556817546.10−4 0.1654064069.10−4
0.1 0.2504075851.10−4 0.25275033874.10−4 0.2524973145.10−4
Từ bảng các giá trị trên so sánh giá trị chính xác với giá trị dự báo và
giá trị hiệu chỉnh ta được bảng sai số sau
− 53 −
Nhận xét 3.1. Từ bảng sai số so sánh 2 cột giá trị ta thấy giá trị hiệu
chỉnh đúng đến 7, 8, 10, 11 chữ số sau dấu phẩy, tức là sai số giữa giá
trị hiệu chỉnh và giá trị chính xác là nhỏ.
− 54 −
Ví dụ 3.2. Giải bài toán
(
y 0 = x3 + 2xy
x ∈ [0, 0.1] , ε = 10−20
y(0) = 0
Bài toán trên có nghiệm giải tích là
1 1 1 2
y = − − x2 + ex
2 2 2
Tìm nghiệm của bài toán trên [0, 0.1]
Chia đoạn [0, 0.1] làm 10 phần bằng nhau bởi các điểm chia
Tính giá trị y20 bằng phương pháp Adams - Bashforth 2 bước
3 1
y2 = y1 + h1 f (x1 , y1 ) − f (x0 , y0 ) = 0.9375.10−9
0 0 0 0
2 2
khi đó y20 chính là y1d .
Sử dụng phương pháp Adams - Moulton 2 bước hiệu chỉnh giá trị y1d , kí
hiệu giá trị sau khi được hiệu chỉnh là y1∗
∗ 0 5 d 2 0 0 1
y11 = y1 + h1 f (x1 , y1 ) + f (x1 , y1 ) − f (x0 , y0 )
12 3 12
= 0.2500039.10−8
5 2 1
y1∗2 0
= y1 + h1 ∗ 0 0
f (x1 , y11 ) + f (x1 , y1 ) − f (x0 , y0 )
12 3 12
= 0.2500104.10−8
− 55 −
5 2 1
y1∗3 = y1 0 + h1 f (x1 , y12 ∗ ) + f (x1 0 , y1 0 ) − f (x0 , y0 )
12 3 12
= 0.2500104.10−8
y2d = 0.17500854.10−7
y2∗ = 0.42507522.10−7
Thực hiện quá trình tương tự đến giá trị y10 cho ta bảng sau
Giá Giá trị yn Giá trị yn Giá trị yn
trị xn dự báo hiệu chỉnh chính xác
0 0 0 0
0.01 0.9375.10−9 0.2500104.10−8 0.2501174.10−8
0.02 0.17500854.10−7 0.42507522.10−7 0.40005115.10−7
0.03 0.157532777.10−6 0.207570708.10−6 0.202737517.10−6
0.04 0.572749021.10−6 0.647868276.10−6 0.644943929.10−6
0.05 0.1473583447.10−5 0.1573859202.10−5 0.1574737895.10−5
0.06 0.3130960843.10−5 0.3256493497.10−5 0.3259354235.10−5
0.07 0.5876568255.10−5 0.6027483569.10−5 0.6028746638.10−5
0.08 0.1010318739.10−4 0.10279636662.10−4 0.1027558767.10−4
0.09 0.1626508855.10−4 0.16467248838.10−4 0.1645526877.10−4
0.1 0.248784867.10−4 0.25106561052.10−4 0.2508590025.10−4
Từ bảng trên ta có bảng sai số giữa giá trị chính xác và giá trị dự báo,
giá trị hiệu chỉnh sau
− 56 −
Giá trị xn |yd − ycx| |yh − ycx|
0 0 0
0.01 0.1563674149.10−8 0.1069978.10−11
0.02 0.2250426053.10−7 0.250240738.10−8
0.03 0.452047408.10−7 0.48331911.10−8
0.04 0.721949080.10−7 0.29243473.10−8
0.05 0.101154448.10−6 0.878693.10−9
0.06 0.128393392.10−6 0.2860738.10−8
0.07 0.152178383.10−6 0.1263069.10−8
0.08 0.17240028.10−6 0.404899.10−8
0.09 0.19018022.10−6 0.1198007.10−7
0.1 0.20741355.10−6 0.2066080.10−7
Nhận xét 3.2. Quan sát bảng sai số ta nhận thấy giá trị hiệu chỉnh gần
với giá trị chính xác hơn giá trị dự báo. Ở giá trị đầu tiên, giá trị hiệu
chỉnh so với giá trị chính xác đúng đến 11 chữ số sau dấu phẩy trong khi
giá trị dự báo đúng 8 chữ số sau dấu phẩy.
− 57 −
Hình 3.4: Đồ thị biểu diễn nghiệm chính xác
0 = x0 , x1 , x2 , ..., x100 = 1
1−0
Ta có h = = 0.01
100
Tiếp tục chia đoạn [x0 , x1 ] làm 2 phần bằng nhau bởi điểm chia
Tính giá trị y20 bằng phương pháp Adams - Bashforth 2 bước
3 1
y2 0 = y1 0 + h1 f (x1 0 , y1 0 ) − f (x0 , y0 ) = 1.875.10−7
2 2
− 58 −
khi đó y20 chính là y1d .
Sử dụng phương pháp Adams - Moulton 2 bước hiệu chỉnh nhiều lần giá
trị y1d ta được
y1∗ = 2.917.10−7
Tiếp tục quá trình như vậy ta được 100 giá trị trên [0, 1] Ta có bảng 10
giá trị đại diện sau
Giá Giá trị yn Giá trị yn Giá trị yn
trị xn dự báo hiệu chỉnh maple tính
0 0 0 0
0.1 0.3324598396.10−3 0.333293265269.10−3 0.3333344337.10−3
0.2 0.2665993241.10−2 0.2666828389779.10−2 0.2666884487.10−2
0.3 0.9002589296.10−2 0.9003432484934.10−2 0.9003497423.10−2
0.4 0.2135847601.10−1 0.21359341709882.10−1 0.2135936878.10−1
0.5 0.4179019791.10−1 0.41791112672635.10−1 0.4179115658.10−1
0.6 0.7244682939.10−1 0.72447837026333.10−1 0.7244790628.10−1
0.7 0.1156586762 0.115659845611663 0.1156599169
0.8 0.174078846 0.17408028483035 0.1740803381
0.9 0.2509048704 0.250906749799359 0.2509067734
1 0.3502293902 0.350231992823669 0.3502319798
Từ bảng giá trị trên so sánh giá trị do maple tính với giá trị dự báo
và giá trị hiệu chỉnh ta có bảng sai số sau
− 59 −
Giá trị xn |yd − yM | |yh − yM |
0 0 0
0.1 0.8745941.10−6 0.411684.10−7
0.2 0.891246.10−6 0.56097.10−7
0.3 0.908127.10−6 0.64938.10−7
0.4 0.89277.10−6 0.2707.10−7
0.5 0.95867.10−6 0.4391.10−7
0.6 0.107689.10−5 0.6925.10−7
0.7 0.12407.10−5 0.713.10−7
0.8 0.14921.10−5 0.533.10−7
0.9 0.19030.10−5 0.236.10−7
1 0.25896.10−5 0.130.10−7
Nhận xét 3.3. Qua bảng sai số trên ta thấy giá trị hiệu chỉnh tốt hơn
rõ rệt so với giá trị dự báo, điều này rất có ý nghĩa trong việc giải gần
đúng các phương trình vi phân bằng phương pháp dự báo - hiệu chỉnh.
− 60 −
Hình 3.6: Đồ thị biểu diễn nghiệm do Maple tính
• Chia [a, b] thành n phần bằng nhau bởi các điểm chia
a = x0 , x1 , x2 , ..., xn = b
• Sử dụng phương pháp Runge - Kutta hiển 4 nấc tính các giá trị
b−a
y1 , y2 với h =
n
• Dự báo giá trị y3 bằng phương pháp Adams - Bashforth 3 bước
− 61 −
• Sử dụng phương pháp Adams - Moulton 3 bước hiệu chỉnh giá trị
y3d lần thứ nhất được giá trị y3∗ . Tiếp tục hiệu chỉnh nhiều lần sao
cho y3∗k − y3∗k−1 < ε thì dừng lại được giá trị y3∗k , khi đó y3∗ = y3∗k
• Hiệu chỉnh giá trị y4 nhiều lần sao cho y4∗k − y4∗k−1 < ε thì dừng lại
được giá trị y4∗k , khi đó y4∗ = y4∗k
...............................
Thực hiện quá trình này cho đến giá trị yn .
Chia đoạn [0, 1] làm 100 phần bằng nhau bởi các điểm chia
0 = x0 , x1 , x2 , ..., x10 = 1
Sử dụng phương pháp Runge - Kutta hiển 4 nấc tính giá trị y1 , y2 với
− 62 −
1−0
h= = 0.01, x1 = x0 + h = 0.01, x2 = x1 + h = 0.02
100
Yn1 = yn
1
Yn2 = yn + h f (xn , Yn1 )
2
1 3 h
Yn3 = yn + h f (xn , Yn1 ) − f (xn + , Yn2 )
2 2 2
4 h 1
Yn4 = yn + h f (xn + , Yn2 ) − f (xn − h, Yn3 )
3 2 3
1 2 1 1
yn+1 = yn + h f (xn , Yn1 ) + f (xn + h, Yn2 ) + f (xn + h, Yn4 )
6 3 2 6
Ta có
y1 = 0.501683430337827.10−4
y2 = 0.201348561876164.10−3
Dự báo giá trị y3 bằng phương pháp Adams - Bashforth 3 bước
23 4 5
y3 = y2 + h1 f (x2 , y2 ) − f (x1 , y1 ) + f (x0 , y0 )
12 3 12
= 0.050344882225134
Sử dụng phương pháp Adams - Moulton 3 bước hiệu chỉnh nhiều lần giá
trị y3 , kí hiệu giá trị sau khi được hiệu chỉnh là y3∗
5 2 1
y3∗ = y2 + h1 f (x1 , y1 ) + f (x2 , y2 ) − f (x1 , y1 )
12 3 12
= 0.050344899671878
Tiếp tục dự báo giá trị y4 bằng phương pháp Adams - Bashforth 3 bước
ta được
y4 = 0.093529037522892
− 63 −
và hiệu chỉnh bằng Adams - Moulton 2 bước nhiều lần ta được
y4∗ = 0.093529059440013
− 64 −
Nhận xét 3.4. Từ bảng sai số so sánh 2 cột giá trị ta thấy giá trị dự báo
gần với giá trị do maple tính đến 7, 8 chữ số sau dấu phẩy, điều này cho
ta thấy phương pháp Adams - Bashforth 3 bước là khá tốt rồi nên nghiệm
dự báo có độ chính xác cao.
− 65 −
Ví dụ 3.5. Giải bài toán
(
y0 = x − y2
, x ∈ [0, 1]
y(0) = 0
Chia đoạn [0, 1] làm 100 phần bằng nhau bởi các điểm chia
0 = x0 , x1 , x2 , ..., x10 = 1
Sử dụng phương pháp Runge - Kutta hiển 4 nấc tính giá trị y1 , y2 với
1−0
h= = 0.01, x1 = x0 + h = 0.01, x2 = x1 + h = 0.02
100
Yn1 = yn
1
Yn2 = yn + h f (xn , Yn1 )
2
1 3 h
Yn3 = yn + h f (xn , Yn1 ) − f (xn + , Yn2 )
2 2 2
4 h 1
Yn4 = yn + h f (xn + , Yn2 ) − f (xn − h, Yn3 )
3 2 3
1 2 1 1
yn+1 = yn + h f (xn , Yn1 ) + f (xn + h, Yn2 ) + f (xn + h, Yn4 )
6 3 2 6
Ta có
y1 = 0.499999833333271.10−4
y2 = 0.19999980833345.10−3
− 66 −
Sử dụng phương pháp Adams - Moulton 3 bước hiệu chỉnh nhiều lần giá
trị y3 , kí hiệu giá trị sau khi được hiệu chỉnh là y3∗
∗ 5 2 1
y3 = y2 + h1 f (x1 , y1 ) + f (x2 , y2 ) − f (x1 , y1 )
12 3 12
= 0.044878908206218
Tiếp tục dự báo giá trị y4 bằng phương pháp Adams - Bashforth 3 bước
ta được
y4 = 0.079492070171301
y4∗ = 0.079492062345693
− 67 −
Giá trị xn |yd − yM | |yh − yM |
0 0 0
0.3 0.676.10−8 0.61.10−9
0.4 0.652.10−8 0.130.10−8
0.5 0.268.10−7 0.179.10−7
0.6 0.312.10−7 0.402.10−7
0.7 0.268.10−7 0.186.10−7
0.8 0.1140.10−6 0.1203.10−6
0.9 0.391.10−7 0.355.10−7
1 0.87.10−8 0.84.10−8
Nhận xét 3.5. Giá trị dự báo và hiệu chỉnh đều gần giá trị do maple
tính như ví dụ trên. Qua cả hai ví dụ ta nhận thấy việc tính giá trị y1 , y2
bằng phương pháp Runge - Kutta 4 nấc sau đó dự báo - hiệu chỉnh bằng
phương pháp Adams - Bashforth 3 bước và Adams - Moulton 3 bước đạt
kết quả tốt.
− 68 −
Hình 3.10: Đồ thị biểu diễn nghiệm do Maple tính
Chia đoạn [0, 1] làm 100 phần bằng nhau bởi các điểm chia
Sử dụng phương pháp Runge - Kutta hiển 4 nấc tính giá trị y1 , y2 với
− 69 −
0.1 − 0
h= = 0.001, x1 = x0 + h = 0.001, x2 = x1 + h = 0.002
100
Yn1 = yn
1
Yn2 = yn + h f (xn , Yn1 )
2
1 3 h
Yn3 = yn + h f (xn , Yn1 ) − f (xn + , Yn2 )
2 2 2
4 h 1
Yn4 = yn + h f (xn + , Yn2 ) − f (xn − h, Yn3 )
3 2 3
1 2 1 1
yn+1 = yn + h f (xn , Yn1 ) + f (xn + h, Yn2 ) + f (xn + h, Yn4 )
6 3 2 6
Ta có
y1 = 4.9983320824988910−7
y2 = 0.19986652497907710−7
Dự báo giá trị y3 bằng phương pháp Adams - Bashforth 3 bước
23 4 5
y3 = y2 + h1 f (x2 , y2 ) − f (x1 , y1 ) + f (x0 , y0 )
12 3 12
= 0.000445432496043
Sử dụng phương pháp Adams - Moulton 3 bước hiệu chỉnh nhiều lần giá
trị y3 , kí hiệu giá trị sau khi được hiệu chỉnh là y3∗
5 2 1
y3∗ = y2 + h1 f (x1 , y1 ) + f (x2 , y2 ) − f (x1 , y1 )
12 3 12
= 0.000445432495293
Tiếp tục dự báo giá trị y4 bằng phương pháp Adams - Bashforth 3 bước
ta được
y4 = 0.000789119975502
− 70 −
và hiệu chỉnh bằng Adams - Moulton 2 bước nhiều lần ta được
y4∗ = 0.000789119974751
− 71 −
Nhận xét 3.6. Từ bảng sai số so sánh 2 cột giá trị ta thấy giá trị dự
báo và giá trị được hiệu chỉnh gần với giá trị do maple tính đến 10 chữ số
sau dấu phẩy. Sự chênh lệch giữa dự báo và hiệu chỉnh là rất nhỏ chứng
tỏ dự báo bằng phương pháp Adams - Bashforth 3 bước cho kết quả tốt.
− 72 −
Phụ Lục
restart;
with(Maplets[Elements]):
GD:=Maplet([
["Nhap ham f(x,y)= ",TextField[f]"x^2+y^2"],
[ "Nhap a= ", TextField[a]("0"), " b= ", TextField[b]("1")],
[ "Nhap n= ", TextField[n]("10000"), " 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^(-20):
nmax:=100:
for i from 0 to n do
x[i]:=a+i*h:
− 73 −
end do:
h1 := evalf((1/2)*h,20): x01:=evalf(x[0]+h1,20):
x[1]:=evalf(x[0]+h, 20):
yh[0]:=evalf(y0,20):
yd[0]:=evalf(y0,20):
y01:=evalf(yd[0]+h1*f(x[0],yd[0]),20):
yd[1]:=evalf(y01+h1*((3/2)*f(x01, y01)-(1/2)*f(x[0], yd[0])),
20):
H[1][0]:=yd[1]:
H[1][1]:=evalf(y01+h1*((5/12)*f(x[1],H[1][0])+(2/3)*f(x01,y01)
-(1/12)*f(x[0],yd[0])),20):
i:=1:
while abs(H[1][i]-H[1][i-1])>epsilon do
i:=i+1;
H[1][i]:=evalf(y01+h1*((5/12)*f(x[1],H[1][i-1])+(2/3)*f(x01,
y01)-(1/12)*f(x[0],yd[0])),20):
if i>nmax then break; end if;
end do:
yh[1]:=H[1][i]:
for i from 2 to n do
yd[i]:=yh[i-1]+h*(3/2*f(x[i-1],yh[i-1])-1/2*f(x[i-2],
yh[i-2]));
H[i][0]:=yd[i];
H[i][1]:=evalf(yh[i-1]+h*((5/12)*f(x[i],H[i][0])+(2/3)*
f(x[i-1],yh[i-1])-(1/12)*f(x[i-2],yh[i-2])),20):
j:=1:
while abs(H[i][j]-H[i][j-1])>epsilon do
j:=j+1;
H[i][j]:=evalf(yh[i-1]+h*((5/12)*f(x[i],H[i][j-1])+(2/3)*
− 74 −
f(x[i-1],yh[i-1])-(1/12)*f(x[i-2],yh[i-2])),20):
if j>nmax then break; end if;
end do:
yh[i]:=H[i][j];
end do:
rs:=dsolve({diff(y(t),t)=f(t,y(t)),y(0)=y0},y(t)):
ngh:=unapply(rhs(rs),t):
y=ngh(x);
tmp:=dsolve({diff(y(t),t)=f(t,y(t)),y(0)=y0},y(t),type=numeric,
output=listprocedure,range=a..b):
ngh:=subs(tmp,y(t)):
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 0 to 10 do
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 chính xác"):
p2:=plot([seq([x[i],yh[i]],i=0..n)],color=blue,legend="
Nghiệm hiệu chỉnh"):
plots[display](p1,p2);
Code: Kết hợp phương pháp Adams - Bashforth 3 bước và Adams -
Moulton 3 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]("x^2+y^2")],
− 75 −
[ "Nhap a= ", TextField[a]("0"), " b= ", TextField[b]("1")],
[ "Nhap n= ", TextField[n]("10000"), " y0= ", TextField[y0]
("0")],
[Button("Thoat", Shutdown([f,a,b,n,y0]))]
]):
gtn:=Maplets[Display](GD);
["x*exp(x)-y*cos(x)", "0", "1", "100", "0"]
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 0 to n do
x[i]:=a+i*h:
end do:
x[1]:=evalf(x[0]+h,20): x[2]:=evalf(x[1]+h,20):
x[3]:=evalf(x[2]+h,20):x[4]:=evalf(x[3]+h,15):
Y[0]:=evalf(y0,20): yd[0]:=evalf(Y[0],20):
yh[0]:=evalf(Y[0],15):
Y01:=evalf(yh[0],15):
Y02:=evalf(yh[0]+h*((1/2)*f(x[0],Y01)),15):
Y03:=evalf(yh[0]+h*((1/2)*f(x[0],Y01)-(3/2)*f(x[0]+(1/2)*h,Y02)),
15):
Y04:=evalf(yh[0]+h*((4/3)*f(x[0]+(1/2)*h,Y02)-(1/3)*f(x[0]-h,
Y03)),15):
Y[1]:=evalf(yh[0]+h*((1/6)*f(x[0],Y01)+(2/3)*f(x[0]+(1/2)*h,
Y02)+(1/6)*f(x[0]+h,Y04)),15);
− 76 −
yd[1]:=evalf(Y[1],15):
yh[1]:=evalf(Y[1],15):
Y11:=evalf(yh[1],15):
Y12:=evalf(yh[1]+h*((1/2)*f(x[1],Y11)),15):
Y13:=evalf(yh[1]+h*((1/2)*f(x[1],Y11)-(3/2)*f(x[1]+(1/2)*h,
Y12)),15):
Y14:=evalf(yh[1]+h*((4/3)*f(x[1]+(1/2)*h,Y12)-(1/3)*f(x[1]-h,
Y13)),15):
Y[2]:=evalf(yh[1]+h*((1/6)*f(x[1],Y11)+(2/3)*f(x[1]+(1/2)*h,
Y12)+(1/6)*f(x[1]+h,Y14)),15);
yd[2]:=evalf(Y[2],15):
yh[2]:=evalf(Y[2],15):
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])),15):
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])),15):
i:=1:
while abs(H[3][i]-H[3][i-1])>epsilon do
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])),15);
if i>nmax then break; end if;
end do:
yh[3]:=H[3][i]:
for i from 4 to n do
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])),15);
H[i][0]:=yd[i];
− 77 −
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])),15):
j:=1:
while abs(H[i][j]-H[i][j-1])>epsilon do
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])),15):
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 được nghiệm chính xác. Maple sẽ cho nghiệm
số bằng phương pháp Runge-Kutta bậc 4-5 để làm cơ 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 chính xác giải bằng 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 3 to 10 do
− 78 −
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 chính 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);
− 79 −
KẾT LUẬN
Đề tài sử dụng một cặp phương pháp Adams - Bashforth và Adams
- Moulton làm cặp phương pháp dự báo - hiệu chỉnh để giải số phương
trình vi phân. Đặc biệt có sử dụng Maple làm công cụ giải nhanh và
chính xác những bài toán phương trình vi phân phức tạp hoặc không thể
tìm nghiệm dưới dạng giải tích.
Phương pháp Adams - Bashforth kết hợp với phương pháp Adams -
Moulton là một cặp dự báo - hiệu chỉnh khá tốt.
− 80 −
Tài liệu tham khảo
[1] Phạm Kỳ Anh, Giải tích số, NXB đại học quốc gia Hà Nội, 2000.
[4] Nguyễn Hữu Điển, Hướng dẫn và sử dụng Maple V, NXB Thống Kê,
1999.
[5] Nguyễn Hữu Điển, Nguyễn Minh Tuấn, Latex tra cứu và soạn thảo,
NXB ĐHQG Hà Nội, 2003.
[8] Phạm Văn Hạp, Lê Đình Thịnh, Phương pháp tính và các thuật
toán, NXB Giáo Dục, 2000.
[9] Doãn Tam Hòe, Toán học tính toán, NXB giáo dục, 2005.
− 81 −
[11] Isaascon and H.B Keller, Analysis of Numerical Methods, Wiley, New
York, 1966.
[12] Bùi Tuấn Khang, Giáo trình phương pháp tính, Tài liệu lưu hành
nội bộ, Đại học Đà Nẵng, 2003.
[15] 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, NXB ĐHSP Hà Nội, 2007.
− 82 −