lin3ev.mws |
Olkoon tarkasteltavana kolmannen kertaluvun lineaarinen epähomogeeninen differentiaaliyhtälö
> diffyht:= (x-1)*diff(y(x), x$3)-x*diff(y(x), x$2)+diff(y(x), x)=exp(x^2);
Vastaava homogeeniyhtälö on
> homogyht:= lhs(diffyht)=0;
Tämän ratkaisut ovat suhteellisen yksinkertaiset ja pienellä pohdiskelulla arvattavissa. Jos y :n paikalle sijoitetaan eksponenttifunktio, niin yhtälö toteutuu:
>
subs(y(x)=exp(x), homogyht):
simplify(%);
Samoin käy, jos sijoitetaan funktio :
>
subs(y(x)=x^2, homogyht):
simplify(%);
Kolmanneksi perusratkaisuksi sopii vakiofunktio, joka kaikkialla saa arvon 1:
>
subs(y(x)=1, homogyht):
simplify(%);
Homogeeniyhtälön perusjärjestelmä on siten
> perusjarj:= [exp(x), x^2, 1];
Linalg -paketista löytyvällä multiply -komennolla voidaan laskea matriisituloja. Kun kyseessä on kaksi vektoria, on tuloksena pistetulo. Ladataan paketti käyttöön.
> with(linalg):
Homogeeniyhtälön yleinen ratkaisu on:
> homogrtk:= multiply(perusjarj, [_C1, _C2, _C3]);
Epähomogeenisen yhtälön yksittäisratkaisu voidaan hakea vakioiden varioinnilla, jolloin yrite on
> variot:= [u(x), v(x), w(x)];
> yr0:= multiply(variot, perusjarj);
Tämä sijoitetaan differentiaaliyhtälöön ja pyritään määrittämään sellaiset funktiot u( x ), v( x ) ja w( x ), että yhtälö toteutuu. Laskua yksinkertaistetaan kuten toisen kertaluvun yhtälön tapauksessakin asettamalla sopivia lisäehtoja. Toisen kertaluvun tapauksessa näitä on yksi, kolmannen kertaluvun tapauksessa kaksi.
Kerätään derivaatat listaksi:
> derivaatat:= diff(variot, x);
Muodostetaan yritteen derivaatta
> der1:= diff(yr0, x);
ja yksinkertaistetaan sitä asettamalla funktioiden u , v ja w derivaattoja sisältävien termien summa nollaksi:
> termit1:= [seq(coeff(der1, derivaatat[k]), k=1..3)];
> nollatermi1:= multiply(termit1, derivaatat);
Tällöin derivaatta on
>
yr1:= simplify(der1, {nollatermi1=0});
Edellä on käytetty komentoja tarvittavan lisäehdon muodostamiseen ja derivaatan yksinkertaistamiseen. Tämä on luontevaa kirjoitettaessa ohjelmakoodia
Maple
lle, mutta interaktiivisessa laskennassa on yksinkertaisempaa poimia tarvittavat termit hiirellä.
Vastaavalla tavalla muodostetaan yritteen toinen derivaatta, asetetaan toinen lisäehto ja yksinkertaistetaan derivaattaa:
> der2:= diff(yr1, x);
> termit2:= [seq(coeff(der2, derivaatat[k]), k=1..3)];
> nollatermi2:= multiply(termit2, derivaatat);
> yr2:= simplify(der2, {nollatermi2=0});
Yritteen kolmas derivaatta saadaan yksinkertaisesti derivoimalla; lisäehtoja ei enää aseteta:
> yr3:= diff(yr2, x);
Yritteen derivaatat sijoitetaan differentiaaliyhtälöön, jolloin saadaan vain funktioiden u , v ja w derivaattoja koskeva ehto. Funktiot itse supistuvat pois; tämä on seurausta siitä, että yrite muodostetaan homogeeniyhtälön ratkaisujen avulla.
>
ehto:= subs({diff(y(x), x$3)=yr3, diff(y(x), x$2)=yr2, diff(y(x), x)=yr1, y(x)=yr0}, diffyht):
factor(%);
Derivaatat saadaan ratkaistuiksi tästä ehdosta ja aiemmin asetetuista lisäehdoista:
>
derivrtk:= solve({ehto, nollatermi1=0, nollatermi2=0}, {derivaatat[]}):
simplify(%);
Funktiot u , v ja w saadaan tämän jälkeen integroimalla. Selkeintä on laskea funktiot määrättyinä integraaleina alarajan ollessa mielivaltainen. Maplessa listojen integrointi tehdään integroimalla jokainen alkio erikseen map -komennon avulla:
>
integroitavat:= subs(x=t, subs(derivrtk,derivaatat)):
simplify(%);
>
fktrtk:= map(int, integroitavat, t=a..x):
simplify(%);
Esiintyviä integraaleja ei onnistuta lausumaan alkeisfunktioiden tai Maple n tuntemien funktioiden avulla.
Vakioiden varioinnilla on kuitenkin löydetty yksittäisratkaisu:
>
y0:= multiply(fktrtk, perusjarj):
simplify(%);
Ratkaisu voidaan sijoittaa differentiaaliyhtälöön ja tarkistaa, toteutuuko yhtälö:
>
subs(y(x)=y0, diffyht):
simplify(%);
Differentiaaliyhtälön yleinen ratkaisu on siis
>
homogrtk+y0:
simplify(%);
Nimittäjien nollakohdan takia tarkastelualue on joko x < 1 tai x > 1. Integraalin alaraja on valittava siitä alueesta, jota tarkastellaan.
Lukija tutkikoon, miten Maple ratkaisee edellä käsitellyn yhtälön suoraan dsolve -komennolla.