You are on page 1of 7

Bài 2 – Phương pháp Euler bậc 1

Ví dụ: Sử dụng quy trình Euler để tính nghiệm gần đúng của phương trình vi phân
y′ = 2x2 − 3x +1
trong khoảng biến thiên của biến số [0,1] . Điều kiện ban đầu của nghiệm là y(0) =
0 . Đánh giá sự thay đổi của sai số theo sự thay đổi của chiều dài khoảng chia.

Bài làm:
Nhận xét: Phương trình vi phân đã cho có thể tính được biểu thức nghiệm đúng như
sau:
y′ = 2x2 − 3x + 1
(
→ dy = 2x2 − 3x + 1 dx )
2 3
→y= x3 − x+x+C
32
Sử dụng điều kiện ban đầu y(0) = 0 →C = 0 ta xác định được nghiệm cụ thể:
2 3
y= x3 − x + x.
3 2
Biểu thức nghiệm đúng này sẽ được dùng để đánh giá sai số của nghiệm gần đúng
tính theo quy trình Euler như sau:

Bước 1: Phân hoạch khoảng tính nghiệm:


! Khoả ng'tính'nghiệm:'[0,1] !
! Kịch'bả n'1:'Số 'điểm'chia' N = 5 '
o Số 'khoả ng'chia:' M = N −1 = 4 '
o Chiều'dài'khoảng'chia:' h =
1 / 4 = 0.25 ' o
Vị'trí'các'điểm'chia:''
x '
i = (i −1)h
→ x1 = 0; x2 = 0.25; x3 = 0.50; x4 = 0.75; x5 = 1.00
Bước 2: Tính giá trị gần đúng của nghiệm:
Với h = 0.25:
I'' X' F' Y(Euler)'' Y(đú ng)'' Sai' số ' Sai' số '
tuyệt'đố i''' tương'
đố i''
1' 0.00' 1' 0' 0' 0' PP'
2' 0.25' 0.37500' 0.25000' 0.166667' 0.083333' 50%'
3' 0.50' 0' 0.34375' 0.208333' 0.135417' 65%'
4' 0.75' P0.12500' 0.34375' 0.187500' 0.15625' 83%'
5'' 1.00' PP' 0.31250' 0.166667' 0.145833' 87%'
Với h = 0.1:

I'' X' F' Y(Euler)'' Y(đú ng)'' Sai' số ' Sai' số '
tuyệt'đố i'' tương'đố i''
1' 0' 1' 0' 0' 0' PP'
2' 0.1' 0.72000' 0.10000' 0.08567' 0.01433' 16.73%'
3' 0.2' 0.48000' 0.17200' 0.14533' 0.02667' 18.35%'
4' 0.3' 0.28000' 0.22000' 0.18300' 0.03700' 20.22%'
5' 0.4' 0.12000' 0.24800' 0.20267' 0.04533' 22.37%'
6' 0.5' 0' 0.26000' 0.20833' 0.05167' 24.80%'
7' 0.6' P0.08000' 0.26000' 0.20400' 0.05600' 27.45%'
8' 0.7' P0.12000' 0.25200' 0.19367' 0.05833' 30.12%'
9' 0.8' P0.12000' 0.24000' 0.18133' 0.05867' 32.36%'
10'' 0.9' P0.08000' 0.22800' 0.17100' 0.05700' 33.33%'
11' 1.0' PP' 0.22000' 0.16667' 0.05333' 32.00%'
Với h = 0.05:

I' X'' F' Y(Euler)'' Y(đú ng)'' Sai' số ' Sai' số '
tuyệt'đố i'' tương'đố i''
1' 0' 1.00000' 0' 0' 0' PP'
2' 0.05' 0.85500' 0.05000' 0.04633' 0.00366' 7.91%'
3' 0.1' 0.72000' 0.09275' 0.08567' 0.00708' 8.27%'
4' 0.15' 0.59500' 0.12875' 0.11850' 0.01025' 8.65%'
5' 0.2' 0.48000' 0.15850' 0.14533' 0.01317' 9.06%'
6' 0.25' 0.37500' 0.18250' 0.16667' 0.01583' 9.50%'
7' 0.3' 0.28000' 0.20125' 0.18300' 0.01825' 9.97%'
8' 0.35' 0.19500' 0.21525' 0.19483' 0.02042' 10.48%'
9' 0.4' 0.12000' 0.22500' 0.20267' 0.02233' 11.02%'
10' 0.45' 0.05500' 0.23100' 0.20700' 0.02400' 11.59%'
11' 0.5' 0' 0.23375' 0.20833' 0.02542' 12.20%'
12' 0.55' P0.04500' 0.23375' 0.20717' 0.02658' 12.83%'
13' 0.6' P0.08000' 0.23150' 0.20400' 0.02750' 13.48%'
14' 0.65' P0.10500' 0.22750' 0.19933' 0.02817' 14.13%'
15' 0.7' P0.12000' 0.22225' 0.19367' 0.02858' 14.76%'
16' 0.75' P0.12500' 0.21625' 0.18750' 0.02875' 15.33%'
17' 0.8' P0.12000' 0.21000' 0.18133' 0.02867' 15.81%'
18' 0.85' P0.10500' 0.20400' 0.17566' 0.02833' 16.13%'
19' 0.9' P0.08000' 0.19875' 0.17100' 0.02775' 16.23%'
20' 0.95' P0.04500' 0.19475' 0.16783' 0.02692' 16.04%'
21' 1.0' PP' 0.19250' 0.16667' 0.02583' 15.50%'

Nhận xét:
! Sai'số 'tuyệt'đố i'và 'sai'số 'tương'đố i'giả m'khi'giả m'chiều'dà i'khoả ng'chia'
! Sai'số 'tương'đố i'tă ng'dầ n'theo'chiều'tă ng'củ a'x'ra'xa'khỏ i'vị'trí'ban'đầ u'x1'do'
hai'lý'do'như'đã 'phâ n'tích'là :'do'gầ n'đú ng'ngắ t'chuỗ i'và 'do'tích'luỹ'theo'từ ng'
bướ c'nhả y.'
! Độ 'chính'xá c'khô ng'cao:'Khi'h'='0.05'thì'độ 'chính'xá c'củ a'nghiệm'gầ n'đú ng'
mớ i'đạ t'đến'phầ n'chữ 'số 'thậ p'phâ n'thứ 'nhấ t.'
Đồ thị biểu diễn các số liệu tính toán trong ba kịch bản phân hoạch.
Bài 3 -- Phương pháp Euler bậc cao:
Trong bài trước chúng ta trình bày phương pháp Euler bậc một và hiểu rằng đây là
phương pháp dự đoán trong đó đạo hàm đóng vai trò dẫn hướng. Tuy nhiên, phương
pháp này có độ chính xác thấp. Mục đích của bài này là trình bày một phương án cải
thiện độ chính xác của nghiệm tốt hơn phương án Euler. Ý tưởng rất tự nhiên do đó là
ngắt chuỗi luỹ thừa Taylor ở các số hạng bậc cao hơn h. Cụ thể:
Ở cấp gần đúng O(h3 )
1
2 yi′′h + O(h )
2 3
yi+1 = yi + yi′h +
trong đó, từ phương trình
y′ (x) = f (x, y)
ta rút ra được biểu thức của đạo hàm cấp hai như sau:
df (x, y)
y′′ (x) = = ∂ f (x, y) + ∂ f (x, y) dy
dx ∂x ∂ydx
= fx′(x, y) + fy′(x, y) f (x, y)
Bằng cách đặt
f1i = f (xi , yi )
f2i = fi′(xi , yi ) + fy′(xi , yi ) f1i
ta viết lại được công thức tính nghiệm như sau:
1
y + = y + f h + f h2 + O(h3 ).
i 12 2ii1i

Ở cấp gần đúng O(h4 )


1 1
2 yi′′h + 6 yi′′′h + O(h ).
2 3 4
yi+1 = yi + yi′h +
Trong đó từ biểu thức của phương trình vi phân ta xác định được biểu thức đạo hàm
cấp ba như sau:
dy′′ = d ∂ f + ∂ f dy
y′′′ = dx ∂x ∂
dx
∂ 2 f dy y dx
2
= ∂ f + 2 ∂y ∂x dx + ∂ f dy 2 + ∂ f d 2 y
2

∂ 2
x ∂ f dy
∂ 2 f dy ∂ y2 dx∂y dx2 +
2
= ∂ f + 2 ∂y ∂x dx + ∂2 f dy 2 ∂ f ∂ f ∂
∂ 2 y dx
x ∂y 2 + ∂x .
dx ∂y
Đây là biểu thức khá cồng kềnh phức tạp. Việc triển khai tính toán sẽ gặp khó khăn
khi biểu thức f là phức tạp.

Áp dụng công thức này cho phương trình xét trong Bài 2 ta tính được nghiệm và so
sánh với nghiệm đúng như sau:
I' X'' F1' F2' Y(Euler)'' Y(đú ng)'' Sai' số '
tuyệt'đố i''
1' 0' 1.00000' P3.00000' 0' 0' 0'
2' 0.05' 0.85500' P2.80000' 0.04625' 0.04633' 0.00008'
3' 0.1' 0.72000' P2.60000' 0.08550' 0.08567' 0.00017'
4' 0.15' 0.59500' P2.40000' 0.11825' 0.11850' 0.00025'
5' 0.2' 0.48000' P2.20000' 0.14500' 0.14533' 0.00033'
6' 0.25' 0.37500' P2.00000' 0.16625' 0.16667' 0.00042'
7' 0.3' 0.28000' P1.80000' 0.18250' 0.18300' 0.00050'
8' 0.35' 0.19500' P1.60000' 0.19425' 0.19483' 0.00058'
9' 0.4' 0.12000' P1.40000' 0.20200' 0.20267' 0.00067'
10' 0.45' 0.05500' P1.20000' 0.20625' 0.20700' 0.00075'
11' 0.5' 0' P1.00000' 0.20750' 0.20833' 0.00083'
12' 0.55' P0.04500' P0.80000' 0.20625' 0.20717' 0.00092'
13' 0.6' P0.08000' P0.60000' 0.20300' 0.20400' 0.00100'
14' 0.65' P0.10500' P0.40000' 0.19825' 0.19933' 0.00108'
15' 0.7' P0.12000' P0.20000' 0.19250' 0.19367' 0.00117'
16' 0.75' P0.12500' 0' 0.18625' 0.18750' 0.00125'
17' 0.8' P0.12000' 0.20000' 0.18000' 0.18133' 0.00133'
18' 0.85' P0.10500' 0.40000' 0.17425' 0.17566' 0.00142'
19' 0.9' P0.08000' 0.60000' 0.16950' 0.17100' 0.00150'
20' 0.95' P0.04500' 0.80000' 0.16625' 0.16783' 0.00158'
21' 1.0' ' ' 0.16500' 0.16667' 0.00167'
Nhận xét:
! Độ 'chính'xá c'đã 'đạ t'đến'chữ 'số 'thậ p'phâ n'thứ 'hai.'Sai'số 'tương'đố i'lớ n'nhấ t'là '
1%.'
! Bậ c'cao'thì'phứ c'tạ p!'!'tìm'cá ch'cả i'tiến'bậ c'1'
Bài 3 – Phương pháp Heun
Trong bài trước chúng ta đã trình bày một quy trình cho phép cải tiến được nghiệm số
của phương trình vi phân bằng cách giữ lại các s ố hạng bậc cao của h trong khai triển
Taylor. Tuy nhiên khi đó ta sẽ cần phải tính các biểu thức phức tạp của các đạo hàm
bậc cao. Một quy trình tính toán như thế về nguyên tắc là đúng đắn nhưng không hiệu
quả. Chúng ta cần một quy trình tính toán khác hiệu quả hơn.

Ý tưởng ở đây là: cải thiện đại lượng “dẫn hướng” (predictor). Cụ thể ta có thể xét đại
lượng trung bình:
y′ + y′
p= i i +1

i 2
trong đó yi’ được xác định là:
yi′ = f (xi , yi )
Để xác định y’ ta trước tiên tính:
yi0+1 = yi + f (xi , yi )h
rồi thay vào biểu thức của f ta được:
(
yi′+1 = f xi+1, yi0+1 )
Từ đó ta tính được pi như sau:
1
p= f (x , y ) + f (x , y0 )
+ +
Thay kết quả này vào công thức Euler ta được công thức nghiệm mới gọi là Phương
pháp Heun như sau:
y =y 1
i+1 i + (
f (xi , yi ) + f xi+1 , yi
0 2
+1 ) h + O( h )
(**)

2
Để làm sáng tỏ bậc chính xác của công thức Heun ta chú ý rằng độ lớn của f có thể
được ước tính theo công thức:
(
yi′+1 = f xi+1, yi0+1 ) = f (xi+1 + h, yi + fi h) ≈ f (xi , yi ) + yi′h
thành thử công thức (**) đã đạt được bậc chính xác bậc hai.

Để minh hoạ tính hiệu quả của phương pháp này ta xét ví dụ thực hành sau.
Ví dụ thực hành: Sử dụng phương pháp Heun để tính nghiệm của phương trình trong
khoảng với bước nhảy bằng 1. Điều kiện ban đầu tại là y(0) = 0.
I'' X' Y(Euler)'' Y(Heun)' Y(đú ng)'' Sai' số ' Sai' số '
tuyệt'đố i'' tương'
đố i''
1' 0' 0' 0' 0' 0' PP'
2' 0.1' 0.10000' 0.08600' 0.08567' 0.00033' 0.39%'
3' 0.2' 0.17200' 0.14600' 0.14533' 0.00067' 0.46%'
4' 0.3' 0.22000' 0.18400' 0.18300' 0.00100' 0.55%'
5' 0.4' 0.24800' 0.20400' 0.20267' 0.00133' 0.66%'
6' 0.5' 0.26000' 0.21000' 0.20833' 0.00167' 0.80%'
7' 0.6' 0.26000' 0.20600' 0.20400' 0.00200' 0.98%'
8' 0.7' 0.25200' 0.19600'' 0.19367' 0.00233' 1.20%'
9' 0.8' 0.24000' 0.18400' 0.18133' 0.00267' 1.47%'
10'' 0.9' 0.22800' 0.17400' 0.17100' 0.00300' 1.75%'
11' 1.0' 0.22000' 0.17000' 0.16667' 0.00333' 2.00%'

Nhận xét: Cũng đạt tới độ chính xác ở chữ số thập phân thứ hai, tương tự như phương
pháp bậc hai.

Bài 4 – Phương pháp Runge-Kutta


Ý tưởng cải tiến của Heun tuy đơn giản nhưng lại đạt hiệu quả cao. Đặc biệt hơn, nó
gợi ý cho việc xây dựng được một quy trình khái quát hơn trong việc cải thiện công
thức tính nghiệm của phương trình vi phân.

Dựa trên tính chất khái quát của quy trình tính toán Runge-Kutta mà có thể xây dựng
ra nhiều công thức tính nghiệm với độ chính xác cao. Tuy nhiên, trong thực hành
người ta nh ận thấy có quy trình tính toán bậc 4 là có nhiều thuận lợi: vừa đơn giản
vừa cho độ chính xác lên tới bậc 4 của h. Quy trình này được gọi là Phương pháp
Runge-Kutta bậc 4 được mô tả như sau:

Với i chạy từ 1 tới N-1 ta tính các đại lượng:


! k1 = f (xi , yi ) '

! k2 =
f i +1 , y+ 1
x h k hi
'
1

2 2
!k +1
h, y + 1 k
3
=f x i
h'
i 2

2 2
! k4 = f (xi + h, yi + k3h) '
! Khi đó, giá trị của nghiệm tại điểm i+1 được xác định là:
1
yi+1 = yi + (k1 + 2k2 + 2k3 + k4 )h
6
'

Ví dụ thực hành: Tính nghiệm của phương trình vi phân


1
y′ = 4e0.8 x − y trong khoảng giá trị biến đổi của biến độc lập x ∈[0, 4] với bước
2
nhảy h = 0.5. Biết rằng điều kiện ban đầu của hàm số là Y(0) = 2.

Bài làm
Nhận xét: Phương trình đã cho được viết lại như sau:
1 x
y′ + y = 4e0.8
2
Đây là một phương trình vi phân tuyến tính cấp 1 nên có thể tìm được lời giải đúng
bằng phương pháp biến thiên hằng số:
1
y (
= 1 .3 4e0.8 x −1.4e−0.5 x
)
Chúng ta sẽ sử dụng nghiệm đúng này để đánh giá độ chính xác của nghiệm tính số.
Để tính nghiệm số chúng ta cần nhận định biểu thức vế phải như sau:
1
y′ = f (x, y) = 4e0.8 x − y
2
Bước 1: Phân hoạch miền giá trị của X:
! Khoảng giá trị của X: [a=0, b = 4]
! Độ dài khoảng chia: h = 0.5
! Số khoảng chia: N = (b-a)/h = 8
! Số điểm chia: M = N+1 = 9
! Vị trí các điểm chia: X1 = 0; X2 = 0.5; X3 = 1.0; X4 = 1.5; X5 = 2.0; X6 = 2.5;
X7 = 3.0; X8 = 3.5; X9 = 4.0
Bước 2: Tính giá trị của Y tại M điểm chia của X:
! Giá trị ban đầu: Y(1) = 2
! Sử dụng phương pháp Runge-Kutta bậc 4: Với mọi i = 1, 2,...., 8 ta tính:
o K1 = f(X(i), Y(i))
o K2 = f(X(i)+h/2, Y(i)+K1*h/2)
o K3 = f(X(i)+h/2, Y(i)+K2*h/2)
o K4 = f(X(i)+h, Y(i)+K3*h)
o Y(i+1) = Y(i)+(K1+K2+K3+K4)*h/6
Các số liệu tính toán được trình bày trong bảng sau:
i X K1 K2 K3 K4 Y Y(dung) dY
1 0 3 3.510611 3.446785 4.105603 2 2.000000 0
2 0.5 4.091449 4.901194 4.799976 5.826320 3.751699 3.751521 0.00018
3 1.0 5.804643 7.050026 6.894353 8.459358 6.195042 6.194631 0.00041
4 1.5 8.426581 10.31359 10.07771 12.43881 9.707772 9.707042 0.00073
5 2.0 12.38957 15.22734 14.87261 18.41551 14.84510 14.84392 0.00118
6 2.5 18.34179 22.59290 22.06151 27.36289 22.42885 22.42701 0.00184
7 3.0 27.25271 33.60837 32.81391 40.73511 33.67998 33.67717 0.00281
8 3.5 40.57057 50.06281 48.87628 60.70304 50.41601 50.41177 0.00424
9 4.0 75.34533 75.33896 0.00637

Nhận xét: Độ chính xác của nghiệm đạt đến chữ số thập phân thứ hai.

You might also like