ĐẠI HỌC THÁI NGUYÊN
TRƯỜNG ĐẠI HỌC SƯPHẠM
TRẦN THỊHOÀN
GIẢI GẦN ĐÚNG PHƯƠNG TRÌNH PHI TUYẾN VÀ PHƯƠNG TRÌNH VI PHÂN TRÊN MÁY TÍNH ĐIỆN TỬ
LUẬN VĂN THẠC SĨTOÁN HỌC
THÁI NGUYÊN - 200
MỤC LỤC
Trang
Lời nói đầu.
Chương 1. Giải gần đúng phương trình phi tuyến trên máy tính điện tử
Đ1. Giải gần đúng phương trình f (x ) 0
Đ2. Các phương pháp tìm nghiệm gần đúng của phương trình f (x ) 0
Đ3. Tìm nghiệm gần đúng của phương trình f (x ) 0 trên máy tính điện tử
Chương 2. Giải gần đúng nghiệm của bài toán Cauchy cho phương trình vi phân thường trên máy tính điện tử .
Đ1. Phương pháp giải gần đúng bài toán Cauchy cho phương trình vi phân thường
Đ2. Phương pháp Euler
Đ3. Phương pháp Runge-Kutta
Đ4. Giải bài toán Cauchy cho phương trình vi phân trên máy tính điện tử
Kết luận.
Tài liệu tham khảo.
82 trang |
Chia sẻ: maiphuongtl | Lượt xem: 1780 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Luận văn Giải gần đúng phương trình phi tuyến và phương trình vi phân trên máy tính điện tử, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
0001 C 29 27( ; )c c
30 0,86547403c
A -0,000000000216 0,00000001 C 30 27( ; )c c
Nghiệm gần đúng là
30 0,865474033 x c
radian và
( ) 0,000000000216 f x
Phƣơng pháp lặp
Phương trình 3 cos 0 x x tương đương với 3 cos ( ) x x x.
Dãy lặp có dạng
3
1 cos n nx x
.
Trước tiên ta phải vào MODE sử dụng radian bằng cách bấm phím:
SHIFT MODE 4
Chọn giá trị ban đầu
0
4
x
:
SHIFT
4
Khai báo
( )nx
:
SHIFT
3
cos Ans
)
Tính giá trị của
0( )x
: Bấm phím
Tính các giá trị tiếp theo: Bấm phím
CALC
Ta được dãy xấp xỉ:
0.8908987181; 0.8566779192; 0.8684331147; 0.8644689718; 0.8658143009;
0.8653587072; 0.8655131056; 0.8654607937; 0.865478519; 0.8654725131;
0.8654745481; 0.8654738586; 0.8654740922; 0.8654740131; 0.8654740399;
0.8654740308; 0.8654740339; 0.8654740328; 0.8654740332; 0.8654740331.
44
Như vậy, sau 20 lần bấm phím
CALC
, ta đi đến nghiệm xấp xỉ
0,8654740331x
.
Phƣơng pháp dây cung
Hàm số
3( ) cos y f x x x
có
2( ) 3 sin 0y f x x x
và
( ) 6 cos 0y f x x x
với mọi
;1
4
x
. Theo công thức dây cung
1
( )( )
( ) ( )
n n
n n
n
f x x b
x x
f x f b
,
0
4
x
ta có
3
1 3
( cos )( 1)
cos (1)
n n n
n n
n n
x x x
x x
x x f
,
0
4
x
.
Khai báo
0
4
x
:
SHIFT
4
Khai báo công thức
3
1 3
( cos )( 1)
cos (1)
n n n
n n
n n
x x x
x x
x x f
:
Ans
(
Ans SHIFT
3x cos Ans
) ) (
Ans
1
)
(
Ans SHIFT
3x
cos Ans
)
ALPHA A
)
Tính các giá trị
1nx
bằng cách bấm liên tiếp phím
. Ta được dãy các giá trị:
0.8554102741; 0.8642643557; 0.8653292731; 0.865456721; 0.8654719629;
0.86547376855; 0.8654740035; 0.8654740296; 0.8654740327; 0.8655740331;
0.8655740331; 0.8654740331.
Sau 10 lần bấm phím
, ta đi đến nghiệm xấp xỉ
0,8654740331x
.
Phƣơng pháp tiếp tuyến
Theo công thức tiếp tuyến
1
( )
'( )
n
n n
n
f x
x x
f x
ta có 3
1 2
cos
3 sin
n n
n n
n n
x x
x x
x x
.
Ta chọn giá trị ban đầu
0
4
x
.
Khai báo giá trị ban đầu:
SHIFT
4
45
Khai báo công thức 3
1 2
cos
3 sin
n n
n n
n n
x x
x x
x x
:
Ans
(
Ans SHIFT
3x cos Ans
) )
(
3
Ans
2x sin Ans
)
Tính các giá trị
1nx
bằng cách bấm liên tiếp phím
. Ta được dãy các giá trị:
0.8724441024; 0.8655207565; 0.8654740352; 0.8654740331; 0.8654740331;
0.8654740331; 0.8654740331.
Sau bốn lần bấm phím
ta đã đi đến đáp số
0,8654740331x
.
Kết luận: Cả bốn phương pháp đều cho đáp số
0,8654740331x
.
52
CHƢƠNG II
GIẢI GẦN ĐÚNG NGHIỆM CỦA BÀI TOÁN
CAUCHY CHO PHƢƠNG TRÌNH VI PHÂN THƢỜNG
TRÊN MÁY TÍNH ĐIỆN TỬ
Đ1. PHƢƠNG PHÁP GIẢI GẦN ĐÚNG BÀI TOÁN CAUCHY
CỦA PHƢƠNG TRÌNH VI PHÂN THƢỜNG
Số lượng phương trình vi phân giải được bằng cầu phương (nghiệm được
biểu diễn thông qua các phép tính và các hàm cơ bản) là rất ít. Thậm chí khi có công
thức nghiệm của phương trình vi phân, do sự phức tạp của công thức, chưa chắc ta
đã có thể khảo sát được các tính chất của nghiệm. Vì vậy, để nghiên cứu phương
trình vi phân, người ta thường không giải trực tiếp phương trình, mà sử dụng hai
phương pháp: phương pháp định tính - nghiên cứu các tính chất của nghiệm (tồn tại
và duy nhất, tính bị chặn, nghiệm tuần hoàn, tính ổn định,...) thông qua vế phải của
phương trình và phương pháp giải gần đúng - tìm nghiệm dưới dạng xấp xỉ. Hai
phương pháp này hỗ trợ và bổ sung nhau.
Để giải gần đúng phương trình vi phân, người ta thường dùng hai phương
pháp: phương pháp giải tích - tìm nghiệm xấp xỉ dưới dạng một dãy các hàm số
liên tục hội tụ đều tới nghiệm (là một hàm khả vi thỏa mãn phương trình vi phân và
điều kiện đầu) trên một khoảng
,a b
nào đó và phương pháp số - tìm nghiệm xấp
xỉ dưới dạng các giá trị số của nghiệm tại một số điểm trên đoạn
,a b
và kết quả
được cho dưới dạng bảng, như phương pháp đường gấp khúc Euler, phương pháp
Runge-Kutta, phương pháp đa bước,...
Trong chương này, chúng tôi trình bày phương pháp đường gấp khúc Euler
và phương pháp Runge-Kutta giải bài toán Cauchy cho phương trình vi phân
thường. Nhằm minh họa cho khả năng sử dụng máy tính điện tử để giải phương
trình vi phân, trợ giúp cho học tập của sinh viên khi học môn học này, chúng tôi thể
53
hiện phương pháp Euler và phương pháp Runge-Kutta trên máy tính điện tử khoa
học Casio fx-570 ES và trên chương trình Maple.
1.1. Bài toán Cauchy của phƣơng trình vi phân cấp một
Bài toán: Tìm nghiệm
( )y y x
của phương trình
( , )y f x y
(1.1)
thỏa mãn điều kiện ban đầu
0 0( )y x y (1.2)
(tức là tìm một hàm khả vi
( )y y x sao cho 0 0( )y x y và ( ) ( , ( ))y x f x y x
trong một lân cận nào đó của
0x
).
Dễ dàng chứng minh được rằng, phương trình vi phân (1.1) tương đương với
phương trình tích phân
0
0( ) ( , ( ))
x
x
y x y f s y s ds
, (1.3)
theo nghĩa, mọi nghiệm của phương trình (1.1) là nghiệm liên tục của phương trình
(1.3) và ngược lại (xem, thí dụ, [7], [8]).
Ta có Định lí sau đây về sự tồn tại và duy nhất nghiệm của phương trình vi
phân (1.1) thỏa mãn điều kiện ban đầu (1.2).
Định lí 1 (Picard-Lindelof) Giả sử:
1. Hàm số
( , )f x y
là liên tục theo cả hai biến trong miền đóng, giới nội
D
:
0 0
0 0
x a x x a
y b y y b
(Do
D
là một miền đóng, giới nội nên từ giả thiết này suy ra tồn tại một số dương
M
sao cho
( , ) f x y M
với mọi
( , )x y D
).
2. Hàm hai biến
( , )f x y
thỏa mãn điều kiện Lipschitz theo biến
y
trong
D
đều theo
x
, tức là tồn tại một hằng số dương
L
sao cho
1 2 1 2( , ) ( , ) f x y f x y L y y
với mọi
1 2( , ) , ( , ) x y D x y D
.
54
Khi ấy tồn tại duy nhất một nghiệm
( )y y x
của phương trình (1.1) trong khoảng
0 0 x H x x H
, trong đó
min( , )
b
H a
M
, thỏa mãn điều kiện ban đầu
(1.2).
Chứng minh Định lí này có thể xem trong [7], [8].
Nhận xét 1. Nếu hàm
( , )f x y và ( , )
f x y
y
là liên tục trên hình chữ nhật D thì
( , )
f x y
L
y
với mọi ( , )x y D . Hơn nữa, theo Định lí giá trị trung bình, với
mỗi cặp
1( , )x y
và
2( , )x y
tồn tại điểm
*( , )x y D
sao cho
*
1 2 1 2 1 2
( , )
( , ) ( , )
f x y
f x y f x y y y L y y
y
.
Chứng tỏ
( , )f x y thỏa mãn điều kiện Lipschitz.
Nhận xét 2. Định lí Picard-Lindelof có tính chất địa phương (tồn tại nghiệm trong
một lân cận của
0x
là khoảng
0 0, x H x H
).
Với một số lớp hàm
( , )f x y
, ta có thể chứng minh sự tồn tại nghiệm toàn cục của
phương trình (1.1). Thí dụ, sự tồn tại nghiệm toàn cục của phương trình tuyến tính
' ( ) ( ) y P x y Q x
trên toàn đoạn
,a b
là hệ quả của Định lí sau.
Định lí 2 Giả sử ( , )f x y là hàm liên tục theo hai biến và thỏa mãn điều kiện
Lipschitz
1 2 1 2( , ) ( , ) f x y f x y L y y
trong miền chữ nhật vô hạn
[ , ] ( , ) a b
và
0 0( , )x y
là một điểm trong của
miền đó. Khi ấy bài toán giá trị ban đầu (1.1)-(1.2) có nghiệm duy nhất trên đoạn
,a b
.
1.2. Bài toán Cauchy của hệ phƣơng trình vi phân cấp một
Các Định lí tồn tại nghiệm của bài toán Cauchy cho phương trình vi phân
cấp một có thể phát biểu tương tự cho hệ
n
phương trình vi phân cấp một
55
1 1 1 2
2 2 1 2
1 2
( ) ( , , ,... )
( ) ( , , ,... )
.....................
( ) ( , , ,... )
n
n
n n n
y x f x y y y
y x f x y y y
y x f x y y y
(1.4)
Hệ (1.4) có thể viết dưới dạng
( , )y f x y
, trong đó
1 2( , ,..., )
T
ny y y y
và
1 2( , ,..., )
T
nf f f f
là những vectơ
n
chiều. Dưới đây chúng ta phát biểu một
dạng tương tự của Định lí 1 cho hệ phương trình vi phân cấp một.
Định lí 1’ Cho hệ phương trình vi phân (1.4), trong đó hàm
f
xác định và liên
tục trên tập mở
D R Rn
và thoả mãn điều kiện Lipschitz theo
y
đều theo
x
trên
D
:
1 2 1 2( , ) ( , ) f x y f x y K y y
với mọi
1 2( , ) , ( , ) x y D x y D
.
Khi ấy với mỗi
0 0( , )x y D
tìm được một số
0d
sao cho trên khoảng
0 0, x d x d
tồn tại và duy nhất nghiệm của phương trình vi phân (1.4) thoả
mãn điều kiện
0 0( ) y x y
.
Chứng minh: Xem [7], [8].
Đ2. PHƢƠNG PHÁP EULER
2.1. Phƣơng pháp Euler
Khi
( , )f x y
là liên tục nhưng không là Lipschitz, nghiệm của bài toán
Cauchy vẫn tồn tại, nhưng có thể không duy nhất.
Thí dụ 2.1. Xét bài toán Cauchy
3
dy
y
dx
,
(0) 0y
.
Bài toán này có vô số nghiệm: ngoài nghiệm
( ) 0y x
còn có một họ nghiệm
( ) 0y x
khi
x c
và 322( )
( )
3
x c
y x
khi
x c
, trong đó
0c
bất kì.
56
Thí dụ 2.2. Xét bài toán Cauchy
3(sin 2 )
dy
x y
dx
,
(0) 0y
.
Bài toán này có ba nghiệm
( ) 0y x
;
32 2( ) sin
3 3
y x x
.
Nhận xét rằng các hàm số
3( , ) f x y y
và
3( , ) sin 2 .f x y x y
không là
Lipschitz theo
y
trong lân cận điểm (0,0).
Các thí dụ trên cho thấy, nếu hàm
( , )f x y
không là Lipschitz thì Định lí về tồn tại
duy nhất nghiệm (Định lí Picard-Lindenlof) không còn đúng. Tuy nhiên ta vẫn có
Định lí tồn tại nghiệm sau đây:
Định lí 1 (Cauchy-Peano) Giả sử
( , )f x y
là hàm liên tục theo hai biến trong miền
đóng, giới nội
D
:
0 0
0 0
x a x x a
y b y y b
(Do
D
là một miền đóng, giới nội nên từ giả thiết này suy ra tồn tại một số dương
M
sao cho
( , ) f x y M
với mọi
( , )x y D
).
Khi ấy tồn tại ít nhất một nghiệm
( )y y x
của phương trình (1.1) trong khoảng
HxxHx 00
, trong đó
min( , )
b
H a
M
, thỏa mãn điều kiện ban đầu (1.2).
Chứng minh. Nhằm mục đích thể hiện phương pháp tính gần đúng nghiệm, dưới
đây chúng tôi trình bày chứng minh Định lí Cauchy-Peano bằng phương pháp dựa
trên khái niệm đường gấp khúc Euler.
Từ
0 0( , )x y
kẻ hai đường thẳng với hệ số góc là
M
và
M
.
Các đường thẳng này có phương trình là
0 0( )y y M x x
và
0 0( )y y M x x
Chúng cắt hai đường thẳng
57
song song
0 y y b
và
0 y y b
tại các điểm có hoành độ là
0
b
x
M
và
0
b
x
M
(xem hình vẽ).
Gọi
h
là độ dài bước (stepsize) của biến độc lập
x
(
h có thể dương hoặc âm, khi h
dương thì nghiệm được xây dựng về bên phải của điểm
0x
và ngược lại, khi
h âm
thì nghiệm được xây dựng về bên trái của
0x
. Dưới đây ta coi
0h
, trường hợp
0h
có thể chứng minh tương tự).
Ta tìm giá trị gần đúng của nghiệm tại các nút giá trị của
ix
với
1,2,...,i n
(
1
H
n
h
):
1 0
2 1 0
0
;
2 ;
.........................
.
n
x x h
x x h x h
x x nh
Độ dốc của đuờng tiếp tuyến trong đồ thị của hàm số
( )y f x
tại các giá trị của
x
được cho bởi công thức :
( ) ( , ( ))y x f x y x
.
Chẳng hạn, tại
0x x
độ dốc của đường tiếp tuyến là
0 0 0 0 0'( ) ( , ( )) ( , ) y x f x y x f x y
.
Khi đó, phương trình đường tiếp tuyến với đường cong
y y( x )
đi qua điểm
0 0( , )x y
có dạng:
0 0 0 0 0 0( )( ) ( , )( )y y y x x x f x y x x
hay
0 0 0 0( , )( )y f x y x x y
. (2.1)
Dùng đường này để tìm giá trị xấp xỉ của nghiệm
y y( x )
tại
1x x
(kí hiệu là
1y
), ta có
1 0 0 1 0 0 0 0 0( , )( ) ( , )y f x y x x y hf x y y
.
58
Tiếp đó, dùng điểm
1 1,x y
để tính giá trị của
y
tại
2x x nhờ phương trình
đường tiếp tuyến
1 1 1 1( , )( )y y f x y x x
hay
1 1 1 1( , )( )y f x y x x y
.
Tiếp tục quá trình này, tại
nx x
ta tính được:
1 ( , )n n n ny hf x y y
. (2.2)
Nối các điểm
( , )i ix y
với
1,...,i n
, ta được một đường gấp khúc
( )hy x
, được gọi
là đường gấp khúc Euler (xem hình vẽ). Với mỗi
h
chọn trước, đường gấp khúc
Euler cho ta một xấp xỉ của đường cong nghiệm, nó trùng với tiếp tuyến của các
đường cong nghiệm (khác nhau) tại mỗi điểm
( , )i ix y
. Công thức hiển của đường
gấp khúc này là
0 0( ) hy t x
;
1 1 1 1( ) ( ) ( , ( ))( ) h h k k h k ky t y t f t y t t t
,
1 k kt t t
,
1,2,...,k n
.
Khi
h
thay đổi ta được một họ các đường gấp khúc Euler. Cho
h
tiến tới
0 ta được
một họ các hàm số (các đường gấp khúc) giới nội đều và liên tục đồng bậc trên
khoảng
0 0 x x x H
.
Thật vậy, đồ thị của mọi đường gấp khúc đều nằm trong tam giác T giới hạn bởi các
đường thẳng
0 0( ) y y M x x
và
0 x x H
(xem hình vẽ) nên chúng bị chặn
đều.
Do '' '
'
( '') ( ') ( ) '' '
x
h h h
x
y x y x y s ds M x x
với mọi
h
và
0 0', '' x x x x H
nên họ hàm
( )hy x
liên tục đồng bậc.
Theo bổ đề Arzelà, từ
( )hy x
có thể trích ra một dãy các hàm hội tụ đều tới một
hàm liên tục
( )y y x
trên khoảng đó. Hàm
( )y y x
chính là nghiệm của phương
trình vi phân (1.1) thỏa mãn điều kiện ban đầu (1.2).
Định lý chứng minh xong.
59
Nhận xét. Phương pháp đường gấp khúc Euler nói chung không cho ta tất cả các
nghiệm của phương trình (21)-(2.2). Thí dụ, mọi họ đường gấp khúc Euler áp dụng
cho bài toán Cauchy
3
dy
y
dx
,
(0) 0y
đều hội tụ tới nghiệm
0y
, vì vậy ta
không tìm được tất cả các nghiệm của phương trình này.
Dưới đây chúng ta phát biểu Định lí Cauchy-Peano cho hệ phương trình vi
phân (phương trình vi phân vectơ).
Định lí 1’. Giả sử
1. Hàm
: nf D R
liên tục trên tập
D
,
0 0 0( , ) : ,D t x t t t a x x b
.
2.
M
và
là những số sao cho
( , ) , , min( , )
b
f t x M t x D a
M
.
Khi ấy phương trình vi phân (1.1) có ít nhất một nghiệm thoả mãn điều kiện ban
đầu (1.2) trên đoạn
0 0,t t
.
Phương pháp Euler tuy cho xấp xỉ nghiệm của bài toán Cauchy tương đối
thô, nhưng đơn giản, dễ tính toán, và khi
h
càng nhỏ thì xấp xỉ nghiệm càng tốt,
điều này được thể hiện rõ ràng qua các tính toán cụ thể trong các ví dụ trình bày
trong Đ4. Với tốc độ của máy tính hiện nay, ta cũng có thể sử dụng phương pháp
Euler trong các bài toán thực tế, đặc biệt là để minh họa phương pháp số trong
giảng dạy môn phương trình vi phân.
Nhận xét rằng có nhiều cách để đi đến công thức (2.2), là cơ sở của phương pháp
đường gấp khúc Euler (xem [8]).
2.1. Phƣơng pháp Euler cải tiến
Phương pháp Euler có tốc độ hội tụ chậm, nó có thể cải tiến nhờ độ dốc
trung bình trong mỗi khoảng nhằm tăng tốc độ chính xác như sau.
Trước tiên, ta sử dụng tiếp tuyến của đường cong qua điểm
0 0( , )x y
:
60
0 0 0 0( , )( ) y f x y x x y
để tìm giá trị xấp xỉ của nghiệm
( )y y x
tại
1x x
( và kí hiệu là
*
1y
) . Khi đó (
với
1 0h x x
):
*
1 0 0 0( , ) . y hf x y y
Như vậy, với phương trình
( , ), y f x y
ta tìm được độ dốc xấp xỉ của đường tiếp
tuyến tại
1x x
là
*
1 1 1'( ) ( , )y x f x y
. Giá trị trung bình của hai độ dốc
0 0( , )f x y
và
*
1 1( , )f x y của tiếp tuyến tại hai điểm 0 0( , )x y và *1 1( , )x y là
*
0 0 1 1( , ) ( , )
2
f x y f x y và phương trình của đường thẳng đi qua
0 0( , )x y
với độ dốc *
0 0 1 1( , ) ( , )
2
f x y f x y là
*
0 0 1 1
0 0
( , ) ( , )
( )
2
f x y f x y
y x x y
.
Khi đó, tại
1x x
giá trị gần đúng của
( )y y x
được tính theo công thức trên là:
* *
0 0 1 1 0 0 1 1
1 1 0 0 0
( , ) ( , ) ( , ) ( , )
( )
2 2
f x y f x y f x y f x y
y x x y h y
.
Tiếp tục với cách làm này, giá trị xấp xỉ trong mỗi bước của phương pháp Euler cải
tiến phụ thuộc vào hai tính toán:
^
1 1 1
^
1 1
1
. ( , )
( , ) ( , )
2
n
n
n n n
n n n
n n
y h f x y y
f x y f x y
y h y
(2.6)
Từ công thức trên ta suy ra:
1 1
1 1
. ( , ) . ( , . ( , ))
2 2
n n n n n n n ny y h f x y h f x y h f x y
. (2.7)
Sử dụng công thức này, ta tìm được nghiêm xấp xỉ tốt hơn so với phương pháp
Euler. Điều này sẽ được thấy rõ trong các ví dụ ở Đ4.
Đ3.PHƢƠNG PHÁP RUNGE - KUTTA
61
Một trong những phương pháp số giải phương trình vi phân hiệu quả, thông
dụng và phổ biến nhất trong các bài toán kĩ thuật là phương pháp Runge-Kutta. Có
thể suy ra các công thức trong phương pháp Runge-Kutta từ công thức xấp xỉ tích
phân. Trong mục này, khác với các tài liệu [1]–[6], chúng tôi trình bày phương pháp
Runge-Kutta xuất phát từ qui tắc cầu phương theo [7]. Cách làm này cho phép hiểu
các phương pháp số giải phương trình vi phân một cách nhất quán hơn (xem [7]).
Để làm được điều này, trước tiên chúng ta nhắc lại quy tắc cầu phương cơ bản
(basic quadrature rules).
3.1. Quy tắc cầu phƣơng cơ bản
Nội dung cơ bản của quy tắc cầu phương là: Để tính tích phân
( )
b
a
f t dt
ta
thay
( )f t
bởi một đa thức nội suy (interpolating polynomial). Tích phân của hàm
( )f t
trên đoạn
,a b
được xấp xỉ bởi tích phân của hàm đa thức (tính được chính
xác).
Giả sử ta có
s
điểm nội suy khác nhau
1 2, ,..., sc c c
trong khoảng
,a b
. Đa
thức nội suy Lagrange bậc nhỏ hơn
s
có dạng (xem [1]):
1
( ) ( ) ( )
s
j j
j
t f c L t
,
trong đó
1,
( )
( )
( )
s
i
j
i i j j i
t c
L t
c c
.
Khi ấy
1
( ) ( )
b s
j j
ja
f t dt f c
.
Các trọng số
j
được tính theo công thức
( ) .
b
j j
a
L t dt
Nếu
1s
thì đa thức nội suy
1( ) ( )t f c
và ta có:
62
1( ) ( ) ( ).
b
a
f t dt b a f c
Ta nói độ chính xác (precision) của quy tắc cầu phương là
p
nếu quy tắc này chính
xác cho mọi đa thức bậc nhỏ hơn
p
, tức là với mọi đa thức
( )kP t
bậc nhỏ hơn
p
ta có:
1
( ) ( ).
b s
k j j
ja
P t dt f c
Nếu
0( ) b a h
thì sai số trong quy tắc cầu phương của độ chính xác
p
là
10( ).ph
Ta xét một số trường hợp đặc biệt.
Nếu chọn
1s
và
1 c a
thì ta có
công thức xấp xỉ tích phân bởi
diện tích hình chữ nhật ABCD:
( ) ( ) ( ).
b
a
f t dt b a f a
(3.1)
Nếu
( )y x
là nghiệm của phương trình vi phân (1.1) - (1.2) thì:
( ) ( ) ( , ( )) .
x h
x
y x h y x f s x s ds
(3.2)
Kết hợp với công thức (3.1) ta đi đến công thức:
( ) ( ) . ( , ( )). y x h y x h f x y x
Từ đây ta lại có công thức Euler tiến đã biết trong Đ2:
1 . ( , ).n n n ny y h f x y
Nếu chọn s=1 và c=b thì ta có công thức xấp xỉ tích phân bởi diện tích hình chữ
nhật ABEF:
63
( ) ( ) ( ).
b
a
f t dt b a f b
Từ đây ta có:
( ) ( ) . ( , ( )) y x h y x h f x h y x h
Suy ra công thức Euler lùi:
1 1 1. ( , ). n n n ny y h f x y
Hai phương pháp Euler tiến và lùi là những phương pháp Runge-Kutta bậc nhất (có
độ xấp xỉ bậc nhất).
Nếu chọn
2s
và
1 2, c a c b
thì
1( )
( )
t b
L t
a b
và
2( ) .
( )
t a
L t
b a
Suy ra
2
1 1
1 ( )
( )
( ) ( ) 2 2
bb b
a a a
t b t b b a
L t dt dt
a b a b
và
2
2 2
1 ( )
( ) .
( ) ( ) 2 2
ab b
a a b
t a t a b a
L t dt dt
b a b a
Chứng tỏ
( ) [ ( ) ( )]
2
b
a
b a
f t dt f a f b
.
Như vậy nếu xấp xỉ tích phân
( , ( ))
x h
x
f t y t dt
bởi công thức trên (bởi diện tích
hình thang ABED)
thì ta được:
( , ( )) [ ( , ( )) ( , ( ))].
2
x h
x
h
f t y t dt f x h y x h f x y x
Từ đây ta có công thức hình thang:
1 1 1[ ( , ) ( , )].
2
n n n n n n
h
y y f x y f x y
64
Nếu chọn
1s
và
1
2
a b
c
thì ta có công thức xấp xỉ tích phân bởi diện tích
hình chữ nhật ABMN:
( , ( )) . ( , ( )).
2 2
x h
x
h h
f t y t dt h f x y x
Từ đây ta có công thức tính giá trị
xấp xỉ nghiệm của phương trình vi phân:
( ) ( ) . ( , ( ))
2 2
h h
y x h y x h f x y x
.
Từ công thức trên ta có
1 [ ( , ( )].
2 2
n n n n
h h
y y h f x y x
Công thức này được gọi là phương pháp điểm giữa (midpoind method).
Phương pháp điểm giữa và phương pháp hình thang là hai phương pháp ẩn, chúng
có độ chính xác
2p
.
Nếu chọn
3s
và
1 2 3, ,
2
a b
c a c c b
thì, đặt
h b a
, ta có:
1 2
( )( )
22( ) ( )( ),
2
( )( )
2
a b
t t b
a b
L t t t b
a b ha a b
2 2
( )( ) 4
( ) ( )( ),
( )( )
2 2
t a t b
L t t a t b
a b a b h
a b
3 2
( )( )
22( ) ( )( ).
2
( )( )
2
a b
t a t
a b
L t t a t
a b hb a b
Suy ra:
65
1 1 2 2
3 2
2
2 2
3
2
2 2
( ) ( )( ) ( )( )
2 2
2 2 ( ) ( )
[( ) ( )( )] [ ( ) ]
2 3 2 2
2 ( )
.
12 6
b b b
a a a
bb
a a
a b a b
L t dt t t b dt t b t b dt
h h
a b t b a b t b
t b t b dt
h h
b a h
h
và
2 2 2 2
3 2
2
4 4
( ) ( )( ) ( )( ( ))
4 ( ) ( ) 4
[ ( )] .
3 2 6
b b b
a a a
b
a
L t dt t a t b dt t a t a a b dt
h h
t a t a h
a b
h
Do tính chất đối xứng (hoặc tính trực tiếp), ta có
3 1
6
h
.
Từ các tính toán trên ta đi đến công thức Simpson:
( ) [ ( ) 4 ( ) ( )]
6 2
b
a
h a b
f t dt f a f f b
.
Suy ra công thức xấp xỉ nghiệm của phương trình vi phân
( ) ( ) [ ( , ( )) 4 ( , ( )) ( , ( ))]
6 2 2
h h h
y x h y x f x y x f x y x f x h y x h
và công thức sai phân
1 1 1[ ( , ) 4 ( , ( )) ( , )]
6 2 2
n n n n n n n n
h h h
y y f x y f x y x f x y
.
Đây là công thức ẩn của phương pháp Runge-Kutta kinh điển cấp bốn (classical
fourth-order Runge-Kutta method).
2. Dẫn tới Phƣơng pháp Runge - Kutta
Tính
1ny
theo công thức ẩn đòi hỏi tại mỗi bước phải giải xấp xỉ một
phương trình phi tuyến, điều này không đơn giản và có khả năng làm tăng sai số,
nên ta cố gắng xây dựng các công thức Runge-Kutta hiển từ công thức hình thang
66
ẩn, công thức điểm giữa ẩn và công thức Runge-Kutta kinh điển cấp bốn ẩn tương
ứng như sau.
Trong công thức hình thang ẩn:
1 1 1[ ( , ) ( , )]
2
n n n n n n
h
y y f x y f x y
ta thay giá trị
1ny
ở vế phải bằng công thức Euler tiến:
1
ˆ ( , ) n n n ny y hf x y
.
Khi ấy ta được công thức:
1 1 1
ˆ[ ( , ) ( , )].
2
n n n n n n
h
y y f x y f x y
Công thức này được gọi là phương pháp hình thang hiển (explicit trapezoidal
method).
Bằng cách sử dụng xấp xỉ bậc nhất của
( )
2
n
h
y x
theo phương pháp Euler tiến:
1
2
ˆ ( , )
2
n n n
n
h
y y f x y
và thay vào công thức của phương pháp điểm giữa ẩn
1 [ ( , ( )].
2 2
n n n n
h h
y y h f x y x
ta nhận được phương pháp điểm giữa hiển (explicit midpoint method):
1 1
2
ˆ. ( , ).
2
n n n
n
h
y y h f x y
Từ phương pháp Runge-Kutta ẩn cấp bốn kinh điển
1 1 1
[ ( , ) 4 ( , ( )) ( , )]
6 2 2
n n n n n n n n
h h h
y y f x y f x y x f x y
ta có công thức Runge-Kutta hiển bậc bốn kinh điển sau:
1 1 2 3 4( 2 2 ), 0,1,2,...
6
n n
h
y y k k k k n
(3.3)
trong đó:
67
1
1
2
2
3
4 3
( , );
( , );
2 2
( , );
2 2
( , ).
n n
n n
n n
n n
k f x y
h hk
k f x y
h hk
k f x y
k f x y hk
(3.4)
Như vậy, để tính được
1ny
theo công thức Runge-Kutta hiển, ta chỉ cần tính các hệ
số
ik
,
1,2,3,4i
theo giá trị của hàm số
( , )f x y
tại các điểm trước đó. Việc này
có thể dễ dàng thực hiện được trên chương trình Maple qua các thí dụ trong Đ4 dưới
đây.
Đ4. GIẢI BÀI TOÁN CAUCHY CHO PHƢƠNG TRÌNH VI
PHÂN TRÊN MÁY TÍNH ĐIỆN TỬ
Do được cài đặt các ô nhớ, máy tính khoa học Casio fx-570 ES rất thuận tiện
cho việc thực hiện các thao tác quá trình lặp. Công thức tính xấp xỉ nghiệm theo
phương pháp Euler (2.2), phương pháp Euler cải tiến (2.7) và và phương pháp
Runge-Kutta (3.3) cho thấy, việc giải gần đúng phương trình vi phân (1.1)-(1.2)
thực chất là thực hiện một quá trình lặp, vì vậy có thể dễ dàng thực hiện tính toán
trên máy tính khoa học Casio fx-570 ES hoặc lập trình trên Maple.
Dưới đây chúng tôi sẽ trình bày cách giải bài toán Cauchy cho một phương
trình vi phân bằng phương pháp Euler, Euler cải tiến và phương pháp Runge-Kutta
với các bước nội suy khác nhau trên máy tính khoa học Casio FX-570 ES và trên
Maple.
Bài 1. Sử dụng phương pháp Euler, phương pháp Euler cải tiến và phương pháp
Runge-Kutta với độ dài bước
0,1h
và
0.05h
để tìm xấp xỉ nghiệm của
phương trình
2 2dy x y
dx
thỏa mãn điều kiện ban đầu
(0) 0y
trên đoạn
0 1;
.
Phải tìm nghiệm của phương trình
2 2
dy
x y
dx
với điều kiện ban đầu
0 00, 0x y
.
Với
0,1h
ta có:
68
2 21 ( , ) 0,1( )n nn n n n ny hf x y y x y y
.
Ta có:
0 0
2 2
1 00,1( ) (0,1).(0).(0) 0 0 y x y y
.
Với
1 0 0,1 x x h
:
1 1
2 2 2 2
2 10,1 (0,1).(0,1 0 ) 0 0,001y x y y
.
Tiếp tục như trên, ta tính được các giá trị
ny
theo công thức:
2 2
1 ( , ) 0,1( )n n n n n n ny hf x y y x y y
. (4.1)
Thực hiện phép lặp (4.1) trên Casio fx-570 ES:
Khai báo công thức
2 2
1 0,1( )n n n ny x y y
:
0.1
(
ALPHA X
2x + ALPHA Y 2y ) + ALPHA Y
Trong qui trình này, ta đã dùng ô nhớ
X
để chứa giá trị
nx
và các ô nhớ
Y
để
chứa giá trị của
ny
.
Dùng
CALC
để tính giá trị của
ny
:
CALC
Máy hỏi: X?
Khai báo
0 0x
: Bấm phím 0
=
Máy hỏi: Y?
Khai báo
0 0y
: Bấm phím 0
=
(0)
Kết quả trên màn hình là 0, tức là
2 2 2 2
1 0 0 00,1( ) 0,1(0 0 ) 0 0 y x y y
.
Đưa kết quả
1 0y
vào ô nhớ
Y
:
SHIFT STO Y
Trở về công thức (4.1): Bấm phím
Quy trình:
Tính tiếp:
CALC
Máy hỏi: X? Khai báo
1 0 1x .
: Bấm phím 0.1
=
69
Máy hỏi: Y? Bấm phím
=
(
1 0y
vì đã có sẵn trong ô nhớ
Y
nên không cần
khai báo lại).
Kết quả hiện trên màn hình:
1
1000
, tức là
2 2 2 2 3
2 1 1 10,1( ) 0,1(0,1 0 ) 0 0,1 y x y y
.
Đưa kết quả vào ô nhớ
Y
:
SHIFT STO Y
Trở về công thức ban đầu:
Lặp lại quy trình với thay đổi duy nhất là khi máy hỏi X? thì ta khai báo các giá trị
tiếp theo: 0.2; 0.3; 0.4;...;1.0 ta sẽ được bảng giá trị như trong bảng sau.
n
1nx
ny
n
1nx
ny
1 0 0 6 0,5 0,05511234067
2 0,1
1
1000
7 0,6 0,09141607768
3 0,2
35 001 10,
8 0,7 0,1412517676
4 0,3 0,0140026001 9 0,8 0,2072469738
5 0,4 0,03002220738 10 0,9 0,2925421046
Thực hiện phép lặp (4.1) trên Maple 7:
Trong Maple, để tìm các giá trị
iy
theo công thức lặp ta có thể sử dụng mặc
định (option) remember (nhớ). Mặc định này của Maple cho phép nhớ các giá trị cũ
để tính
ny
, mà không cần tính lại giá trị
1ny
.
Trước tiên ta khởi động chương trình Maple nhờ lệnh restart:
[> restart;
Khai báo hàm
f
:
[> f:=(x,y)->x^2+y^2;
:= f ( ),x y x2 y2
Khai báo bước nội suy
0,1h
:
[> h:=0.1;
:= h .1
Khai báo cách tính các giá trị của
1n nx x h
(với
0 0x
):
70
[> x:=n->n*h;
:= x n n h
Khai báo giá trị ban đầu của
y
:
[> y(0):=0;
:= ( )y 0 0
Khai báo thủ tục tính
ny
theo mặc định remember (nhớ):
[> y:=proc(n) option remember;
[> y(n-1)+h*f(x(n-1),y(n-1));
[> end;
:= y proc( ) end procn option ;remember ( )y n 1 h ( )f ,( )x n 1 ( )y n 1
Khai báo lệnh seq (sắp xếp theo dãy) để sắp xếp các giá trị
0 1 9 10, ,..., ,y y y y
:
[> seq(y(i),i=0..10);
0 0. .001 .0050001 .01400260010.03002220738.05511234067.09141607768, , , , , , , ,
.1412517676.2072469738.2925421046, ,
Ta thấy kết quả này hoàn toàn trùng lặp với kết quả tính trên máy tính khoa học
Casio fx-570 ES.
Để so sánh các kết quả này với nghiệm chính xác, ta dùng lệnh dsolve (giải phương
trình vi phân) để tìm nghiệm chính xác như sau:
Vào gói công cụ Detools (công cụ Phương trình vi phân):
[> with(DEtools):
Tìm nghiệm đúng của phương trình vi phân nhờ lệnh dsolve và kí hiệu nghiệm là
Sol:
[> Sol:=dsolve({diff(Y(X),X)=X^2+Y(X)^2,Y(0)=0},Y(X));
:= Sol ( )Y X
X
BesselJ ,
-3
4
1
2
X2
BesselY ,
-3
4
1
2
X2
BesselJ ,
1
4
1
2
X2
BesselY ,
1
4
1
2
X2
Ta thấy rằng, phương trình vi phân
2 2
dy
x y
dx
hoàn toàn không dễ giải: nghiệm
của nó được biểu diễn thông qua hàm đặc biệt Bessel. Chú ý rằng, trong lệnh tìm
nghiệm chính xác, ta đã dùng những chữ cái in hoa để tránh sự trùng lặp với nghiệm
xấp xỉ.
71
Ấn định công thức nghiệm nhờ lệnh assign:
[> assign(Sol);
Dùng lệnh array (lập mảng) để tạo bảng nhằm so sánh giá trị gần đúng (tính theo
công thức Euler) và giá trị đúng của nghiệm (tính theo công thức nghiệm):
[> array([seq([n,y(n),evalf(subs(X=n/10,Y(X)))],n=0..10)]);
0 0 0.
1 0. .0003333349060
2 .001 .002666869814
3 .0050001 .009003473190
4 .01400260010 .02135938017
5 .03002220738 .04179114620
6 .055 1234067 .07244786118
7 .09141607768 .1156598536
8 .1412517676 .1740802646
9 .2072469738 .2509066824
10 .2925421046 .3502318440
Trong bảng này, cột thứ nhất là số bước lặp, các số trong cột thứ hai tương ứng là
giá trị xấp xỉ, các số trong cột thứ ba là giá trị theo công thức đúng.
Ta thấy kết quả tính toán theo công thức Euler có sai số khá lớn so với nghiệm
chính xác.
Với
0,05h
ta có:
2 21 ( , ) 0,05( )n nn n n n ny hf x y y x y y
.
Tương tự, có thể tính
2 2
1 0,05( )n nn ny x y y
trên Casio fx-570 ES bằng cách
khai báo
0.05
(
ALPHA X
2x + ALPHA Y 2y ) + ALPHA Y
và thao tác hoàn toàn như trên, nhưng với số bước nhiều gấp đôi (20 bước) ta được
bảng kết quả dưới đây.
n
1nx
ny
n
1nx
ny
72
1 0 0 11 0,5 0.0482462821
2 0,05
1
8000
12 0,55 0.06348766728
3 0,1
46 250007813 10,
13 0,6 0.08168920148
4 0,15
31750020313 10.
14 0,65 0.1031478578
5 0,2
33750173441 10.
15 0,7 0.1281798318
6 0,25
36875876631 10.
16 0,75 0.1571263353
7 0,3 0.01137824052 17 0,8 0.1903607695
8 0,35 0.01750971373 18 0,85 0.2282976306
9 0,4 0.02552504324 19 0,9 0,271403621
10 0,45 0.03568261963 20 0,95 0.3202116173
Tính toán trên Maple:
Khai báo vế phải của phương trình (hàm
f
):
[> f:=(x,y)->x^2+y^2;
:= f ( ),x y x2 y2
Khai báo bước nội suy h=0.05:
[> h:=0.05;
:= h .05
Khai báo công thức tính
x
n
x
0
h x
n
(với
0 0x
):
[> x:=n->n*h;
:= x n n h
Khai báo thủ tục tính giá trị
ny
theo công thức Euler:
[> y:=proc(n) option remember;
[> y(n-1)+h*f(x(n-1),y(n-1));
[> end;
:= y proc( ) end procn option ;remember ( )y n 1 h ( )f ,( )x n 1 ( )y n 1
Khai báo giá trị ban đầu:
[> y(0):=0;
:= ( )y 0 0
Lập dãy các giá trị của y từ 0 tới 20:
73
[> seq(y(i),i=1..20);
0. .000125 .0006250007810.001750020313.003750173441.006875876631, , , , , ,
.01137824052.01750971374.02552504324.03568261963.04824628209, , , , ,
.06348766727.08168920147.1031478578 .1281798318 .1571263353 .1903607696, , , , , ,
.2282976307 .2714036211 .3202116174, ,
Vào gói công cụ Phương trình vi phân DEtools:
[> with(DEtools):
Tìm nghiệm đúng của phương trình vi phân nhờ lệnh dsolve :
[> Sol:=dsolve({diff(Y(X),X)=X^2+Y(X)^2,Y(0)=0},Y(X));
:= Sol ( )Y X
X
BesselJ ,
-3
4
1
2
X2
BesselY ,
-3
4
1
2
X2
BesselJ ,
1
4
1
2
X2
BesselY ,
1
4
1
2
X2
Ấn định công thức nghiệm:
[> assign(Sol);
Lập mảng để so sánh giá trị gần đúng (tính theo công thức Euler) và giá trị đúng của
nghiệm (tính theo công thức nghiệm):
[> array([seq([n,y(n),evalf(subs(X=n/20,Y(X))],n=0..20]);
0 0 0.
1 0. .00004166662214
2 .000125 .0003333349060
3 .0006250007810 .001125027190
4 .001750020313 .002666869814
5 .003750173441 .005209302335
6 .006875876631 .009003473190
7 .01137824052 .01430188852
8 .01750971374 .02135938017
9 .02552504324 .03043446027
10 .03568261963 .04179114620
11 .048246282 9 .05570133762
12 .06348766727 .07244786118
13 .08168920147 .09232831036
14 .1031478578 .1156598536
15 .1281798318 .1427852338
16 .1571263353 .1740802646
17 .1903607696 .2099632190
18 .2282976307 .2509066824
19 .2714036211 .2974526313
20 .3202116174 .3502318440
Kết quả trùng khớp với kết quả tính toán trên Maple, có sai khác một đơn vị ở chữ
số thập phân thứ 10 (do làm tròn số).
74
Ta thấy phương pháp Euler với số bước lặp nhiều hơn (20 bước,
0.05h
) cho kết
quả chính xác hơn.
Tính theo phương pháp Euler cải tiến trên máy tính khoa học Casio FX-570
ES:
Khai báo công thức
1 1
2 2 2 2 2 2
1
1
( ( , ) ( , . ( , )))
2
0,05( ( 0,1( )) )
n n n n n n n n
n n n n n n n
y y h f x y f x y h f x y
y x y x y x y
(3.2)
với
0.1h
( 1
0.05
2
h
):
ALPHA Y +
0.05
(
ALPHA X
2x + ALPHA Y 2y + ALPHA A
2x +
(
ALPHA Y +
0.1
(
ALPHA X
2x + ALPHA Y 2y ) )
2x ) SHIFT
STO Y
(Trong công thức này ta đã sử dụng ô
X
để lưu
nx
, ô
Y
để lưu
ny
và
A
cho
1nx
).
Bấm phím
CALC
(calculate- hãy tính) để tính giá trị của
ny
.
Máy hỏi: X?
Khai báo
0 0x
: Bấm phím 0
=
Máy hỏi: Y?
Khai báo
0 0y
: Bấm phím 0
=
Máy hỏi: A?
Khai báo
1 01x ,
: Bấm phím 0.1
=
Kết quả trên màn hình: 1
2000
, tức là
2 2 2 2 2 2
1 0 0 0 1 0 0 0
2 2 2 2 2 2
0,05( ( 0,1( )) )
0 0,05(0 0 0,1 (0 0,1(0 0 ) ) 0,0005.
y y x y x y x y.
Đưa kết quả
1 0,0005y
vào ô nhớ
Y
:
SHIFT STO Y
75
Trở về công thức (3.2): Bấm phím
Tính tiếp:
CALC
Máy hỏi: X?
Khai báo
1 01x ,
: Bấm phím 0.1
=
Máy hỏi: Y? Bấm phím
=
(vì
1 0,0005y
đã ở trong ô nhớ
Y
nên không cần
khai báo lại).
Máy hỏi: A?
Bấm phím 0.2
=
Lặp lại quy trình với thay đổi là khi máy hỏi X? (A?) thì khai báo các giá trị tiếp
theo: 0.1 (0.2); 0.2 (0.3); 0.3 (0.4); 0.4 (0.5);...; 0.9 (1.0) ta sẽ được bảng giá trị
dưới đây (trùng với kết quả tính trên Maple đến chữ số cuối cùng).
n
1nx
ny
n
1nx
ny
1 0
1
2000
6 0,5 0.07344210065
2 0,1
33 000125004 10.
7 0,6 0.116816584
3 0,2
39 503025759 10.
8 0,7 0.1753963673
4 0,3
0 02202467595.
9 0,8 0.2523742135
5 0,4
0 04262140863.
10 0,9 0.3518301325
Tính toán trên Maple:
Khởi động chương trình:
[> restart;
Khai báo vế phải của phương trình (hàm
f
):
[> f:=(x,y)->x^2+y^2;
:= f ( ),x y x2 y2
Khai báo bước nội suy h=0.1:
[> h:=0.1;
:= h .1
Khai báo công thức tính
0nx x nh
:
76
[> x:=n->n*h;
:= x n n h
Khai báo thủ tục tính giá trị
ny
theo công thức Euler cải tiến:
[> y:=proc(n) option remember;
[> y(n-1)+h/2*(f(x(n-1),y(n-1))+ f(x(n),y(n-1)+h*f(x(n-1),y(n-1))));
[> end;
y nproc ( ) :=
option ;remember
( )y n 1
/1 2 h ( )( )f ,( )x n 1 ( )y n 1 ( )f ,( )x n ( )y n 1 h ( )f ,( )x n 1 ( )y n 1
end proc
Khai báo giá trị ban đầu:
[> y(0):=0;
:= ( )y 0 0
Lập dãy các giá trị của y từ 0 tới 10:
[> seq(y(i),i=0..10);
0 .0005000000000.003000125004.009503025759.02202467594.04262140863, , , , , ,
. 734421 65.1168165840.1753963673.252374 13 .35183 1325, , , ,
Vào gói công cụ Phương trình vi phân DEtools:
[> with(DEtools):
Tìm nghiệm đúng của phương trình vi phân nhờ lệnh dsolve:
[> Sol:=dsolve({diff(Z(X),X)=X^2+(Z(X))^2,Z(0)=0},Z(X));
:= Sol ( )Z X
X
BesselJ ,
-3
4
1
2
X2
BesselY ,
-3
4
1
2
X2
BesselJ ,
1
4
1
2
X2
BesselY ,
1
4
1
2
X2
Ấn định công thức nghiệm:
[> assign(Sol);
Lập mảng để so sánh giá trị gần đúng (tính theo công thức Euler) và giá trị đúng của
phương trình (tính theo công thức nghiệm):
[> array([seq([n,y(n),evalf(subs(X=n/10,Z(X)))],n=0..10]);
77
0 0 0.
1 .0005000000000 .0003333349060
2 .003000125004 .002666869814
3 .009503025759 .009003473190
4 .02202467594 .02135938017
5 .04262140863 .04179114620
6 .07344210065 .07244786118
7 .1168165840 .1156598536
8 .1753963673 .1740802646
9 .2523742134 .2509066824
10 .3518301325 .3502318440
Kết quả tính toán trên Casio fx-570 ES hoàn toàn trùng khớp với kết quả tính toán
trên Maple. Hơn nữa, chỉ cần với h=0.1, phương pháp Euler cải tiến đã cho kết quả
tốt hơn phương pháp Euler với h=0.05.
Tương tự, ta cũng đi tính xấp xỉ nghiệm nhờ phương pháp Euler cải tiến trên Maple
khi h=0,05 như sau.
Khởi động chương trình:
[> restart;
Khai báo vế phải của phương trình (hàm
f
):
[> f:=(x,y)->x^2+y^2;
:= f ( ),x y x2 y2
Khai báo bước nội suy h=0.05:
[> h:=0.05;
:= h .05
Khai báo công thức tính
0nx x nh
:
[> x:=n->n*h;
:= x n n h
Khai báo thủ tục tính giá trị
ny
theo công thức Euler cải tiến:
[> y:=proc(n) option remember;
[> y(n-1)+h/2*(f(x(n-1),y(n-1))+ f(x(n),y(n-1)+h*f(x(n-1),y(n-1))));
[> end;
78
y nproc ( ) :=
option ;remember
( )y n 1
/1 2 h ( )( )f ,( )x n 1 ( )y n 1 ( )f ,( )x n ( )y n 1 h ( )f ,( )x n 1 ( )y n 1
end proc
Khai báo giá trị ban đầu:
[> y(0):=0;
:= ( )y 0 0
Lập dãy các giá trị của y từ 0 tới 20:
[> seq(y(i),i=0..20);
0 .00006250000000.0003750009768.001187523634.002750192592.005313445880, , , , , ,
.009128432478.01444766188.02152597185.03062188483.04199943062, , , , ,
.05593052466.07269800874.09259948706.1159521276 .1430986522, , , , ,
.1744148130 .2103187590 .2512828469 .2978486637 .3506463408, , , ,
Vào gói công cụ Phương trình vi phân DEtools:
[> with(DEtools):
Tìm nghiệm đúng của phương trình vi phân nhờ lệnh dsolve:
[> Sol:=dsolve({diff(Z(X),X)=X^2+(Z(X))^2,Z(0)=0},Z(X));
:= Sol ( )Z X
X
BesselJ ,
-3
4
1
2
X2
BesselY ,
-3
4
1
2
X2
BesselJ ,
1
4
1
2
X2
BesselY ,
1
4
1
2
X2
Ấn định công thức nghiệm:
[> assign(Sol);
Lập mảng để so sánh giá trị gần đúng (tính theo công thức Euler) và giá trị đúng của
phương trình (tính theo công thức nghiệm):
[> array([seq([n,y(n),evalf(subs(X=n/10,Z(X)))],n=0..20]);
79
0 0 0.
1 .00006250000000 .00004166662214
2 .0003750009768 .0003333349060
3 .001187523634 .001125027190
4 .002750192592 .002666869814
5 .005313445880 .005209302335
6 .009128432478 .009003473190
7 .01444766188 .01430188852
8 .02152597185 .02135938017
9 .03062188483 .03043446027
10 .04199943062 .04179114620
11 .05593052466 .05570133762
12 .07269800874 .07244786118
13 .09259948706 .09232831036
14 .1159521276 .1156598536
15 .1430986522 .1427852338
16 .1744148130 .1740802646
17 .2103187590 .2099632190
18 .2512828469 .2509066824
19 .2978486637 .2974526313
20 .3506463408 .3502318440
Kết quả tính toán trên Casio fx-570 ES hoàn toàn trùng khớp với kết quả tính toán
trên Maple. Với cùng số bước lặp (n=20, h=0.05), phương pháp Euler cải tiến cho
kết quả tốt hơn phương pháp Euler rất nhiều.
Phƣơng pháp Runge-Kutta cấp bốn
Ta có
2 2
0 0( , ) , 0, 0,f x y x y x y
áp dụng công thức (3.3)-(3.4) ta được:
1
2 2
1
2 21 1
2
2 22 2
3
2 2
4 1 3 3
( , )
0.1 0.1
( , ) ( ) ( )
2 2 2 2
0.1 0.1
( , ) ( ) ( )
2 2 2 2
( , ) ( 0.1 )
n
n
n n n
n n n n
n n n n
n n n
k f x y x y
h hk k
k f x y x y
h hk k
k f x y x y
k f x y hk x y k
và
1 1 2 3 4 1 2 3 4
0.1
[ 2 2 ] [ 2 2 ]
6 6
n n n
h
y y k k k k y k k k k
Khởi động chương trình:
80
[> restart;
Định nghĩa yrk ( tính y theo Runge-Kutta):
> yrk:='yrk';
:= yrk yrk
Khai báo vế phải của phương trình (hàm
f
):
[> f:=(x,y)->x^2+y^2;
:= f ( ),x y x2 y2
Khai báo bước nội suy h=0.1:
[> h:=0.1;
:= h .1
Khai báo công thức tính
0nx x nh
:
[> x:=n->n*h;
:= x n n h
Khai báo thủ tục tính giá trị
ny
theo công thức Runge-Kutta cấp bốn:
> yrk:=proc(n)
> local k1,k2,k3,k4;
> option remember;
> k1:=f(x(n-1),yrk(n-1));
> k2:=f(x(n-1)+h/2,yrk(n-1)+h*k1/2);
> k3:=f(x(n-1)+h/2,yrk(n-1)+h*k2/2);
> k4:=f(x(n),yrk(n-1)+h*k3);
> yrk(n-1)+h/6*(k1+2*k2+2*k3+k4)
> end;
yrk nproc ( ) :=
local ;, , ,k1 k2 k3 k4
option ;remember
:= k1 ( )f ,( )x n 1 ( )yrk n 1 ;
:= k2 ( )f ,( )x n 1 /1 2 h ( )yrk n 1 /1 2 h k1 ;
:= k3 ( )f ,( )x n 1 /1 2 h ( )yrk n 1 /1 2 h k2 ;
:= k4 ( )f ,( )x n ( )yrk n 1 h k3 ;
( )yrk n 1 /1 6 h ( ) k1 2 k2 2 k3 k4
end proc
Khai báo giá trị ban đầu:
[> y(0):=0;
:= ( )y 0 0
Lập dãy các giá trị của y từ 0 tới 10:
[> seq(yrk(i),i=0..10);
81
0 .0003333348958.002666875369.009003498131.02135944733.04179128848, , , , , ,
. 724481248 .1156603048.1740810040.2509 78684.3502337417, , , ,
Vào gói công cụ Phương trình vi phân DEtools:
[> with(DEtools):
Tìm nghiệm đúng của phương trình vi phân nhờ lệnh dsolve:
[> Sol:=dsolve({diff(Z(X),X)=X^2+(Z(X))^2,Z(0)=0},Z(X));
:= Sol ( )Z X
X
BesselJ ,
-3
4
1
2
X2
BesselY ,
-3
4
1
2
X2
BesselJ ,
1
4
1
2
X2
BesselY ,
1
4
1
2
X2
Ấn định công thức nghiệm:
[> assign(Sol);
Lập mảng để so sánh giá trị gần đúng (tính theo công thức Runge-Kutta) và giá trị
đúng của phương trình (tính theo công thức nghiệm):
[> array([seq([n,yrk(n),evalf(subs(X=n/10,Y(X)))],n=0..10)]);
0 0 .
1 .0003333348958 .0003333349060
2 .002666875369 .002666869814
3 .009003498131 .009003473190
4 .02135944733 .02135938017
5 .04179128848 .04179114620
6 .07244812485 .07244786118
7 .1156603048 .1156598536
8 .1740810040 .1740802646
9 .2509078684 .2509066824
10 .3502337417 .3502318440
So sánh các kết quả của phương pháp Runge-Kutta cấp 4 trong bảng trên với kết
quả đã thực hiện theo phương pháp Euler và phương pháp Euler cải tiến, ta thấy
rằng phương pháp này cho kết quả chính xác hơn tại mỗi điểm so với phương pháp
Euler và phương pháp Euler cải tiến. Với số bước ít (n=10, h=0.1) ta đã thu được
kết quả tốt hơn phương pháp Euler cải tiến với số bước gấp đôi (n=20, h=0.05).
Hoàn toàn tương tự (với thay đổi duy nhất trong chương trình là khai báo lại bước
nội suy h=0.05), ta có thể tính theo phương pháp Runge-Kutta với số bước n=20
(h=0.05) như sau.
Khởi động chương trình:
82
[> restart;
Định nghĩa yrk ( tính y theo Runge-Kutta):
[> yrk:='yrk';
:= yrk yrk
Khai báo vế phải của phương trình (hàm
f
):
[> f:=(x,y)->x^2+y^2;
:= f ( ),x y x2 y2
Khai báo bước nội suy h=0.1:
[> h:=0.05;
:= h .05
Khai báo công thức tính
0nx x nh
:
[> x:=n->n*h;
:= x n n h
Khai báo thủ tục tính giá trị
ny
theo công thức Runge-Kutta bậc bốn:
[> yrk:=proc(n)
[>local k1,k2,k3,k4;
[> option remember;
[> k1:=f(x(n-1),yrk(n-1));
[> k2:=f(x(n-1)+h/2,yrk(n-1)+h*k1/2);
[> k3:=f(x(n-1)+h/2,yrk(n-1)+h*k2/2);
[> k4:=f(x(n),yrk(n-1)+h*k3);
[> yrk(n-1)+h/6*(k1+2*k2+2*k3+k4)
[> end;
yrk nproc ( ) :=
local ;, , ,k1 k2 k3 k4
option ;remember
:= k1 ( )f ,( )x n 1 ( )yrk n 1 ;
:= k2 ( )f ,( )x n 1 /1 2 h ( )yrk n 1 /1 2 h k1 ;
:= k3 ( )f ,( )x n 1 /1 2 h ( )yrk n 1 /1 2 h k2 ;
:= k4 ( )f ,( )x n ( )yrk n 1 h k3 ;
( )yrk n 1 /1 6 h ( ) k1 2 k2 2 k3 k4
end proc
Khai báo giá trị ban đầu:
[> y(0):=0;
:= ( )y 0 0
Lập dãy các giá trị của y từ 0 tới 20:
> seq(yrk(i),i=0..20);
83
0 .00004166667887.0003333349637.001125027316.002666870382.005209303462, , , , , ,
.009003475092.01430189176.02135938501.03043446755.04179115619, , , , ,
.05570135121.07244787939.09232833422.1156598841 .1427852732, , , , ,
.1740803146 .2099632826 .2509067623 .2974527325 .3502319724, , , ,
Vào gói công cụ Phương trình vi phân DEtools:
[> with(DEtools):
Tìm nghiệm đúng của phương trình vi phân nhờ lệnh dsolve:
[> Sol:=dsolve({diff(Z(X),X)=X^2+(Z(X))^2,Z(0)=0},Z(X));
:= Sol ( )Z X
X
BesselJ ,
-3
4
1
2
X2
BesselY ,
-3
4
1
2
X2
BesselJ ,
1
4
1
2
X2
BesselY ,
1
4
1
2
X2
Ấn định công thức nghiệm:
[> assign(Sol);
Lập mảng để so sánh giá trị gần đúng (tính theo công thức Runge-Kutta) và giá trị
đúng của phương trình (tính theo công thức nghiệm):
> array([seq([n,yrk(n),evalf(subs(X=n/20,Y(X)))],n=0..20)]);
84
0 0 0.
1 .00004166667887 .00004166662214
2 .0003333349637 .0003333349060
3 .001125027316 .001125027190
4 .002666870382 .002666869814
5 .005209303462 .005209302335
6 .009003475092 .009003473190
7 .01430189176 .01430188852
8 .02135938501 .02135938017
9 .03043446755 .03043446027
10 .04179115619 .04179114620
11 .05570135121 .05570133762
12 .07244787939 .07244786118
13 .09232833422 .09232831036
14 .1156598841 .1156598536
15 .1427852732 .1427852338
16 .1740803146 .1740802646
17 .2099632826 .2099632190
18 .2509067623 .2509066824
19 .2974527325 .2974526313
20 .3502319724 .3502318440
Các kết quả của phương pháp Runge-Kutta cấp 4 là tốt hơn rất nhiều so với kết
quả đã thực hiện theo phương pháp Euler và phương pháp Euler cải tiến với cùng số
bước (n=20, h=0.05) và tốt hơn phương pháp Runge-Kutta với số bước ít hơn
(n=10, h=0.1).
85
KẾT LUẬN
Luận văn trình bày ngắn gọn các phương pháp số giải phương trình phi tuyến
và phương pháp Euler, phương pháp Euler cải tiến và phương pháp Runge-Kutta
giải bài toán giá trị ban đầu của phương trình vi phân. Đặc biệt, qua một số bài toán
cụ thể, luận văn trình bày chi tiết các thao tác thực hiện qui trình tính toán trên máy
tính điện tử khoa học Casio fx-570 ES và trên chương trình Maple giải một số
phương trình phi tuyến và phương trình vi phân thường. Các thao tác này có thể
được coi là các chương trình mẫu để giải các bài toán khác (chỉ cần khai báo lại
phương trình cần giải).
Tính toán theo các phương pháp khác nhau và các công cụ khác nhau cho
phép chúng ta hình dung rõ hơn các kết quả lí thuyết (sự hội tụ, độ chính xác, tốc độ
hội tụ,…), đồng thời cũng cho chúng ta thấy rõ hơn các điểm mạnh điểm yếu của
mỗi phương pháp khi thực hiện cụ thê trên máy tính.
Chúng ta cũng nhận thấy rằng, việc thực hành tính toán giải phương trình phi
tuyến và phương trình vi phân trên máy tính, thậm chí trên máy tính điện tử khoa
học (giá rẻ, thao tác đơn giản), rất dễ dàng, hoàn toàn có thể thực hiện được trên các
giờ bài tập hoặc thực hành trên lớp, thậm chí cho học sinh phổ thông (giải gần đúng
phương trình). Điều này cho phép có thể thay đổi hoặc bổ sung chương trình dạy và
học toán trong trường phổ thông và đại học hiện nay theo hướng phát huy tính tích
cực của học sinh, sinh viên và gắn các kiến thức lí thuyết với thực hành tính toán
trên máy cũng như gắn các kiến thức cơ bản với sự phát triển của công nghệ hiện
đại. Hy vọng rằng, các chương trình mẫu trong luận văn có thể được sử dụng trong
các môn Phương pháp số giải phương trình phi tuyến và phương trình vi phân.
86
TÀI LIỆU TRÍCH DẪN
1. Phạm Kỳ Anh: Giải tích số. Nhà xuất bản Đại học Quốc gia Hà Nội, Hà Nội,
2001.
2. Nguyễn Minh Chương (Chủ biên), Nguyễn Văn Khải, Khuất Văn Ninh, Nguyễn
Văn Tuấn, Nguyễn Tường: Giải tích số, Nhà xuất bản Giáo dục, Hà Nội, 2001.
3. Tạ Văn Đĩnh: Phương pháp tính. Nhà xuất bản Giáo dục, Hà Nội, 1999.
4. Doãn Tam Hòe: Toán học tính toán. Nhà xuất bản Giáo dục, Hà Nội, 2005.
5. Stoer, R. Bulirsch: Introduction to numerical Analysis, Springer, 2002, (Third
Edition).
6. Tạ Duy Phượng: Giải tích số trên máy tính điện tử. Bản thảo Bài giảng Cao học.
7. Tạ Duy Phượng: Phương pháp số giải phương trình vi phân thường. Bản thảo
Bài giảng Cao học.
8. Vũ Tuấn, Đoàn Văn Ngọc: Phương trình vi phân, Nhà xuất bản Giáo dục, 1996.
Các file đính kèm theo tài liệu này:
- giai_phuong_trinh_gan_dung_3062.pdf