y' - x y = y"
on toista kertalukua.
Jos yhtälöt sisältävät vain tuntemattoman funktion y ja sen derivaattojen lineaarikombinaatioita, yhtälöt ovat lineaarisia:
y - 2 y' + y" = 0,
y + x y' = ex.
Muuten yhtälö on epälineaarinen:
y y' = y",
y2 = y'.
Jos tuntemattoman funktion ja sen derivaattojen kertoimina esiintyy vain vakioita, kyseessä on vakiokertoiminen yhtälö.
Analyyttisiä ratkaisumenetelmiä on olemassa ensimmäisen kertaluvun yhtälöille ja korkeamman kertaluvun lineaarisille vakiokertoimisille yhtälöille.
Muunlaisille yhtälöille analyyttinen ratkaisu voi löytyä joissakin erikoistapauksissa.
Vaikka analyyttinen ratkaisu olisi olemassa, se voi olla hyvin mutkikas tai sen johtaminen voi olla vaikeaa.
Numeeriset menetelmät on yleensä helppo yleistää tilanteeseen, jossa on useita ratkaistavia funktioita.
Mikä tahansa kertaluvun n differentiaaliyhtälö voidaan aina korvata n:n ensimmäisen kertaluvun yhtälön ryhmällä ottamalla derivaatat uusiksi tuntemattomiksi funktioiksi.
Esimerkiksi yhtälö
y'' + xy' - y = 0
voidaan kirjoittaa yhtälöpariksi
u = y',
u' + x u - y = 0.
Riittää siis tutkia ensimmäisen kertaluvun yhtälöiden ratkaisemista.
Tällainen yhtälö voidaan kirjoittaa muotoon
y' = f (t, y (t)).
y" - 10 y' - 11 y = 0,
y (0) = 1,
y' (0) = -1
on ratkaisu y (x ) = e-x. Ratkaisu lähenee nollaa, kun x kasvaa rajatta.
Jos alkuarvo on y (0) = 1 + a, yhtälön ratkaisu on
y (x) = ((11 / 12)a + 1) e-x + (a / 12) e11x.
Kun x kasvaa, tämä ratkaisu kasvaa rajatta, olipa a miten pieni tahansa.
Ratkaisu on epästabiili. Ratkaistaanpa yhtälö millä menetelmällä tahansa, pienikin pyöristysvirhe johtaa täysin virheelliseen ratkaisuun.
Varsinkin epälineaarisilla yhtälöillä on epästabiileja ratkaisuja (kaaos).
Olkoot y1 ja y2 kaksi ratkaisua. Ratkaisu on stabiili, jos jokaiselle \epsilon > 0 on olemassa \delta > 0 siten, että
| y1(t ) - y2(t ) | < \epsilon
kaikilla t >= 0 aina, kun
| y1(0) - y2(0) | < \delta.
Pieni alkuarvon häiriö vaikuttaa siis vain vähän ratkaisuun.
Ratkaisu on asymptoottisesti stabiili, jos
| y1(t ) - y2(t ) | -> 0,
kun t läehenee ääretöntä. Alkuarvon pieni häiriö voi aluksi vaikuttaa ratkaisuun, mutta poikkeama vaimenee kauemmas siirryttäessä ja ratkaisut lähestyvät toisiaan.
Stabiilikin yhtälöryhmä voi olla vaikeasti ratkaistava. Jos kertoimet (tarkemmin ottaen kerroinmatriisin ominaisarvojen reaaliosat) ovat hyvin erisuuret, yhtälöryhmää sanotaan kankeaksi (stiff).
Esimerkiksi:
y' = -2000 y + 999.75 u + 1000.25,
u' = y - u,
y (0) = 0, u (0) = -2.
Kerroinmatriisin
A = [ -2000 999.75 ; 1 -1 ]
ominaiasarvot ovat -2000.5 ja -0.5 ja tarkka ratkaisu
y = -1.499875 e-0.5 x +
0.499875 e-2000.5 x + 1,
u = -2.99975 e-0.5 x -
0.00025 e-2000.5 x + 1.
Kummassakin jälkimmäinen termi vaikuttaa vain hyvin pienillä x:n arvoilla. Origon lähellä tarvitaan hyvin lyhyttä askelpituutta, vaikka ensimmäinen termi muuttuu vain hitaasti.
Tarkastellaan aluksi differentiaaliyhtälön ratkaisemista Taylorin sarjan avulla.
Oletetaan, että yhtälö on kirjoitettu muotoon
y' (x ) = f (x, y (x )),
missä y on ratkaistava funktio ja f (x, y (x )) on jokin x:n ja y(x):n lauseke. Ratkaistava funktio y voidaan kirjoittaa Taylorin sarjaksi
y (x ) = y(x0) + y' (x0) (x - x0) + (1/2) y" (x0) (x - x0)2 + ...
Käytetään esimerkkinä yhtälöä
y' (x ) = - 2 x y (x ), y (0)=1.
(Tämän ratkaisu on y (x ) = exp( - x2).)
Koska ratkaistavan funktion arvo tunnetaan pisteessä <x = 0, kehitetään y sarjaksi nollan ympäristössä. Pisteessä x = h funktion arvo on
y (h ) = y (0) + y' (0) h + (1/2) y" (0) h2 + (1/6) y''' (0) h3 + (1/2) y(4) (0) h4 + ...
Annetun alkuarvon perusteella y (0) = 1, ja alkuperäisestä yhtälöstä saadaan y' (0) = -2 x 0 x y (0) = 0. Sarjassa esiintyvät korkeammat derivaatat voidaan laskea derivoimalla alkuperöistä yhtälöä riittävän monta kertaa:
y'' = -2 y - 2 x y' =
-2 y + 4 x2 y,
y''' = -4 y' - 2 xy'' =
12 xy - 8 x3y,
y(4) = -6 y'' - 2 xy''' =
12 y - 48x2y +
16 x3y.
Näiden arvot pisteessä x=0 ovat
y'' (0) = -2
y''' (0) = 0
y(4) (0) = +12
Kun nämä sijoitetaan sarjakehitelmään, saadaan
y (h ) = 1 - h2 + 2 h4 + ...
Kun mukaan otetaan äärellinen määrä alkupään termejä, saadaan polynomi, joka esittää likimääräistä ratkaisua nollan ympäristössä. Polynomin avulla voidaan laskea ratkaistavan funktion arvo pisteessä x = h.
Katkaistun sarjakehitelmän tarkkuus heikkenee, kun h kasvaa, joten se ei yleensä riitä kuvaamaan koko ratkaisua. Samaan tapaan voidaan laskea uusi kehitelmä pisteessä x = h ja sen avulla funktion arvo pisteessä x = 2 h.
Idea: etsitään ratkaistavalle funktiolle jokin laskettavissa oleva approksimaatio ja sen avulla ekstrapoloidaan funktiota pienen matkaa. Toistamalla tätä riittävän monta kertaa voidaan laskea funktion arvot mielivaltaisella välillä.
h on ratkaisumenetelmän askelpituus. Askelpituuden on oltava riittävän pieni, jotta ekstrapoloinnissa ei tehtäisi liian suurta virhettä.
Taylorin sarja käytännöllinen vain, jos derivaatoille saadaan helposti analyyttiset lausekkeet.
Esimerkkitehtävän ratkaisu Taylorin sarjan avulla kahdella eri askelpituudella h = 0.2 ja h = 0.1.
x y y exp(-x^2) 0.00 1.00000 1.00000 1.00000 0.10 0.99050 0.99005 0.20 0.96400 0.96166 0.96079 0.30 0.91512 0.91393 0.40 0.85765 0.85352 0.85214 0.50 0.78022 0.77880 0.60 0.70336 0.69898 0.69768 0.70 0.61369 0.61263 0.80 0.53105 0.52803 0.52729 0.90 0.44524 0.44486 1.00 0.36881 0.36792 0.36788Funktiota approksimoitiin Taylorin sarjalla, josta oli jätetty pois kaikki h5:een ja sitä korkeampiin potensseihin verrannolliset termit. Yhdellä askeleella tehtävä virhe on siis luokkaa h5. Tämä on menetelmän lokaali virhe. Menetelmä on kertalukua 4, mitä merkitään usein O (h4).
Kullakin askelella virhe voi kasvaa luokkaa h5 olevalla määrällä, joten välin päätepisteessä virhettä on kasaantunut 1/h x h5 = h4. Tämä on ratkaisun globaali virhe.
y (x + h ) =
y (x ) + h y' (x ),
y' (x + h ) =
f (x + h, y (x + h ).
... call euler1(0.0, 1.0, 1.0, 0.1) real function f(x, y) real, intent(in) :: x, y f = -x*y end function subroutine euler1 (a, b, y0, h) real, intent(in) :: a, b, y0, h real :: x, y, dy, e x=a y=y0 dy=f(x,y) e=exp(-x**2/2); e=abs((e-y)/e) write(*,'(4F10.6)') x,y,dy,e do while (x < b) x=x+h y=y+h*dy dy=f(x,y) e=exp(-x**2/2); e=abs((e-y)/e) write(*,'(4F10.6)') x,y,dy,e end do end subroutine end program x y f(x,y) y:n suht. virhe 0.000000 1.000000 0.000000 0.000000 0.100000 1.000000 -0.100000 0.005013 0.200000 0.990000 -0.198000 0.009999 ... 0.800000 0.750306 -0.600245 0.033268 0.900000 0.690282 -0.621254 0.034941 1.000000 0.628156 -0.628156 0.035655Askeleen on yleensä oltava erittäin lyhyt, jotta päästäisiin kelvolliseen tarkkuuteen.
Menetelmä on stabiili vain, kun askel on riittävän lyhyt.
Eulerin menetelmässä lasketaan derivaatan arvo kunkin välin alkupisteessä ja derivaatan avulla arvioidaan funktion muutosta koko askeleella. Tulos on oikea vain, jos ratkaistavan funktion kuvaaja on suora. Jos kuvaaja on kaareva, olisi parempi käyttää derivaatan keskimääräistä arvoa. Sitä voitaisiin arvioida esimerkiksi keskiarvolla
< y' > = (y' (x ) + y' (x + h) / 2.
Tässä esiintyvä y' (x + h) = f (x + h, y (x + h )) ei ole tunnettu, joten kyseessä on implisiittinen menetelmä.
Tuntematonta derivaattaa voidaan arvioida käyttämällä alkuperäistä Eulerin menetelmää:
y (x + h) =
y (x ) + h y' (x ),
y' (x + h ) =
f (x + h, y (x +h)),
y (x + h ) =
y (x ) + (h / 2)
(y' (x ) + y' (x + h)).
Tätä iteraatiota voitaisiin vielä toistaa laskemalla korjatun y-arvon avulla derivaatan tarkempi arvo ja sen avulla taas uusi y.
Implisiittiset menetelmät ovat usein stabiilimpia kuin eksplisiittiset.
Ennustaja-korjaaja-menetelmien (predictor-corrector) ajatus: Ensin lasketaan nykyisessä pisteessä tunnettujen arvojen avulla likimääräinen ennuste (predictor) funktion arvolle seuraavassa pisteessä. Ennusteen avulla lasketaan korjattu arvo (corrector).
y' = f (x, y ),
jolloin
y'' = f'= fx + fy (dy / dx) = fx + fy f.
Taylorin sarjasta saadaan likiarvo
yn+1 =
yn + h y' +
(h2 /2) y''
= yn + h f +
(h2 / 2) f'
= yn + h f +
h2
((1/2) fx +
(1/2) fy f).
Merkitään
k1 =
h f (xn, yn),
k2 =
h f (xn +
\alpha h,
yn + \beta k1).
Koska f = y'', k1 ja k2 ovat arvioita y:n muutokselle, kun x kasvaa askeleen h verran.
Todellinen muutos esitetään näiden arvioiden lineaarikombinaationa:
yn+1 =
yn +
a k1 + b k2
= yn +
a h f + b h f (xn +
\alpha h, yn + \beta h f )
\approx yn + a h f +
b h [ f +
\alpha h fx +
\beta h fy f ]
= yn +
(a + b ) hf +
h2
(\alpha b fx +
\beta b fy f).
Vertaamalla tätä Taylorin sarjaan saadaan yhtälöryhmä
a + b = 1,
\alpha b = 1/2,
\beta b = 1/2.
Tämä toteutuu esimerkiksi, jos valitaan a = b = 1/2, \alpha = \beta = 1, jolloin
k1 =
h f (xn, yn),
k2 =
h f (xn + h,
yn + k1) =
h f (xn + h,
yn +
h f (xn,
yn)),
yn+1 =
yn + k1/2 +
k2/2 =
yn + (h /2)
(f (xn,
yn) +
f (xn + h,
yn +
h f (xn,
yn))
eli saadaan implisiittinen Eulerin menetelmä.
Usein käytetyn neljännen kertaluvun Rungen ja Kuttan menetelmän johtaminen on työlästä. Tulokseksi saadaan 11 yhtälöä, joissa 13 tuntematonta.
Tavallisimmin käytetty menetelmä on:
k1 =
h f (xn, yn),
k2 =
h f (xn +
(1/2) h,
yn +
(1/2) k1),
k3 =
h f (xn + (1/2) h,
yn + (1/2) k2),
k4 =
h f (xn + h,
yn + k3 ),
yn+1 =
yn +
(1/6) (k1 + 2 k2 +
2 k3 + k4).
Tämän globaali virhe on luokkaa h4.
Esimerkiksi toisen kertaluvun yhtälö
y'' + y = 0
voidaan kirjoittaa yhtälöpariksi
y' = u,
u' = - y.
Analyyttinen ratkaisu alkuarvoilla y (0) = 0, y' (0) = 1 on y = sin x.
Ratkaisu Rungen ja Kuttan menetelmällä on pääpiirteittäin
h=0.1 x=0.0; y= 0.0 ; u= 1.0 do while (x <= 1.0) ky1 = h * u ku1 = h * (-y) ky2 = h * (u+ku1/2) ku2 = h * (-(y+ky1/2)) ky3 = h * (u+ku2/2) ku3 = h * (-(y+ky2/2)) ky4 = h * (u+ku3) ku4 = h * (-(y+ky3)) y = y + (ky1 + 2*ky2 + 2*ky3 + ky4)/6.0 u = u + (ku1 + 2*ku2 + 2*ku3 + ku4)/6.0 x = x+h write(*,*) x,y end doOhjelman tulostus (oikealla tarkka arvo):
0.1000000 9.9833339E-02 9.9833421E-02 0.2000000 0.1986692 0.1986693 0.3000000 0.2955200 0.2955202 0.4000000 0.3894180 0.3894183 0.5000000 0.4794252 0.4794255 0.6000000 0.5646421 0.5646425 0.7000000 0.6442173 0.6442177 0.8000001 0.7173556 0.7173561 0.9000001 0.7833264 0.7833270 1.000000 0.8414705 0.8414711
Moniaskelmenetelmissä käytetään useita aikaisempia pisteitä seuraavan ekstrapolointiin.
Askelpituus voi olla suurempi, joten laskenta nopeampaa.
Lähtötiedot tunnetaan yleensä vain yhdessä pisteessä, joten aluksi on laskettava muutamia pisteitä jollakin yksiaskelmenetelmällä.
Yksiaskelmenetelmissä kukin askel lasketaan muista riippumatta, joten askelpituutta voi muuttaa tarpeen mukaan. Moniaskelmenetelmissä askelpituuden muuttaminen on työlästä; se edellyttää uuden lähtöpistejoukon laskemista.
dy = f (x, y) dx
ja integroidaan yhden askeleen yli
\intxn
xn+1 dy =
yn+1 - yn =
\intxn
xn+1 '
f (x, y) d x.
Korvataan f (x, y) interpolointipolynomilla (nyt täytyy käyttää aikaisempiin arvoihin perustuvaa polynomia):
yn+1-yn \approx
\intxn^
xn+1
( fn +
s \Delta fn-1 +
((s +1)s / 2) \Delta2
fn-2) d x
=\ints =0s =1
( fn +
s \Delta fn-1 +
((s +1)s /r2) \Delta2
fn-2) h d s
= h (fn +
(1/2) \Delta fn-1 +
(5/12) \Delta2 fn-2 )
= h (fn +
[fn - fn-1] /2 ] +
[5 (fn -
2 fn-1 +
fn-2) /12] )
= (h /12) (23 fn -
16 fn-1 +
5 fn-2).
Integrointiaskel on siis
yn+1 = yn + (h /12) (23 fn - 16 fn-1 + 5 fn-2).
Lokaali virhe on O (h4) ja globaali O (h3).
Esimerkkiyhtälön y'' + y = 0 ratkaisu Adamsin menetelmällä:
! alkuarvot; huijataan ja oletetaan ratkaisu tunnetuksi ! nama pitaisi laskea jollakin yksiaskelmenetelmalla g2 = cos(0) g1 = cos(0.1) g0 = cos(0.2) f2 = -sin(0) f1 = -sin(0.1) f0 = -sin(0.2) h = 0.1 x = 0.2 y = sin(0.2) u = cos(0.2) ! varsinainen integrointisilmukka do while (x <=2.0) y = y + h/12*(23*g0-16*g1+5*g2) u = u + h/12*(23*f0-16*f1+5*f2) g2=g1; g1=g0; g0=u f2=f1; f1=f0; f0=-y x = x+h write(*,*) x,y,u end do
x y y (tarkka) u y'(tarkka) 0.3000000 0.2955149 0.2955202 0.9552994 0.9553365 0.4000000 0.3893969 0.3894183 0.9209886 0.9210610 0.5000000 0.4793826 0.4794255 0.8774783 0.8775826 0.6000000 0.5645716 0.5646425 0.8252031 0.8253356 0.7000000 0.6441129 0.6442177 0.7646864 0.7648422 0.8000001 0.7172123 0.7173561 0.6965334 0.6967067 0.9000001 0.7831398 0.7833270 0.6214256 0.6216099 1.000000 0.8412372 0.8414711 0.5401140 0.5403022
yn+1 =
yn + h fn,
yn+1 =
yn +
(h /2)
(3 fn - fn-1),
yn+1 =
yn +
(h /12)
(23 fn -
16 fn-1 +
5 fn-2),
yn+1 =
yn +
(h /24)
(55 fn -
59 fn-1 +
37 fn-2 -
9 fn-3),
Nämä ovat eksplisiittisiä menetelmiä.
Implisiittisessä menetelmässä esiintyy yhtälö
yn+1 = yn + g + \beta h f (xn+1, yn+1),
missä g riippuu vain aikaisemmista x:n ja y:n arvoista. Tässä esiintyvä funktio f voi olla sellaista muotoa, ettei yn+1:lle saada analyyttistä lauseketta, vaan se on ratkaistava jollakin iterointimenetelmällä.
Adamsin-Moultonin menetelmät ovat implisiittisiä menetelmiä:
yn+1 =
yn + h fn+1,
yn+1 =
yn +
(h /2)
(fn+1 + fn),
yn+1 =
yn +
(h /12)
(5 fn+1 +
8 fn -
fn-1),
yn+1 =
yn +
(h /24)
(9 fn+1 +
19 fn -
5 fn-1 +
fn-2),
Implisiittiset menetelmät ovat stabiilimpia kuin eksplisiittiset.
Eksplisiittiset ja implisiittiset menetelmät voidaan yhdistää, jolloin vältetään yhtälön ratkaiseminen.
Käytetään Adamsin-Bashforthin menetelmää ennustajana ja Adamsin-Moultonin menetelmää korjaajana. Esimerkiksi:
yn+1 =
yn +
(h /24)
(55 fn -
59 fn-1 +
37 fn-2 -
9 fn-3),
yn+1 =
yn +
(h /24)
(9 fn+1 +
19 fn -
5 fn-1 +
fn-2),
Esimerkkiyhtälön ratkaisu Adamsin ennustaja-korjaaja-menetelmällä:
do while (x <=1.0) ! ennustaja y1 = y + h/12*(23*g0-16*g1+5*g2) u1 = u + h/12*(23*f0-16*f1+5*f2) g2=g1; g1=g0; g0=u1 f2=f1; f1=f0; f0=-y1 ! korjaaja y2 = y +h/12*(5*g0+8*g1-g2) u2 = u +h/12*(5*f0+8*f1-f2) u = u2 ; y = y2 ; x = x+h write(*,*) x,y,u end do x y y (tarkka) u y'(tarkka) 0.3000000 0.2955195 0.2955202 0.9553408 0.9553365 0.4000000 0.3894152 0.3894183 0.9210703 0.9210610 0.5000000 0.4794213 0.4794255 0.8775975 0.8775826 0.6000000 0.5646383 0.5646425 0.8253561 0.8253356 0.7000000 0.6442145 0.6442177 0.7648684 0.7648422 0.8000001 0.7173551 0.7173561 0.6967387 0.6967067 0.9000001 0.7833292 0.7833270 0.6216474 0.6216099 1.000000 0.8414777 0.8414711 0.5403448 0.5403022
Ratkaisumenetelmä voi olla stabiili tai epästabiili ratkaistavasta yhtälöstä ja askelpituudesta riippuen.
Askelpituuden on oltava riittävän pieni. Liian suuri askel voi johtaa menetelmän epästabiilisuuteen.
Toisaalta hyvin pieni askelpituus tekee ratkaisun laskemisen työlääksi ja voi johtaa pyöristysvirheiden kasaantumiseen.
Hyvä tarkistuskeino on laskea ratkaisu uudestaan askelpituudella, joka on puolet alkuperäisestä. Jos tulokset ovat likimain samoja, ratkaisu on todennäköisesti lähellä oikeaa. Jos taas tulokset poikkeavat toisistaan huomattavasti, joko askelpituus on liian suuri, tai tehtävään liittyy muita ongelmia, jotka on syytä selvittää.
Mahdolliset singulariteetit: esimerkiksi vetovoima kasvaa rajatta etäisyyden pienentyessä. Kappaleiden lähestyessä tarkkuuden säilyttäminen vaatii aika-askeleen lyhentämistä. Ongelma voidaan (ainakin osittain) poistaa regularisoinnilla eli sopivilla ajan ja geometrian muunnoksilla.
Alkuarvotehtävällä on yleensä yksikäsitteinen ratkaisu, jos siinä esiintyvät funktiot ovat riittävän siistejä.
Reuna-arvotehtävällä ei välttämättä ole lainkaan ratkaisua, tai ratkaisuja voi olla äärettömän monta.
y' (xi) \approx
(yi+1 - yi-1)
/ (2 h ),
y'' (xi) \approx
(yi+1 - 2 yi +
yi-1) / h2.
Esimerkiksi yhtälö y'' + y = 0:
(yi+1 - 2yi + yi-1) / h2 + yi = 0
eli
yi-1 + (h2 - 2) yi + yi+1 = 0.
Reuna-arvoista saadaan lisäksi
y0 = 1, yn = 1.
Kun askel on h = 0.25, saadaan yhtälöt
y0 = 1,
y0 - 1.9375 y1 +
y2 = 0,
y1 - 1.9375 y2 +
y3 = 0,
y2 - 1.9375 y3 +
y4 = 0,
y4 = 1
eli
| 1 0 0 0 0 | | y_0 | | 1 | | 1 -1.9375& 1 0 0 | | y_1 | | 0 | | 0 1 -1.9375 1 0 | | y_2 | = | 0 | | 0 0 1 -1.9375 1 | | y_3 | | 0 | | 0 0 0 0 1 | | y_4 | | 1 |Yhtälöryhmän ratkaisu on
x y y(tarkka) 0.0000 1.0000 1.0000 0.2500 1.1047 1.1041 0.5000 1.1403 1.1395 0.7500 1.1047 1.1041 1.0000 1.0000 1.0000Lineaarinen differentiaaliyhtälö korvataan lineaarisella yhtälöryhmällä, jonka kerroinmatriisi on nauhamatriisi. Tilaa voidaan säästää tallettamalla vain lävistäjän suuntaiset nollasta poikkeavat vinorivit.
Yleensä voidaan käyttää normaalia Gaussin eliminointia. Kukin muuttuja eliminoidaan vain muutamasta yhtälöstä, joten laskenta-aika verrannollinen n:ään.
Jos askel on lyhyt, yhtälöiden määrä voi olla hyvin suuri, mikä voi aiheuttaa pyöristysvirheiden kasaantumista. Jos kerroinmatriisi on diagonaalidominantti, iteratiiviset menetelmät ovat käyttökelpoisia.
Tarkkuutta voidaan parantaa