CH NG 7: GI I PH NG TRÌNH VI PHÂNƯƠ ƯƠ
§1. BÀI TOÁN CAUCHY
M t ph ng trình vi phân c p 1 có th vi t d i d ng gi i đc ươ ế ướ ượ
y=f(x,y) mà ta có th tìm đc hàm y t đo hàm c a nó. T n t i vô s ượ
nghi m tho mãn ph ng trình trên. M i nghi m ph thu c vào m t h ng ươ
s tu ý. Khi cho tr c giá tr ban đu c a y là y ướ o t i giá tr đu x o ta nh n
đc m t nghi m riêng c a ph ng trình. Bài toán Cauchy (hay bài toán cóượ ươ
đi u ki n đu) tóm l i nh sau: cho x sao cho b ư x a, tìm y(x) tho mãn
đi u ki n:
)a(y
)y,x(f)x(y
(1)
Ng i ta ch ng minh r ng bài toán này có m t nghi m duy nh t n u fườ ế
tho mãn đi u ki n Lipschitz:
2121 yyL)y,x(f)y,x(f
v i L là m t h ng s d ng. ươ
Ng i ta cũng ch ng minh r ng n u fườ ế y ( đo hàm c a f theo y ) là liên
t c và b ch n thì f tho mãn đi u ki n Lipschitz.
M t cách t ng quát h n, ng i ta đnh nghĩa h ph ng trình b c 1: ơ ườ ươ
)y,...,y,y,x(fy
)y,...,y,y,x(fy
)y,...,y,y,x(fy
n21nn
n2122
n2111
Ta ph i tìm nghi m y 1, y2,..., yn sao cho:
)a(Y
)X,x(f)x(Y
v i:
n
2
1
y
..
..
y
y
Y
n
2
1
f
..
..
f
f
F
n
2
1
y
..
..
y
y
Y
N u ph ng trình vi phân có b c cao h n (n), nghi m s ph thu cế ươ ơ
vào n h ng s tu ý. Đ nh n đc m t nghi m riêng, ta ph i cho n đi u ượ
ki n đu. Bài toán s có giá tr đu n u v i giá tr x ế o đã cho ta cho y(xo),
y(xo), y(xo),....
168
M t ph ng trình vi phân b c n có th đa v thành m t h ph ng ươ ư ươ
trình vi phân c p 1. Ví d n u ta có ph ng trình vi phân c p 2: ế ươ
)a(y,)a(y
)y,y,x(fy
Khi đt u = y và v = y ta nh n đc h ph ng trình vi phân c p 1: ượ ươ
v i đi u ki n đu: u(a) = và v(a) =
Các ph ng pháp gi i ph ng trình vi phân đc trình bày trongươ ươ ượ
ch ng này là các ph ng pháp r i r c: đo n [a, b] đc chia thành n đo nươ ươ ượ
nh b ng nhau đc g i là các "b c" tích phân h = ( b - a) / n. ượ ướ
§2. PH NG PHÁP EULER VÀ EULER C I TI NƯƠ
Gi s ta có ph ng trình vi phân: ươ
)a(y
)y,x(f)x(y
(1)
và c n tìm nghi m c a nó. Ta chia đo n [x o,x ] thành n ph n b i các đi m
chia:
xo < x1 < x2 <...< xn = x
Theo công th c khai tri n Taylor m t hàm lân c n x i ta có:
)x(y
6
)xx(
)x(y
2
)xx(
)x(y)xx()x(y)x(y i
3
i1i
i
2
i1i
ii1ii1i
N u (xếi+1 - xi) khá bé thì ta có th b qua các s h ng (x i+1 - xi)2 và các s h ng
b c cao
y(xi+1) = y(xi) + (xi+1- xi)y(xi)
Tr ng h p các m c cách đu: ườ
(xi-1 - xi) = h = (x - xo)/ n
thì ta nh n đc công th c Euler đn gi n: ượ ơ
yi+1 = yi + hf(xi, yi) (2)
V m t hình h c ta th y (1) cho k t qu càng ế
chính xác n u b c h càng nh .ế ướ
Đ tăng đ chính xác ta có th dùng công th c Euler c i ti n. Tr c h t ta ế ướ ế
nh c l i đnh lí Lagrange: gi s f(x) là hàm liên t c trong [a, b] và kh vi trong
(a,b) thì có ít nh t m t đi m c
(a ,b) đ cho:
ab
)a(f)b(f
)c(f
Theo đnh lí Lagrange ta có :
))c(y,c(hf)x(y)x(y iii1i
Nh v y v i c ư (xi, xi+1) ta có th thay :
169
y
x
xixi+1
yi
yi+1
)y,x(f)y,x(f
2
1
))c(y,c(f 1i1iiiii
T đó ta có công th c Euler c i ti n : ế
)y,x(f)y,x(f
2
h
yy 1i1iiii1i
(3)
Trong công th c này giá tr y i+1 ch a bi t. Do đó khi đã bi t yư ế ế i ta ph i tìm yi+1
b ng cách gi i ph ng trình đi s tuy n tính (3). Ta th ng gi i (3) b ng ươ ế ườ
cách l p nh sau: tr c h t ch n x p x đu tiên c a phép l p ư ướ ế
)0(
1i
y
chính là
giá tr yi+1 tính đc theo ph ng pháp Euler sau đó dùng (3) đ tính các ượ ươ
)s(
1i
y
,
c th là:
)y,x(f)y,x(f
2
h
yy
)y,x(hfyy
)1s(
1i1iiii
)s(
1i
iii
)0(
1i
Quá trình tính k t thúc khi ế
)s(
i
y
đ g n
)1s(
i
y
Ch ng trình gi i ph ng trình vi phân theo ph ng pháp Euler nh sau:ươ ươ ươ ư
Ch ng trình 7-1ươ
/ / p p_Euler;
#include <conio.h>
#include <stdio.h>
#include <math.h>
float f(float x,float y)
{
float a=x+y;
return(a);
}
void main()
{
int i,n;
float a,b,t,z,h,x0,y0,c1,c2;
float x[100],y[100];
clrscr();
printf("Cho can duoi a = ");
scanf("%f",&a);
printf("Cho can tren b = ");
scanf("%f",&b);
printf("Cho so buoc tinh n = ");
scanf("%d",&n);
170
printf("Cho so kien x0 = ");
scanf("%f",&x0);
printf("Cho so kien y0 = ");
scanf("%f",&y0);
printf("\n");
printf("Bang ket qua \n");
printf("\n");
printf("Phuong phap Euler \n");
h=(b-a)/n;
x[1]=x0;
y[1]=y0;
printf(" x y");
printf("\n");
for (i=1;i<=n+1;i++)
{
x[i+1]=x[i]+h;
y[i+1]=y[i]+h*f(x[i],y[i]);
printf("%3.2f%16.3f",x[i],y[i]);
printf("\n");
}
printf("\n");
getch();
printf("Phuong phap Euler cai tien\n");
printf(" x y");
printf("\n");
for (i=1;i<=n+1;i++)
{
x[i+1]=x[i]+h;
c1=h*f(x[i],y[i]);
c2=h*f(x[i]+h,y[i]+c1);
y[i+1]=y[i]+(c1+c2)/2;
printf("%3.2f%15.5f",x[i],y[i]);
printf("\n");
}
getch();
}
V i ph ng trình cho trong function và đi u ki n đu x ươ o = 0, yo = 0,
nghi m trong đo n [0, 1] v i 10 đi m chia là:
x y(Euler) y(Euler c i ti n) ế
0.0 0.00 0.00
0.1 0.00 0.01
171
0.2 0.01 0.02
0.3 0.03 0.05
0.4 0.06 0.09
0.5 0.11 0.15
0.6 0.17 0.22
0.7 0.25 0.31
0.8 0.34 0.42
0.9 0.46 0.56
1.0 0.59 0.71
§3. PH NG PHÁP RUNGE - KUTTAƯƠ
Xét bài toán Cauchy (1). Gi s ta đã tìm đc giá tr g n đúng y ượ i c a
y(xi) và mu n tính yi+1 c a y(xi+1). Tr c h t ta vi t công th c Taylor:ướ ế ế
)c(y
!m
h
)x(y
!m
h
)x(y
2
h
)x(yh)x(y)x(y )1m(
1m
i
)m(
m
i
2
ii1i
(11)
v i c (xi, xi+1) và:
)x(y,xf)x(y
iii
)x(y,xf
dx
d
)x(y ii
1k
1k
i
)k(
Ta vi t l i (11) d i d ng:ế ướ
)c(y
!m
h
)x(y
!m
h
)x(y
2
h
)x(yhyy )1m(
1m
i
)m(
m
i
2
ii1i
(12)
Ta đã kéo dài khai tri n Taylor đ k t qu chính xác h n. Đ tính y ế ơ i, yi v.v.
ta có th dùng ph ng pháp Runge-Kutta b ng cách đt: ươ
)i(
44
)i(
33
)i(
22
)i(
11i1i krkrkrkryy
(13)
trong đó:
.......
)kky,bhx(hfk
)ky,ahx(hfk
)y,x(hfk
)i(
2
)i(
1ii
)i(
3
)i(
1ii
)i(
2
ii
)i(
1
(14)
và ta c n xác đnh các h s a, b,..; , , ,...; r1, r2,.. sao cho v ph i c a (13)ế
khác v i v ph i c a (12) m t vô cùng bé c p cao nh t có th có đi v i h. ế
Khi dùng công th c Runge-Kutta b c hai ta có:
)ky,ahx(hfk
)y,x(hfk
)i(
1ii
)i(
2
ii
)i(
1
(15)
và
)i(
22
)i(
11i1i krkryy
(16)
Ta có:
y(x) = f[x,y(x)]
)x(y,xf)x(y,xf)x(y yx
172