360
CHƯƠNG 7: CÁC PHƯƠNG TRÌNH VI PHÂN THƯỜNG
§1.BÀITOÁNCAUCHY
Một phương trình vi phân cấp 1 có thể viết dưới dạng giảiđược
′
=yf(x,y)
màtacóthểtìmđượchàmytừđạohàmcủanó.Tồntạivôsố
nghiệmthoảmãnphươngtrìnhtrên.Mỗinghiệm phụthuộcvàomộthằngsố
tuỳý.Khichotrướcgiátrịbanđầ
ucủaylàyotạigiátrịđầuxotanhậnđược
mộtnghiệmriêngcủaphươngtrình.BàitoánCauchy(haybàitoáncóđiều
kiệnđầu)tóm lạinhưsau:choxsaochob
≥x≥a,tìmy(x)thoảmãnđiều
kiện:
⎩
⎨
⎧
α=
=
′
)a(y
)y,x(
f
)x(y
(1)
Ngườitachứngminhrằngbàitoánnàycómộtnghiệmduynhấtnếuf
thoảmãnđiềukiệnLipschitz:
2121
=
′
)a(Y
)X,x(
f
)x(Y
với:
⎟
⎟
⎟
⎟
⎟
⎟
⎠
⎞
⎜
⎜
⎜
⎜
⎜
⎜
⎝
⎛
′
′
′
=
′
n
f
f
F
⎟
⎟
⎟
⎟
⎟
⎟
⎠
⎞
⎜
⎜
⎜
⎜
⎜
⎜
⎝
⎛
=
n
2
1
yy
⎨
⎧
=
′
=
′
)v,u,x(gv
vu
vớiđiềukiệ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ươngnàylàcácphươngpháprờirạc:đoạn[a,b]đượcchiathànhnđo ạn
nhỏbằngnhauđượcgọilàcácʺbướcʺtíchphânh=(
b‐a)/n.
§2.PHƯƠNGPHÁPEULER
Giảsửtacóphươngtrìnhviphân:
⎩
⎨
⎧
α=
=
′
)a(y
)y,x(
f
)x(y
(1)
2
i1i
ii1ii1i
Nếu(x
i+1‐xi)khábéthìtacóthểbỏquacács ốhạng(xi+1‐xi)
2
vàcácsố
hạngbậccao
y(x
i+1)=y(xi)+(xi+1‐xi)y′(xi)
Trườnghợpcácmốccáchđều:
(x
i‐1‐xi)=h=(x‐xo)/n
thìtanhậnđượccôngthứcEulerđơngiản:
y
i+1=yi+hf(xi,yi) (2)
Vềmặthìnhhọctathấy(1)chokếtquảcàng
chínhxácnếubướchcàngnhỏ.
Taxâydựnghàm
euler()đểthựchiệnthuậttoántrên:
y
x
x
i
xi+1
yi
yi+1
362
dy(1)=y(2)*y(3);
dy(2)=‐y(1)*y(3);
dy(3)=‐0.51*y(1)*y(2);
Đểgiảiphươngtrìnhchobởihàmf1(x,y)tadùngchươngtrình
cteuler.m:
clearall,clc
a=0;
363
b=1;
y=@f1;
ya=[011]ʹ;
m=200;
[x,y]=euler(y,a,b,ya,m)
plot(x,y);
§3.PHƯƠNGPHÁPHEUN
Phương pháp Heun cònđược gọi là phương pháp hình thang hay
phươngpháp.Chophươngtrình:
y’=f(t,y)
Tacó:
+
+
+
=−=
∫
k1
2
Vếphải(RHS)củaphươngtrìnhnàycóy
k+1làgáitrịchưabiếttạithờiđiểmtk.
Đểgiảiquyếtvấnđềnàytathayy
k+1ởRHSbằngcôngthứcxấpxỉ:
+
≅+
k1 k k k
yyhf(t,y)
Nhưvậy:
[]
{
}
++
=+ + +
k1 k k k k1 k k k
h
y y f(t ,y ) f (t ,y hf(t ,y )
2
ĐâychínhlàcôngthứcHeun.
Taxâydựnghàm
heun()đểthựchiệnthuậttoántrên:
function[X,Y]=heun(fxy,xo,xf,yo,n)
%Giaiphuongtrinhyʹ(x)=f(x,y(x))hayy’=f(x)
%dungthuattoanHeunvoinbuoctinh
Đểgiảiphươngtrìnhtadùngchương trình
ctheun.m:
clearall,clc
a=0;
b=1;
y=inline(ʹ2*x+yʹ);
ya=0.5;
n=10;%solantinhchin=10
[x,y]=heun(y,a,b,ya,n)
plot(x,y);
§4.PHƯƠNGPHÁPRUNGE‐KUTTA
365
MặcdùphươngphápHeuntốthơnphươngphápEulernhưngnóvẫn
chưađủđộchínhxácđốivớicácbàitoánthựctế.
XétbàitoánCauchy(1).Giảsửtađãtìmđượcgiátrịgầnđúngy
icủa
y(x
i)vàmuốntínhyi+1củay(xi+1).TrướchếttaviếtcôngthứcTaylor:
)c(y
!m
h
)x(y
!m
h
)x(y
2
h
)x(y,xf
dx
d
)x(y
ii
1k
1k
i
)k(
−
−
=
Taviếtlại(11)dướidạng:
)c(y
!m
h
)x(y
!m
h
)x(y
2
h
)x(yhyy
)1m(
1m
i
)m(
m
i
2
⎪
⎪
⎨
⎧
γ+β++=
α++=
=
)kky,bhx(hfk
)ky,ahx(hfk
)y,x(hfk
)i(
2
)i(
1ii
)i(
3
)i(
1ii
)i(
2
ii
)i(
1
(14)
vàtacầnxácđịnhcáchệsốa,b, ;α,β,γ, ;r
1,r2, saochovếphảicủa(13)
khácvớivếphảicủa(12)mộtvôcùngbécấpcaonhấtcóthểcóđốivớih.
KhidùngcôngthứcRunge‐Kuttabậchaitacó:
]
)x(y,x
f
)x(y,x
f
)x(y
yx
′
+
′
=
′′
Dođóvếphảicủa(12)là:
[]
⋅⋅⋅+
′′
+
′
+ )x(y)y,x(f)y,x(f
2
h
)y,x(hf
iiyiix
2
ii
(17)
Mặtkháctheo(15)vàtheocôngthứcTaylortacó:
′
+=
Dođóvếphảicủa(16)là:
⋅
⋅
⋅
+
′
′
α
+
′
++ )]y,x(
f
yr)y,x(
f
ar[h)y,x(
f
)rr(h
iiyi2iix2
2
ii21
(18)
Bâygiờcho(17)và(18)khácnhaumộtvôcùngbécấpO(h
3
)tatìmđượccác
hệsốchưabiếtkhicânbằngcácsốhạngchứahvàchứah
2
:
ifnargin<4|n<=0
n=100;
end
ifnargin<3
y0=0;
end
y(1,:)=y0(:)ʹ;%
h=(b‐a)/n;
x=a+[0:n]ʹ*h;
ifnargin(f)>1
fork=1:n
367
f1=h*feval(f,x(k),y(k,:));
f1=f1(:)ʹ;
f2=h*feval(f,x(k)+h/2,y(k,:)+f1/2);
f2=f2(:)ʹ;
f3=h*feval(f,x(k)+h/2,y(k,:)+f2/2);
f3=f3(:)ʹ;
f4=h*feval(f,x(k)+h,y(k,:)+
f3);
f4=f4(:)ʹ;
y(k+1,:)=y(k,:)+(f1+2*(f2+f3)+f4)/6;
end
else
fork=1:n
f1=h*feval(f,x(k));
f1=f1(:)ʹ;
f2=h*feval(f,x(k)+h/2);
nghiệm.Vídụnếuđườngcongnghiệmbanđầuthayđổinhanhrồisauđó
gầnnhưkhôngđổithìtaphảidùnghnhỏởđoạnđầu
vàhlớnởđoạnsau.
đâylàchỗmàcácphươngphápthíchnghichiếmưuthế.Chúngđánhgiásai
sốlàmtròntạimỗilầntíchphânvàtựđộnghiệuchỉnhđộlớncủahđểsai
số
nằmtronggiớihạnchophép.
Phương pháp Runge‐Kutta thích nghi còn gọi là phương pháp tích
phânkếthợp.Cáccôngthức nàyđithànhcặp:mộtcôngthứctíchphânbậcm
và
mộtcôngthứctíchphânbậcm+1.Ýtưởnglàdùnghaicôngthứcnàycải
thiệnnghiệmtrongđoạn[x,x+h].Gọikếtquảlày
m(x+h)vàym+1(x+h)tacósai
sốđốivớicôngthứcbậcmlà:
E(h)=y
m+1(x+h)‐ym(x+h)(1)
Chúngtadùngcôngthứckếthợpbậc4và5màđạohàmđượctínhbằng
côngthứcFehlenberg.DovậycôngthứcRunge‐Kuttathíchnghicònđược
gọilàcôngthứcRunge‐Kutta‐Fehlenberg:
=
1
KhF(x,y)
−
=
⎛⎞
=+ +
⎜⎟
∗ ∗ ∗ ∗ ∗ ∗
37
378
2825
27648
2
1
5
1
5
∗ ∗ ∗ ∗
0 0
3
3
10
3
40
9
40
∗ ∗ ∗
250
621
18575
−
70
27
35
27
∗
0
277
14336
6
7
8
1631
55296
175
512
575
13824
44275
110592
253
4096
n
2
i
i1
1
e(h) E ( h)
n
(7)
vớinlàsốphươngtrìnhbậc1.
Việckiểmsoátsaisốđạtđượcbằngcáchthayđổihsaochosai sốtạimỗi
bướctínhậiphỉcỡsaisốmongmuốnε.Saisố
khithựchiênthuậttáonRunge
‐KuttabậcbốnlàO(h
5
)nên:
⎛⎞
≈
⎜⎟
⎝⎠
5
11
22
e(h ) h
e(h ) h
(8)
Giảsửlàtađãtính nghiệmtạibướctínhvớih
1vàcósaisốlàe(h1).Tạibước
tínhvớih
2tamuốncóe(h2)=εthì:
%f(x).
%xo,x1‐doantimnghiem.
%ygiatridau,ndungtimhbandau
370
h=(x1‐xo)/n;
ifsize(y,1)>1;
y=yʹ;%yphailavectohang
end
eTol=1.0e‐9;
n=length(y);
A=[01/53/103/517/8];
B=[00000
1/50000
3/409/40000
3/10‐9/106/500
‐11/545/2‐70/2735/270
1631/55296175/512575/1382444275/110592253/4096];
C=[37/3780250/621125/5940512/1771];
D=[2825/27648018575/4838413525/55296277/143361/4];
%nghiembandau
xsol=zeros(2,1);
ysol=zeros(2,n);
xsol(1)
=xo;
ysol(1,:)=y;
stopper=0;
k=1;
forp=2:5000
%neusaisodatdengiatrichophep,chapnhanketqua
%kiemtrdieukienketthuc
ife<=eTol
y=y+dy;
xo=xo+h;
k=k+1;
xsol(k)=xo;
ysol(k,:)=y;
ifstopper==1;
break
end
end
%tinhlaihtheo(10)
ife~=0;
hnext=0.9*h*(eTol/e)^0.2;
else;
hnext=h;
end
if(h>0)==(xo+hnext>=x1)
hnext=x1‐xo;
stopper=1;
end
h=hnext;
372
end
Đểtìmnghiệmcủaphươngtrìnhviphântadùngchươngtrình
=yf(x,y)
.Sựthayđổiytrênhaiphíađược
xácđịnhbằng:
+
−
′
+− −=
∫
xh
xh
y(x h) y(x h) y (x)dx
vàbằngdiệntíchbêndướiđườngcong.Xấpxỉđiểmgiữacủadiện tíchnàylà
diệntíchcủahìnhchữnhậtcógạchchéo.
Bâygiờtaxétưuđiểmcủaphương
phápđiểmgiữakhitìmnghiệmcủa
phươngtrình
′
=yf(x,y)từx=x
0đếnx=x0+Hvớicôngthứcđiểmgiữa.
Tachia đoạntíchphânthànhnđoạnnhỏcóđộdàimỗiđoạnlà
=hH/n
như
hìnhbênvàtính:
=+
10 0
yyhf
=+
20 1
2.NgoạisuyRichardson:Tacóthểthấysaisốtrong(3)là:
=+++L
246
123
Echchch
ĐểgiảmbớtsaisốtadùngphươngphápngoạisuyRichardson.Cụthểtatính
y(x
o+H)vớimộtgiátrịnàođócủahvàrồilặplạiquátrìnhtínhvớih/2.Gọi
kếtquảlàg(h)vàg(h
1)tacóngoạisuyRichardson:
−
+=
1
o
4g(h ) g(h)
y(x H)
3
Taxâydựnghàm
midpoint()đểkếthợpphươngphápđiểmgiữavàphương
phápngoạisuyRichardson.Đầutiênphươngphápđiểmgiữađượcdùngcho
2tíchphân.Sốbướctính đượctănggấpđôitrongcáclầnlặp
sau,mỗilầnlặp
đềudùngngoạisuyRichardson.Chươngtrìnhdừngkhisaisốnhỏh ơnsaisố
chophép.
functiony=midpoint(f,x,x1,y,tol)
%kiemtrahoitu.
dr=r(1,1:n)‐rold;
e=
sqrt(dot(dr,dr)/n);
ife<tol;y=r(1,1:n);
return;
end
rold=r(1,1:n);
end
error(ʹPhuongphapdiemgiuakhonghoituʹ)
functiony=mid(f,x,xf,y,nsteps)
%Congthucdiemgiua
h=(xf‐x)/nsteps;
y0=y;
ifnargin(f)
>1
y1=y0+h*feval(f,x,y0);
else
y1=y0+h*feval(f,x);
end
fori=1:nsteps‐1
x=x+h;
ifnargin(f)>1
y2=y0+2.0*h*feval(f,x,y1);
else
y2=y0+2.0*h*feval(f,x);
end
y0=y1;
%H=dotangsaumoilantinh
ifsize(y,1)>1
y=yʹ;
end%yphailavectohang
ifnargin<6
tol=1.0e‐8;
end
n=length(y);
xout=zeros(2,1);
yout=zeros(2,n);
xout(1)=x;
yout(1,:)=y;
k=1;
whilex<x1
376
k=k+1;
H=min(H,x1‐x);
y=midpoint(f,x,x+H,y,tol);
x=x+H;
xout(k)=x;
yout(k,:)=y;
end
Đểgiảiphươngtrìnhtadùngchương trình
ctburlischstoer.m:
clearall,clc
a=0;
Ey()hxxh
(m 1)!
Dùngxấpxỉđạohàm:
+
+−
ξ≈
(m) (m)
(m 1)
y(xh)y(x)
y()
h
tacó:
⎡⎤
=+−
⎢⎥
+
⎣⎦
m
(m) (m)
h
Ey(xh)y(x)
(m 1)!
(2)
Taxâydựnghàm
taylor()đểgiảibàitoántrên:
Tadùngchươngtrình
cttaylor.mđểgiảiphươngtrình:
clearall,clc
y=@f5;
a=0;
b=2;
ya=[01];
h=0.2;
[x,y]=taylor(y,a,ya,b,h)
378
plot(x,y);
§8.PHƯƠNGPHÁPDỰĐOÁN‐HIỆUCHỈNH
1.PhươngphápAdam‐Bashfort‐Moulton
:Năm1855,nhàtoánhọcngười
AnhAdamsđềxuấtmộtphươngphápđabướcgiảibàitoánCauchytheoyêu
cầucủaôngBashforth,mộtchuyêngiakỹthuậtpháobinhAnh.Kếtquảcủa
Adams
saunàybịquênlãng.Mãiđếnđầuthếkỷ20,nhàtoánhọcNauykhi
tínhquỹđạocủahạtđiệntíchrờixamặttrờivớivậntốclớnđãphátminhlại
công thức
Adams. Sau này viện sỹ Krylovđã hoàn thi ện phương pháp
Adams. Phương pháp Adams‐Bashfort‐Moulton (ABM) gồm hai bước.
Bướcdầutiênlàxấpxỉf(x,y)bằngmộtđathức(vídụđathứcLagrange)b
ậc4
qua4điểm:
(
)
(
)
(
)
(
)
{
}
−− −− ++k2 k2 k1 k1 k k k1 k1
t,f ,t,f ,t,f,t,f
vànhậngiátrịhiệuchỉnh:
+++
=
k1 k1 k1
ff(t,p)
(
)
−− +
′
=+ =+ − + +
∫
h
kk 3 k k2 k1 k k1
0
h
c y l (t)dt y f 5f 19f 9f
24
(1b)
23!
(2b)
vàthaythếcácđạohàmbậc1,2,3bằngcácxấpxỉ
−−−
+
⎛⎞
−+−+
⎜⎟
=+ + + +
⎜⎟
⎜⎟
⎝⎠
L
2
k3 k2 k1 k
3(4)
k1 k k k
13 11
ff3f f
h1
32 6
yyhf hf
2h4
379
−−−
−+ − +
4! h 2 120
(
)
−−−
=+ − + − + + +L
5(4)
kk3k2k1k k
h251
y9f37f59f55fhf
24 720
+
≈+
5(4)
k1 k
251
phf
720
(3a)
−− +
++ +
⎛⎞
−+−+
⎜⎟
=+ − + +
⎜⎟
hf
3! h 12
−− +
++
−+ −+
⎛⎞
−++++
⎜⎟
⎝⎠
LL
45
(4) (4)
k2 k1 k k1
k1 k1
3
h f 3f 3f f 3 h
hf f
4! h 2 120
(
)
−− + +
=+ − + + − +L
5(4)
k k2 k1 k k1 k1
h19
+++ +
=−≈− ≅−
5(4) 5
C,k1 k1 k1 k1
19 19
Eyc hf Kh
720 720
(4b)
DoKchưabiếtnêntaphảitìmnó.Tacó;
++++ + +
−=−≅ ≡ ≡−
5
P,k1 C,k1 k1 k1 P,k1 C,k1
270 270 270
EEcp Kh E E
720 251 19
(5)
Dovậytacócáccôngthứcdùngđểđánhgiásaisố:
()
+++ ++
=−≅ −
P,k1 k1 k1 k1 k1
251
Eyp cp
720
(6a)
()
()
−− ++
⎡
⎤
=+ − + +
⎢
⎥
⎣
⎦
kk k2 k1 k k1k1
h
c y f 5f 19f 9f t ,m
24
(7c)
()
++ ++
=− −
k1 k1 k1 k1
19
yc cp
270
(7d)
Taxâydựnghàm
odeabm()đểthựchiệnthuậttoánnày:
function[t,y]=odeabm(f,to,tf,y0,n)
%PhuongphapAdams‐Bashforth‐Moulton
%degiaiptyʹ(t)=f(t,y(t))hayyʹ(t)=f(t)
if(nargin<5)|(n<0)
c1=y(k,:)+h242*[F(2:4,:);feval(f,t(k+1))ʹ];%Pt.(7c)
end
y(k+1,:)=c1‐KC12*(c1‐p1);%Pt.(7d)
p=p1;
c=c1;%capnhatcacgiatridudoan/hieu
chinh
ifnargin(f)>1
F=[F(2:4,:);feval(f,t(k+1),y(k+1,:))ʹ];
else
F=[F(2:4,:);feval(f,t(k+1))ʹ];
end
end
Đểgiảiphươngtrìnhtadùngchươngtrình
ctodeabm.m:
clearall,clc
a=0;
b=1;
y=@f1;
ya=[011]ʹ;
n=10;
[t,y]=odeabm(y,a,b,ya,n)
plot(t,y)
2. Phương pháp Hamming: Thuật toán Hamming cũng như thuật toán
Adams‐Bashforth‐Moultonnhưngcáccôngthứcdựbáo/hiệuchỉnhlà:
Dựđoán:
c0.1259yy 3hf 2fft,m
(8c)
()
++ + +
=− −
k1 k1 k1 k1
9
yc cp
121
(dd)
Taxâydựnghàm
hamming()đểthựchiệnthuậttoánnày:
function[t,y]=hamming(f,to,tf,y0,n)
382
%PhuongphapHammingdegiaiphuongtrinhyʹ(t)=f(t,y(t))hayyʹ=f(t)
if(nargin<5)|(n<=0)
n=100;
end
h=(tf‐to)/n;
ts=to+3*h;
[t,y]=rungekutta(f,to,ts,y0,3);%KhoiganbangRunge‐Kutta
t=
[t(1:3)ʹt(4):h:tf];
fork=2:4
ifnargin(f)>1
F(k‐1,:)=feval(f,t(k),y(k,:));
else
F(k‐1,:)=feval(f,t(k));
end
Đểgiảiphươngtrìnhtadùngchươngtrình
cthamming.m:
clearall,clc
a=0;
b=1;
y=@f1;
ya=[011]ʹ;
n=10;
tic
[t,y]=hamming(y,a,b,ya,n);
toc
plot(t,y)
§9.PHƯƠNGPHÁPMILNE
Quátrìnhtínhtoánnghiệmđượcthựchiệnquababước:
‐Tínhgầnđúngy
m+1theocôngthức(dựđoán):
()
+− −−
′′ ′
=+ −+
(1)
m1 m3 m2 m1 m
4h
3
(3)
Taxâydựnghàm
milne()đểthựchiệnthuậttoántrên:
function[t,y]=milne(f,to,tf,y0,n)
h=(tf‐to)/n;
y(1,:)=y0ʹ;
ts=to+3*h;
[t,y]=rungekutta(f,to,ts,y0,3);
t=[t(1:3)ʹt(4):h:tf]ʹ;
fori=2:4
384
ifnargin(f)>1
F(i‐1,:)=feval(f,t(i),y(i,:));
else
F(i‐1,:)=feval(f,t(i));
end
end
fori=4:n
p=y(i‐3,:)+(4*h/3)*(2*F(1,:)‐F(2,:)+2*F(3,:));%Pt.(1)
ifnargin(f)>1
F(4,:)=f(t(i+1),
p);%Pt.(2)
else
F(4,:)=f(t(i+1));
end
y(i+1,:)=y(i‐1,:)+(h/3)*(F(2,:)+4*F(3,:)+F(4,:));%Pt.(3)
F(1,:)=F(2,:);