Simo K. Kivelä / 19.08.2010

Yhtälöiden ratkaiseminen

In[1]:=

luento2_1.gif

Ensimmäisen ja toisen asteen yhtälöt, polynomiyhtälöt

Luontevinta on aloittaa tallettamalla yhtälö jollakin (kuvaavalla) nimellä. Yhtälön yhtäläisyysmerkki on kaksi peräkkäistä yhtäläisyysmerkkiä; yksi yhtäläisyysmerkki on sijoitusoperaattori, jolla lauseke talletetaan jollekin  nimelle.

In[2]:=

luento2_2.gif

Out[2]=

luento2_3.gif

Ratkaisu saadaan komennolla Solve, jolle on annettava kaksi argumenttia: yhtälö ja tuntematon, so. symboli, jonka suhteen yhtälö halutaan ratkaista:

In[3]:=

luento2_4.gif

Out[3]=

luento2_5.gif

Yhtä hyvin yhtälö voidan suoraan kirjoittaa Solve-komennon argumentiksi:

In[4]:=

luento2_6.gif

Out[4]=

luento2_7.gif

Ratkaisu saadaan korvaussäännön muodossa, mutta muuttujalle x ei synny arvoa:

In[5]:=

luento2_8.gif

Out[5]=

luento2_9.gif

Mihin tahansa lausekkeeseen voidaan muuttujalle x sijoittaa saatu arvo korvausoperaattorin /. (eli ReplaceAll) avulla:

In[6]:=

luento2_10.gif

Out[6]=

luento2_11.gif

In[7]:=

luento2_12.gif

Out[7]=

luento2_13.gif

Vastaavasti toisen asteen yhtälölle:

In[8]:=

luento2_14.gif

Out[8]=

luento2_15.gif

In[9]:=

luento2_16.gif

Out[9]=

luento2_17.gif

Tämän avulla voidaan laskea esimerkiksi juurten summa ja tulo käyttämällä hyväksi aaltosuluilla rajattuja listoja:

In[10]:=

luento2_18.gif

Out[10]=

luento2_19.gif

In[11]:=

luento2_20.gif

Out[11]=

luento2_21.gif

Listojen alkioihin voidaan viitata funktioilla First ja Last tai indeksillä:

In[12]:=

luento2_22.gif

Out[12]=

luento2_23.gif

In[13]:=

luento2_24.gif

Out[13]=

luento2_25.gif

Vastaavaan tapaan voidaan käsitellä korkeampien asteiden yhtälöitä:

In[14]:=

luento2_26.gif

Out[14]=

luento2_27.gif

Joskus tulos voi olla pitkähkö. Seuraavassa muodostetaan yleinen neljännen asteen yhtälön ratkaisukaava, joka talletetaan korvaussäännön muodossa nimelle rtk. Tämä sisältää itse asiassa neljä korvaussääntöä, koska neljännen asteen yhtälöllä on neljä juurta.

In[15]:=

luento2_28.gif

Out[15]=

luento2_29.gif

In[16]:=

luento2_30.gif

Out[16]//Short=

luento2_31.gif

Tulos on huomattavan pitkä. Funktion Short avulla siitä saadaan esiin lyhyempi osa, joka näyttää kuitenkin tuloksen yleisen hahmon (ainakin jollakin tavalla).

Saadun ratkaisukaavan pätevyyttä voidaan testata muodostamalla ensin polynomi, jonka nollakohdat tiedetään, ja yrittämällä sitten ratkaista nämä edellä saadusta yleisestä kaavasta. Polynomi olkoon

In[17]:=

luento2_32.gif

Out[17]=

luento2_33.gif

Sijoitetaan kertoimet edellä saatuun kaavaan ja yritetään sieventää; Simplify ei tehoa, FullSimplify auttaa:

In[18]:=

luento2_34.gif

Out[18]=

luento2_35.gif

Aina ei kuitenkaan onnistu. Muodostetaan uusi neljännen asteen polynomi ja ratkaistaan se toisaalta suoraan Solve-komennolla, toisaalta sijoittamalla polynomin kertoimet ratkaisukaavaan.

In[19]:=

luento2_36.gif

Out[19]=

luento2_37.gif

In[20]:=

luento2_38.gif

Out[20]=

luento2_39.gif

Nämä ovat todellakin nollakohdat:

In[21]:=

luento2_40.gif

Out[21]=

luento2_41.gif

Mutta:

In[22]:=

luento2_42.gif

luento2_43.gif

luento2_44.gif

luento2_45.gif

luento2_46.gif

luento2_47.gif

luento2_48.gif

luento2_49.gif

luento2_50.gif

Out[22]=

luento2_51.gif

Saatu ratkaisukaava ei siis olekaan aivan yleinen!

Polynomiyhtälöt numeerisesti

Polynomiyhtälön ratkaiseminen ei aina ole suoraviivaista:

In[23]:=

luento2_52.gif

Out[23]=

luento2_53.gif

In[24]:=

luento2_54.gif

Out[24]=

luento2_55.gif

Nämä ovat kyllä polynomin nollakohdat, mutta niiden lausekkeet ovat hieman erikoiset. Taustalla on vakava periaatteellinen rajoitus: juurilausekkeiden (neliöjuuri, kuutiojuuri jne.) avulla ilmaistavat yleiset ratkaisukaavat ovat olemassa ainoastaan neljänteen asteeseen saakka. Korkeampien asteiden polynomeille käytetään tämän takia usein eo. lausekkeiden tapaisia ilmauksia, jotka ovat oikeastaan vain tautologioita. Numeeriset arvot saadaan kuitenkin tällöinkin:

In[25]:=

luento2_56.gif

Out[25]=

luento2_57.gif

Toisaalta numeeriset arvot voidaan laskea myös suoraan numeerisesti funktiolla NSolve, mikä saattaa olla oleellisestikin nopeampaa:

In[26]:=

luento2_58.gif

Out[26]=

luento2_59.gif

Transkendenttiyhtälöt

Joissakin tapauksissa funktiota Solve voidaan käyttää myös muiden kuin polynomiyhtälöiden ratkaisuun:

In[27]:=

luento2_60.gif

luento2_61.gif

Out[27]=

luento2_62.gif

In[28]:=

luento2_63.gif

Out[28]=

luento2_64.gif

Kaikkia juuria ei kuitenkaan saada.

Yleensä ns. transkendenttiyhtälöiden ratkaiseminen ei kuitenkaan onnistu:

In[29]:=

luento2_65.gif

luento2_66.gif

Out[29]=

luento2_67.gif

Tällaisten yhtälöiden numeeriseen ratkaisemiseen on käytettävissä funktio FindRoot. Se käyttää Newtonin menetelmän tyyppistä (mutta tehokkaampaa) algoritmia yhtälön yhden ratkaisun löytämiseen. Algoritmille on annettava jonkinlainen etsittävän juuren alkuapproksimaatio:

In[30]:=

luento2_68.gif

Out[30]=

luento2_69.gif

In[31]:=

luento2_70.gif

Out[31]=

luento2_71.gif

In[32]:=

luento2_72.gif

Out[32]=

luento2_73.gif

Menetelmä ei aina anna alkuapproksimaatiota lähintä juurta, kuten viimeinen esimerkeistä osoittaa.

Alkuarvojen etsimisessä voidaan käyttää graafisia esityksiä:

In[33]:=

luento2_74.gif

Out[33]=

luento2_75.gif

Yhtälöryhmät

Kaikkia edellä esitettyjä menetelmiä voidaan käyttää myös yhtälöryhmien ratkaisemiseen. Funktioissa Solve ja NSolve niin yhtälöt kuin tuntemattomatkin on tällöin annettava aaltosulkuihin suljettuina listoina:

In[34]:=

luento2_76.gif

Out[34]=

luento2_77.gif

In[35]:=

luento2_78.gif

Out[35]=

luento2_79.gif

In[36]:=

luento2_80.gif

Out[36]=

luento2_81.gif

Funktion FindRoot syntaksi on hieman erilainen:

In[37]:=

luento2_82.gif

Out[37]=

luento2_83.gif

Komento Reduce

Yhtälöistä ja yhtälöryhmistä voidaan muodostaa mahdollisimman yksinkertaisia yhtäpitäviä yhtälöitä tai yhtälöryhmiä komennolla Reduce. Tuloksena voi tällöin olla ratkaisu yhtälönä tai yhtälöinä (eikä korvaussääntöinä) tai alkuperäisen kanssa yhtäpitävä yksinkertaisempi yhtälö tai ryhmä.

In[38]:=

luento2_84.gif

Out[38]=

luento2_85.gif

Symboli || on 'tai'. Vastaavasti && on 'ja'.

In[39]:=

luento2_86.gif

Out[39]=

luento2_87.gif

In[40]:=

luento2_88.gif

Out[40]=

luento2_89.gif

Spikey Created with Wolfram Mathematica 7.0