ƯƠ

ƯƠ

CH

NG  7: GI

I PH

NG  TRÌNH  VI PHÂN

§1. BÀI TOÁN  CAUCHY

ể ế ạ ng   trình   vi   phân   c p   1   có   th   vi ộ M t   ph

ượ ừ ạ

ả ệ

ấ c  hàm  y  t ỗ ủ ướ ạ ị ầ c giá  tr  ban  đ u  c a y là y

ươ ệ c m t  nghi m  riêng  c a ph (cid:0) ủ ư ầ ạ ả ượ   ả ướ c i   d ng   gi t   d i   đ ố  ạ ồ ủ i  vô  s  đ o  hàm  c a  nó.  T n  t ộ ằ   ộ ụ ng  trình  trên.  M i nghi m  ph  thu c  vào  m t  h ng o ta  nh nậ   ị ầ i giá  tr  đ u  x o t   ng  trình.  Bài toán  Cauchy  (hay  bài toán  có    a, tìm  y(x) tho  mãn i nh  sau:  cho  x sao  cho  b x  (cid:0)

ươ y(cid:0) =f(x,y)  mà  ta  có  th  tìm  đ ể ươ ệ nghi m  tho  mãn  ph ố ỳ s  tu  ý. Khi cho  tr ượ đ ề đi u  ki n  đ u)  tóm  l ề đi u  ki n: (cid:0) (cid:0) (cid:0) ộ ệ ệ )x(y )y,x(f (cid:0) (1) (cid:0) (cid:0) (cid:0)

ấ ế ệ ộ )a(y ườ Ng

ả ằ tho  mãn  đi u  ki n Lipschitz:

2

1

(cid:0) (cid:0) (cid:0) yL y ứ ệ )y,x(f 2

ớ 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 ề )y,x(f 1 ộ ằ v i L là m t h ng  s  d ườ ủ ế ằ ạ (cid:0) y ( đ o hàm  c a f theo  y ) là liên

i ta cũng  ch ng  minh  r ng  n u  f ặ ố ươ ứ ả ụ t c và b  ch n thì f tho  mãn  đi u  ki n Lipschitz.

1

2

1

ệ ị ườ ươ ậ Ng ị ộ ổ ơ ệ i ta đ nh  nghĩa  h  ph ng  trình  b c 1: (cid:0) (cid:0) ề M t cách t ng quát  h n, ng y ,...,

1

2

2

(cid:0) (cid:0) ,..., y y,y,x(f 1 y,y,x(f 2 )y n )y n

(cid:0) (cid:0) (cid:0) (cid:0)

n

(cid:0) (cid:0) )y n

1 ệ )X,x(f

y ả y,y,x(f n 2 Ta ph i tìm  nghi m  y ,..., 1, y2,..., yn sao cho: (cid:0) (cid:0) (cid:0) )x(Y (cid:0) (cid:0) (cid:0) )a(Y (cid:0)

1

1

2

2

v i:ớ (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) y y (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) y y (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) .. f 1 f 2 .. Y F Y .. (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) .. .. .. (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) f n

ụ ệ ậ

ẽ ả ể ậ

ượ ị ầ ộ ế ẽ ệ ớ ị y n ơ ộ   ng  trình  vi phân  có b c cao  h n  (n), nghi m  s   ph  thu c ề   ệ c m t  nghi m  riêng,  ta  ph i  cho  n  đi u o  đã  cho  ta  cho  y(x o),

168

y n ế ươ N u  ph ằ ố ỳ vào  n  h ng  s  tu  ý. Đ  nh n  đ ầ ki n  đ u.  Bài toán  s  có giá  tr  đ u  n u  v i  giá  tr  x y(cid:0) (xo), y(cid:0) (xo),....

ệ ậ ươ ể ư ộ M t ph ng  trình  vi phân  b c n  có th  đ a  v  thành  m t  h  ph ng

ấ ụ ế ươ ộ ề ng  trình  vi phân  c p 2: trình  vi phân  c p 1. Ví d  n u  ta có ph (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) ươ ấ )y,y,x(f y (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) )a(y )a(y, (cid:0)

ượ ươ ấ (cid:0)  ta nh n  đ ậ ệ c h  ph ng  trình  vi phân  c p 1: (cid:0) (cid:0) (cid:0) Khi  đ t u = y và v = y v ặ u (cid:0) (cid:0) (cid:0) v )v,u,x(g (cid:0)

(cid:0) ớ v i đi u  ki n đ u: u(a) =

và v(a) = (cid:0) ươ ả i   ph

ờ ạ ng   trình   vi   phân   đ ượ ạ ầ ề ệ ươ ng   pháp   gi Các   ph ng  này  là các  ph ng  pháp  r i r c: đo n  [a, b] đ ượ   c   trình   bày   trong ạ   c chia thành  n đo n

ươ ỏ ằ ươ ọ ượ ướ ch nh  b ng nhau  đ c g i là các "b c" tích phân  h = ( b ­ a) /  n.

Ả Ế

ƯƠ ươ NG  PHÁP EULER VÀ EULER C I TI N ng  trình  vi phân: Gi (cid:0) (cid:0) (cid:0) §2. PH  s  ta có ph )y,x(f (cid:0) (1) (cid:0) (cid:0) ả ử )x(y )a(y (cid:0)

ở ệ ạ ể   ầ o,x ] thành  n  ph n  b i các đi m

ủ ầ và  c n  tìm  nghi m  c a nó.  Ta chia  đo n  [x chia:

xo < x1 < x2 <...< xn = x

3

i ta có: x(

1i

1i

1i

1i

i

ứ ể ộ Theo công  th c khai tri n Taylor  m t hàm  lân c n x ậ 2 (cid:0) (cid:0) (cid:0) (cid:0) x( )x i )x i (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) x(y ) x( )x(y i )x(y i )x(y i )x(y)x i 2 6

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 ố ạ

ể ỏ ố ạ

ườ ợ ế N u  (x ậ b c cao              y(xi+1) = y(xi) + (xi+1­ xi)y(cid:0) (xi) Tr y

ề ố ng h p  các m c cách đ u:  (xi­1 ­ xi) = h = (x ­ xo)/  n

i+1

i

ậ ượ ứ ơ thì ta nh n  đ y yi+1 = y i + hf(xi, yi) y ả c công th c Euler  đ n  gi n: (2) ả ế ề ặ

x ế ộ ả ế ứ x ướ ả ụ i đ nh  lí Lagrange:

ể ỏ c h càng  nh . ể ế c h t  ta i x ả ử  s  f(x) là hàm liên t c trong [a, b] và kh  vi trong i+1 (cid:0)  (a ,b) đ  choể : (cid:0) ọ ấ V  m t  hình  h c ta th y  (1) cho  k t qu  càng ướ chính  xác n u  b ể  Đ  tăng  đ  chính  xác ta  có th  dùng  công  th c Euler  c i ti n. Tr ắ ạ ị gi nh c l ấ (a,b) thì có ít nh t m t đi m c  )b(f ộ )a(f (cid:0) (cid:0) )c(f (cid:0) ab

i

i

169

Theo đ nh  lí Lagrange  ta có : (cid:0) (cid:0) (cid:0) )x(y i (cid:0) ị )x(y 1i ớ ư ậ Nh  v y v i c ))c(y,c(hf ể (xi, xi+1) ta có th  thay  :

(cid:0) (cid:0) (cid:0) (cid:0) (cid:0) ))c(y,c(f x(f y,

(cid:0))

1i

i

i

1i

)y,x(f i i

ả ế ừ 1 2 ứ T  đó  ta có công  th c Euler  c i ti n :

(cid:0))

1i

i

1i

1i

(cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) y y x(f y, (3) )y,x(f i i h 2 ị

ế t. Do đó  khi đã  bi ế ng  trình  đ i  s  tuy n  tính  (3). Ta th ỉ ầ ướ ủ

)s( 1iy (cid:0)

ượ ng  gi ặ c h t  ch n  x p  x  đ u  tiên  c a phép  l p   ể ươ ế c theo  ph ư i+1 ch a bi ạ ố ọ ấ ng  pháp  Euler  sau  đó  dùng  (3) đ  tính  các ế i ta ph i tìm  y ả t y i+1  ằ   ả ườ i (3) b ng )0( 1iy (cid:0) chính  là  ,

i

(cid:0) (cid:0) (cid:0) y ứ Trong  công  th c này  giá tr  y ươ ả i ph b ng  cách  gi ư ặ cách  l p  nh  sau:  tr giá tr  yị i+1 tính  đ ụ ể c  th  là: )0( y 1i )y,x(hf i i

(cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) y y x(f y,

(cid:0))

)s( 1i

i

1i

)1s( 1i

)s(

)1s(

iy

)y,x(f i i (cid:0) ủ ầ iy đ  g n

ươ ươ ươ ư h 2 ế ả Quá  trình  tính  k t thúc  khi  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   #include   #include  

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];

170

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);

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();

}

o  = 0, y o  = 0,

ươ ề ệ ầ ớ V i ph ng  trình  cho  trong  function  và  đi u  ki n  đ u  x

ể ệ ạ ớ nghi m  trong  đo n  [0, 1] v i 10 đi m  chia là:

ả ế

171

x 0.0 0.1 y(Euler) 0.00 0.00 y(Euler  c i ti n) 0.00 0.01

0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 0.01 0.03 0.06 0.11 0.17 0.25 0.34 0.46 0.59 0.02 0.05 0.09 0.15 0.22 0.31 0.42 0.56 0.71

ƯƠ §3. PH NG  PHÁP RUNGE ­ KUTTA

i c aủ

Xét bài toán  Cauchy  (1). Gi ị ầ c giá  tr  g n  đúng  y

1m

)1m(

)m(

1i

i

i+1). Tr 2 h 2

i

1k

)k(

(cid:0))x(y,xf

i

i

1k

ố ả ử  s  ta  đã  tìm  đ ế ế ướ y(xi) và mu n  tính  y ủ i+1 c a y(x (cid:0) c h t ta vi m (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (11) x(y ) y y )c( )x(yh)x(y i )x(y i )x( i ượ ứ t công  th c Taylor: h !m h !m (cid:0) v i c ớ (cid:0) (cid:0) (cid:0) (xi, xi+1) và: )x(y i (cid:0) (cid:0) (cid:0) y (cid:0) )x( i

(cid:0))x(y,xf i d dx ướ ạ

m

1m

2

)m(

)1m(

i

1i

Ta vi ế ạ t l i (11) d (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (12) (cid:0) y y y )c( y )x(yh i )x(y i )x( i i d ng: h 2

i v.v.

h !m ả ể ế ể (cid:0) i, y(cid:0)

)i( 4

)i( 3

)i( 2

i

ằ h !m ơ ể ặ ng  pháp  Runge­Kutta  b ng  cách đ t: (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) Ta đã  kéo dài  khai  tri n  Taylor  đ  k t qu  chính  xác h n. Đ  tính  y ể ta có th  dùng  ph y y (13) ươ )i( 1 kr 1 kr 4 kr 2 kr 3

1i trong  đó: )i( k 1

)i( 2

i

i

)i( )k 1

i

i

)i( 1

)i( )k 2

)i( 3 .......

(cid:0) (cid:0) )y,x(hf i i (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) k x(hf y,ah (cid:0) (14) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) k x(hf y,bh k (cid:0) (cid:0)

(cid:0) ế , (cid:0) ,...; r 1, r 2,.. sao  cho  v  ph i  c a (13)

ầ ớ ế ả ủ ố ớ ệ ố ộ ể ấ ấ

)i( 1

)i( 2

)i( )k 1

(cid:0) (cid:0) (cid:0) k , (cid:0) ị và  ta  c n xác đ nh  các h  s  a, b,..;  ả ủ 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ó: )y,x(hf i i (cid:0) (15) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) k x(hf (cid:0)

1i

i kr 2

i kr 1

)i( 2

i

(cid:0) (cid:0) (cid:0) (cid:0) y (16) y,ah )i( 1

y và  Ta có:

(cid:0))x(y,xf

y

172

(cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) y(cid:0) (x) = f[x,y(x)] )x(y )x(y,xf x

................

2

ế Do đó  v  ph i c a (12) là:

i

i

(cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (17) )y,x(hf i i )y,x(f x i i )x(y)y,x(f y i ả ủ h 2 ặ ứ (cid:0) (cid:0) (cid:0)

)i( 1

y

x

i

(cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) k k ] M t khác theo  (15) và theo  công  th c Taylor  ta có: yh )y,x(fah i i )y,x(fk i

x2

yi

i

i

i

i

(cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0) (cid:0)

3) ta tìm  đ

)]y,x(fyr 2 ấ (18) ượ c các

i  cho (17) và  (18) khác  nhau  m t  vô cùng  bé c p O(h 2:

)i( 1 )i( 2 ế r(h 1 ờ Bây gi h  s  ch a bi

ệ ố ư ứ ứ ằ )y,x(hf i i )y,x(f[h i i ả ủ Do đó  v  ph i c a (16) là: 2 )y,x(far[h)y,x(f)r 2 i ộ ố ạ t khi cân b ng các s  h ng  ch a h và ch a h

(cid:0) ế r 1 + r 2 = 1 a.r 1 = 1/  2 .r2 = 1 (cid:0) ọ

ế ượ ượ ấ ứ c ch n b t kì. ế   c công  th c Euler. N u = a, r 1 = (2a ­ 1)/  2a, r 2 = 1/  2a   v i a đ 1 = 0 và  r 2 = 1. Lúc này  ta nh n  đ

ớ ậ ượ ứ

ậ ượ ươ ả ế c công  th c Euler  c i ti n. ậ c công  th c Runge  ­ Kutta  b c 4. chúng  ta nh n  đ

ộ ứ ự ế ư ậ Nh  v y:  N u  a = 1 /  2 thì r a=1 thì r 1 = 1 /  2 và r 2 = 1/2.  Lúc này  ta nh n  đ ậ ự c dùng  trong  tính  toán  th c t M t cách  t Công  th c này  hay  đ ứ  :

ng  t ượ k1 = h.f(xi, yi) k2 = h.f(xi+h/  2, yi + k 1/  2) k3 = h.f(xi+h/  2, yi + k 2/  2) k4 = h.f(xi+h, yi + k 3) yi+1 = yi + (k1 + 2k2 + 2k3 + k 4) /  6 ằ ươ ả ứ ậ i ph ng  trình  vi phân  b ng  công  th c Runge  ­ Kutta  b c 4 ng  trình  gi

ươ Ch ư nh  sau:

ươ Ch ng trình 7­2

/ / P h uong  phap  Runge_Kutta; #include   #include   #include   #define  k 10

float f(float x,float y)   {

float a=x+y; return(a);

173

}

void  main()   {

float a,b,k1,k2,k3,k4; int i,n; float x0,y0,h,e; float x[k],y[k];

clrscr(); printf("Phuong  phap  Runge  ­ Kutta \n"); printf("Cho  can duoi  a = "); scanf("%f",&a); printf("Cho  can tren  b = "); scanf("%f",&b); printf("Cho  so kien  y0 = "); scanf("%f",&y[0]); printf("Cho  buoc tinh  h = "); scanf("%f",&h); n=(int)((b­a)/h); printf("          x              y\n"); for (i=0;i<=n+1;i++)   {

x[i]=a+i*h; k1=h*f(x[i],y[i]); k2=h*f((x[i]+h/2),(y[i]+k1/2)); k3=h*f((x[i]+h/2),(y[i]+k2/2)); k4=h*f((x[i]+h),(y[i]+k3)); y[i+1]=y[i]+(k1+2*k2+2*k3+k4)/6; printf("%12.1f%16.4f\n",x[i],y[i]);

} getch();

}

o = 1 là :

ế ả ớ K t qu  tính  toán  v i f = x + y, h = 0.1, a = 0, b =1, y

174

x 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 y 1.0000 1.1103 1.2427 1.3996 1.5834 1.7971 2.0440 2.3273 2.6508

175

0.9 1.0 3.0190 3.4362