Chương 6: Gii gn đúng các phương trình vi phân
CHƯƠNG 6
GII GN ĐÚNG PHƯƠNG TRÌNH VI PHÂN
MC ĐÍCH, YÊU CU
Sau khi hc xong chương 3, yêu cu sinh viên:
1. Hiu được vai trò và tm quan trng ca bài toán gii gn đúng phương trình vi phân.
2. Nm được các phương pháp tìm nghim gn đúng ca phương trình vi phân.
3. Biết cách áp dng các phương pháp trên vào vic gii quyết các bài toán thc tế.
4. Biết cách đánh giá sai s ca tng phương pháp.
6.1. M ĐẦU
Nhiu bài toán khoa hc k thut dn v vic tìm nghim phương trình vi phân tha mãn
mt s điu kin nào đó. Nhng phương trình vi phân mô t nhng h cơ hc, lý hc, hóa hc,
sinh hc nói chung rt phc tp, không hy vng tìm li gii đúng.
Trong chương này ta nghiên cu bài toán đơn gin nht ca phương trình vi phân là bài
toán Cauchy đối vi phương trình vi phân cp 1 như sau:
Hãy tìm hàm y=y(x) tha mãn:
y'(x) = f(x,y) x [a,b], x0 = a (6.1)
y(x0) =y0 (6.1b)
Điu kin (6.1b) được gi là điu kin ban đầu hay điu kin Cauchy.
Tương t, bài toán Cauchy đối vi phương trình vi phân cp n được mô t như sau:
Hãy tìm hàm y=y(x) tha mãn:
y
(n) = f(x,y,y',y(2),...,y(n-1)) (6.2)
y(x0) =α0, y'(x0) =α1, y(2)(x0) = α2, ..., y(n-1)(x0)=αn-1
trong đó f() là mt hàm đã biết ca n+1 đối s x,y,y',y(2),...,y(n-1); x0, b, α0, α1 ..., αn-1
nhng s cho trưc.
(6.1) còn được m rng cho h thng các phương trình vi phân cp mt vi bài toán Cauchy
chư sau:
y
1' = f1(x,y1, y2,..., yn)
y
2' = f2(x,y1, y2,..., yn)
. . . (6.3)
y
n' = fn(x,y1, y2,..., yn)
99
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Chương 6: Gii gn đúng các phương trình vi phân
y
1(x0) =α1, y2(x0) = α2, . . ., yn(x0)=αn
x [a,b], x0 = a
Nếu đặt
α = [α1, α2,..., αn]T
y = [y1, y2,..., yn]T
y = [y'1, y'2,..., y'n]T
f = [f1, f2,..., fn]T
Bài toán (6.3) có th viết gn hơn dưới dng vectơ như sau:
y = f (x, y), x [a,b], x0 = a
y (x0) = α
Ghi chú. Phương trình vi phân cp n có th đưa v h các phương trình vi phân cp mt
bng phép biến đổi
y1 =y, y2 =y' ,. . ., yi =y(i-1 ,. . ., yn = y(n-1)
Nói chung có hai nhóm phương pháp để gii các phương trình vi phân thường:
Phương pháp tìm nghim chính xác: bng cách da vào cách tính tích phân trc tiếp, xác định
được dng tng quát ca nghim ri da vào điu kin ban đầu để xác định nghim riêng cn tìm.
Phương pháp tìm nghim gn đúng xut phát t điu kin ban đầu. Phương pháp này có th
áp dng cho mt lp phương trình vi phân rng hơn rt nhiu so vi phương pháp trc tiếp, do đó
được dùng nhiu trong thc tế.
Trong phn tiếp theo ta s tp trung vào nhóm phương pháp th hai.
6.2. PHƯƠNG PHÁP EULER
Tr li bài toán
y'(x) = f(x,y) x [a,b], x0 = a (6.4)
y(x0) =y0
Cách gii gn đúng (6.4) là tìm các giá tr gn đúng yi ca giá tr đúng y(xi) ti các đim
xi, i = 0,1,2,... n, trong đó
a = x0 < x1 < . . . < xn = b
x
i = x0 + ih, i=0,1,...,n-1
h = n
ab
Ta đã biết y0 =α0, ta s ln lượt xác định y1 ti x1, ri y2 ti x2, và nói chung t giá tr gn
đúng yi ti xi ta s tính yi+1 ti xi+1.
Phương pháp Euler cũng như mt vài phương pháp s được trình bày s da vào gi thiết
sau đây (cho dù gi thiết này nói chung không th kim tra được)
Gi thiết rng bài toán (6.4) có nghim duy nht y = y(x), x [a,b], a = x0, và nghim y(x)
đủ trơn, nghĩa là nó có đạo hàm đến cp đủ cao. (6.5)
100
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Chương 6: Gii gn đúng các phương trình vi phân
Ta khai trin Taylo nghim y(x) ca (6.4) ti xi
y(x) = y(xi) + !1
i
xx y'(xi) + !2
)( 2
i
xx y''(ci) , ci (xi,x) (6.5)
Thay x = xi+1 = xi + h, y'(xi) = f(xi,y(xi)) vào đẳng thc trên ta có
y(xi+1) = y(xi) + h f(xi,y(xi)) + 2
2
hy''(ci), ci (xi,xi+1) (6.6)
B qua s hng cui cùng bên phi, đồng thi thay các giá tr đúng y(xi+1), y(xi),
f(x,y(xi)) bng các giá tr xp x yi+1, yi, f(x,yi) vào (6.6) ta có
yi+1 = yi + h f(xi,yi) (6.7)
Vi giá tr y0 = y(x0) = α0 ban đầu (như vy y0 là giá tr đúng ca y(x0)), ta có th tính tiếp
các giá tr yi , i =1,2, ..., n.
Công thc (6.7) được gi là công thc Euler. Công thc này cho ta cách tính yi+1 khi đã biết
yi mà không phi gii mt phương trình nào. Vì vy phương pháp Euler là mt phương pháp hin.
Sai s địa phương ca phương pháp Euler là
Ri(h) = y(xi)- yi = !2
2
hy''(ci-1) = O(h2) (6.8)
Người ta chng minh được rng: sai s ca phương pháp Euler ti đim xi
| yi - y(xi) | Mh (6.9)
trong đó M là hng s không ph thuc h.
Điu này chng t rng khi h 0 thì yi y(xi) ti mi đim xi c định. Tuy nhiên vic
xác định giá tr M rt phc tp. Vì vy trong thc hành người ta thường làm như sau: Quá trình
tính được chia làm nhiu bước, khong cách gia các đim xi và xi+1 bước sau s là mt na
khong cách ca bước trước, tc là hk+1 =hk/2 . Nếu gi ln đầu tiên vi h= n
ab ta gi là ln
th 0 vi n+1 đim chia thì ti ln th k+1 s có n.2k+1 +1 đim chia. Trong s đim chia này thì
có n.2k +1 đim chia trùng vi ln th k. Các đim trùng đó là 0,2,4,..., n.2k+1. Ti các đim chia
này ta có ln th k giá tr xp x ca yi là yi(k), còn ln th k+1 thì giá tr xp x giá tr y ti
v trí này li là y2i(k+1). Ta xét đại lượng sau
maxdiff = | y
i
max 2i (k+1) - y i (k) |, i=0,1,2,...,n.2k
Và s dng quá trình tính toán nếu maxdiff nh hơn giá tr ε khá nh cho trước.
Ta có th mô t thut toán Euler để cài đặt trên máy tính theo các bước sau:
a.Thut toán cho mt ln chia khong duy nht.
Nhp a, b , y0 và n.
Đặt h = n
ab , x0 = a.
Vi i =1,2,..., n tính
101
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Chương 6: Gii gn đúng các phương trình vi phân
y
i = yi-1 + hf(xi-1,yi-1)
x
i = xi-1 + h
b.Thut toán cho nhiu ln chia khong.
- Bước 0: Nhp a, b , y0 , kmax và ε>0.
Đặt h0 = n
ab , = a , = y
)0(
0
x)0(
0
y0
Tính = + hf( ,), = + h
)0(
i
y)0(
1i
y)0(
1i
x)0(
1i
y)0(
i
x)0(
1i
x0 , i = 1,2,...,n
- Bước 1:
Đặt h1 = 2
0
h , = a , = y
)1(
0
x)1(
0
y0
Tính = + hf( ,), = + h
)1(
i
y)1(
1i
y)1(
1i
x)1(
1i
y)1(
i
x)1(
1i
x1 , i = 1,2,...,n.2
d1 = | y
i
max 2i (1) - y i (0) |, i=0,1,2,...,n
Nếu d1 <ε thì dng thut toán và ly mu (x0,y0), (x1,y1), ..., (x2n,y2n) làm nghim
xp x.
Nếu 2 điu trên đây không xy ra thì chuyn qua bước (3).
...
- Bước k:
Đặt hk = 2
1k
h , = a , = y
)(
0
k
x)(
0
k
y0
Tính = + hf( ,), = + h
)(k
i
y)(
1
k
i
y)(
1
k
i
x)(
1
k
i
y)(k
i
x)(
1
k
i
xk , i = 1,2,...,n.2k
dk = | y
i
max 2i (k) - y i (k-1) |, i=0,1,2,...,n.2k-1
Nếu dk <ε thì dng thut toán và ly mu (x0,y0), (x1,y1), ..., (xN,yN), trong đó N = n.2k
làm nghim xp x.
Nếu k kmax thì thông báo phép lp chưa hi t và cũng dng thut toán.
Nếu 2 điu trên đây không xy ra thì chuyn qua bước (k+1).
c.Chương trình cài đặt thut toán Euler:
//EULER.CPP
/*Phuong phap Euler giai gan dung phuong trinh vi phan y'=f(x,y)*/
#include "zheader.cpp"
#define kmax 17
const double epsi=1.0E-02;
double g(double,double);//a=0,b=1
double yg(double);//La nghiem dung y=y(x) cua phuong trinh y'=g(x,y)
102
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Chương 6: Gii gn đúng các phương trình vi phân
int euler(double (*f)(double,double),double (*yf)(double));
/*Phuong phap Euler giai phuong trinh vi phan tren [a,b].
y'(x)=f(x,y), y(x0)=y0.
Neu buoc lap vuot qua kmax thi tra ve false
Ham yf la nghiem dung de so sanh*/
//===============================================
double g(double x,double y)
{return x*y/2;
}
//===============================================
double yg(double x)
{return exp(x*x/4);
}
//===============================================
//Ham de tim y(x).
int euler(double (*f)(double,double),double (*yf)(double))
{clrscr();
double a,b,h,maxdiff,x[kmax],y[kmax],y1[kmax];int n,m,i;
cout<<endl<<"Can duoi: ";cin>>a;
cout<<"Can tren: ";cin>>b;
cout<<"Dieu kien ban dau: y(a) = ";cin>>y[0];
n=1;
h=b-a;
x[0]=a;
y[1]=y[0]+h*f(x[0],y[0]);
do
{for(i=0;i<=n;i++) y1[i]=y[i];//Gan y1=y de bat dau tinh y moi
m=n;
n=n*2;
h=h/2;
for(i=0;i<n;i++)
{x[i+1]=x[i]+h;
y[i+1]=y[i]+h*f(x[i],y[i]);
}
maxdiff=0;
103
CuuDuongThanCong.com https://fb.com/tailieudientucntt