lauantai 21. marraskuuta 2015

Mitä symbolilaskentaohjelmalta voi odottaa ja mitä ei?


Matematiikan opiskelussa on alettu käyttää symbolisia laskentaohjelmia.  Näiden käyttö ei kuitenkaan ole aina sitä, mitä äkkiseltään voisi odottaa.  Ohjelman antamat tulokset voivat näyttää yllättäviltä, jopa vääriltä verrattuna matematiikassa totuttuun. Onkin syytä ajatella, että ohjelma elää omaa elämäänsä, vaikka sillä toki onkin läheinen suhde matematiikkaan.

Symbolisella laskennalla on ohjelmoinnin luonne, ja tämän takia olisi parempi käyttää laskennan syötteissä ohjelmointikielen tyyppisiä komentoja ja funktioita traditionaalisen matemaattisen notaation sijasta, vaikka aloituskynnyksestä ehkä tuleekin korkeampi. Matematiikan notaatio ei myöskään ole yksikäsitteistä, vaan tarvitsee asiaa ymmärtävän ihmisen tulkintaa.  Esimerkiksi $a(b+c)$ saattaa tarkoittaa summan $b+c$ kertomista luvulla $a$ tai funktion $a$ arvoa argumenttina $b+c$.

Paitsi että syötteiden ajatteleminen ohjelmointikielenä korostaa matematiikan ja ohjelmalla tehdyn laskennan eroa, se myös auttaa eteenpäin: yksinkertaiset syötteet on helpompaa oppia laajentamaan usean komennon jonoiksi, ts. pieniksi ohjelmiksi. Ainakin jos ohjelmoinnin perusidea on tuttu.

Esitän seuraavassa joitakin esimerkkejä hieman yllättävistä tilanteista.  Nämä on laskettu Mathematicalla; pdf-muotoinen laskentadokumentti löytyy osoitteesta http://www.elisanet.fi/simo.kivela/blg/SymbLask.pdf .  Eri ohjelmat ovat erilaisia. Ilmiö, joka esiintyy yhdessä, ei ehkä esiinny toisessa. Kaikissa kuitenkin on jotakin yllättävää, mikä on osoitus symbolisen laskennan vaikeudesta: tuskin mikään algoritmi on täydellinen. Kyse voi myös olla tasapainoilusta täydellisyyden ja kohtuullisen laskenta-ajan välillä.

Jos joku on kiinnostunut ratkaisemaan samat esimerkit jollakin muulla ohjelmalla, julkaisen dokumentin mielelläni.

Neljännen asteen yhtälö

Jos yhtälöstä $ax^4 + bx^3 + cx^2 + dx + e = 0$ ratkaistaan $x$ symbolisella ohjelmalla, saadaan periaatteessa neljännen asteen yhtälön ratkaisukaavat.  Kertoimille voidaan sijoittaa numeeriset arvot joko yhtälöön tai ratkaisukaavoihin. Edellisessä tapauksessa ratkaisualgoritmia sovelletaan numerokertoimiseen yhtälöön, jälkimmäisessä vain sijoitetaan arvot valmiisiin lausekkeisiin.

Tulosten tietenkin pitäisi olla samat. Useimmiten näin toki onkin, mutta toisinkin voi käydä: Jos $a = 1$, $b = c = d = 0$ ja $e = -1$ ja nämä sijoitetaan yhtälöön, on ratkaistavana yhtälö $x^4 - 1 = 0$. Mathematica antaa oikean tuloksen $\pm 1$, $\pm i$. Ratkaisukaavoihin sijoittamalla saadaan neljään kertaan Indeterminate. Jos kertoimen $b$ arvoa hieman muutetaan, $b = 1/1000000$, molemmat tavat antavat saman oikean tuloksen.

Oikeastaan tilanne ei ole kovin kummallinen: eivät toisen asteen yhtälön ratkaisukaavatkaan toimi, jos $a = 0$.

Yliharmoninen sarja

Sarja $\displaystyle\sum_{n=1}^{\infty}\frac{1}{n^s}$ suppenee, jos $s > 1$ (jos kompleksiset arvot sallitaan, niin tulee olla $\mathrm{re}(s) > 1$).

Mikäli symbolinen ohjelma yleensä pystyy laskemaan sarjan summan, se saattaa antaa tulokseksi zeta(s). Kyseessä on Riemannin $\zeta$-funktio. Tapauksessa $s = 2$, on $\zeta(2) = \dfrac{\pi^2}{6}$, mikä on oikea sarjan summa. Tapauksessa $s = -1$ saataisiin sarjan summaksi $\zeta(-1) = -\dfrac{1}{12}$, jolloin siis luonnollisten lukujen summa olisi $1 + 2 + 3 + 4 + \dots = -\dfrac{1}{12}$.

Toimintoa on pidettävä virheellisenä. Summaan zeta(s) tulisi liittyä rajoitus $\mathrm{re}(s) > 1$. Riemannin $\zeta$-funktio on nimittäin näillä arvoilla määriteltävissä sarjan summana, mutta vaikka se muilla keinoilla voidaankin määritellä myös negatiivisella puolella, harmonistyyppisestä sarjasta sitä ei saada.

Syynä omituiseen summaukseen saattaa olla, että symbolisissa ohjelmissa usein esitetään tulos ns. yleisessä tapauksessa jättäen poikkeukselliset arvot huomiotta.  Tässä tapauksessa poikkeusarvoja on kuitenkin paljon.

Itseisarvoyhtälö

Yhtälön $|z - a| = |z - b|$ ratkaisuksi usein saadaan $z = \frac{1}{2}(a + b)$, mikä on tietenkin oikea tulos, mutta ei kata tapausta $a = b$. Tulos ei ole riittävä myöskään kompleksialueella, missä jokainen pisteitä $a$ ja $b$ yhdistävän janan keskinormaalin piste on ratkaisu.

Symbolisessa ohjelmassa saattaa olla yhtälön ratkaisemiseen tarkoitetun solve-funktion lisäksi jokin muu funktio tilanteen tarkempaa analyysia varten. Tämän avulla ehkä saadaan myös kompleksialueella pätevä ratkaisu, joka kuitenkin voi olla monimutkainen eikä kovinkaan helposti hahmotettavissa.

Trigonometrinen yhtälö

Yhtälöllä $\sin(x) = \sin(x + \frac{\pi}{5})$ on yksinkertainen ratkaisu $x = \frac{2\pi}{5} + n\pi$, mikä on käsinlaskulla helposti löydettävissä. Symbolinen ohjelma saattaa kuitenkin antaa monimutkaisempaa:
\[
x = \arctan\left(\frac{\sqrt{2(5 - \sqrt{5})}}{3 - \sqrt{5}}\right) + 2n\pi,
\quad
x = \arctan\left(\frac{\sqrt{2(5 - \sqrt{5})}}{3 - \sqrt{5}}\right) - \pi + 2n\pi.
\] Tulos on sinänsä oikea. Jos ohjelma pystyy sieventämään sen, päästään samaan kuin käsinlaskulla.

Miksi sitten näin monimutkaista? Yhtälön ratkaisualgoritmi varautuu paljon hankalampiinkin yhtälöihin eikä siten aina löydä optimaalista ratkaisutapaa. Hyvä ohje onkin yrittää sieventää, jos lauseke näyttää kovin mutkikkaalta. Tämä tosin voi johtaa huomattavan kauan kestävään laskentaan, mahdollisesti päättymättömään. Käyttäjän on syytä tietää, millä loputon laskenta voidaan katkaista.

7 kommenttia:

Anonyymi kirjoitti...

'Summa' 1 + 2 + 3 + ... = -1/12 zeta-funktion kautta ei välttämättä ole *virhe*. Päinvastoin tällaiset summia voidaan ilmeisesti määritellä jos sovelletaan Ramanujan-magiaa

( https://en.wikipedia.org/wiki/1_%2B_2_%2B_3_%2B_4_%2B_%E2%8B%AF )

tai kompleksianalyysia

( http://www.nottingham.ac.uk/~ppzap4/response.html , https://terrytao.wordpress.com/2010/04/10/the-euler-maclaurin-formula-bernoulli-numbers-the-zeta-function-and-real-variable-analytic-continuation/ ).

Anonyymi kirjoitti...

Mainittakoon nyt toki vielä että "ohjelmiston virhetilanne" on kyllä pätevä huomautus. Yleensä käyttäjä varmaan obskuurien tulkintojen sijasta haluaa tavanomaisen analyysin vastauksia (suppeneeko sarja tavallisessa mielessä vai ei).

Simo Kivelä kirjoitti...

Voisi tietenkin ajatella, että arvo -1/12 luonnollisten lukujen summalle on vain symbolilaskentaohjelman omaa elämää, joka käyttäjän tulee hyväksyä. Tulokseenhan päästään tietynlaisella summauksen regularisoinnilla. Tällöin ollaan kuitenkin jo aika etäällä normaalista summan laskemisesta. Ohjelman sisäisen logiikan täytyisi kuitenkin tällöinkin päteä. Regularisointi on Mathematicassa mahdollista, mutta se on normaalisti annettava eksplisiittisesti:

Sum[n, {n, 1, Infinity}, Regularization -> "Dirichlet"]

antaa -1/12.

Pekka Alestalo kirjoitti...

Kokeilin samaa 4:nnen asteen yhtälöä Maplella. Sievennysten jälkeen ohjelma vaittää, että
kaikki ratkaisukaavasta saadut tulokset ovat = 0. Lähetän kohta pdf-tiedoston Simolle.

Simo Kivelä kirjoitti...

Kiitokset Pekalle. Tiedosto on osoitteessa http://www.elisanet.fi/simo.kivela/blg/Alestalo_4aste.pdf

Pekka Alestalo kirjoitti...

Kokeilin myös blogissa mainittua zeta-funktiota Maplella. Tässä kohdassa Maple näyttäisi toimivan paremmin, eli se ei korvaa 1/n^s-summaa zeta-funktiolla. Mathematican virhe on kai tiivistettynä siinä, että summalauseke korvataan automaattisesti zeta-funktiolla, vaikka niillä on erilaiset määrittelyjoukot.

Erään kurssiini liittyvän tehtävän yhteydessä huomasin myös seuraavan: Maple ei osaa sieventää lauseketta

ln(x-1) - ln(sqrt(x)-1) - ln(sqrt(x)+1)

nollaksi, vaikka sille kerrotaan erikseen, että x>0 tai x>1. En saanut tätä sievennettyä myöskään Mathematicalla, mutta se saattaa johtua taitojen puutteesta. Sen sijaan Wolfram-alpha sieventää lausekkeen nollaksi, mutta ilmoittaa väärän rajoituksen x > 0 (pitäisi kai olla x > 1).

Simo Kivelä kirjoitti...

Pekan logaritmiesimerkki onkin ihan mielenkiintoinen. Tuo esiin symbolisten ohjelmien piirteitä ja tapoja käyttää niitä. Dokumentti Mathematica-laskennasta:
http://www.elisanet.fi/simo.kivela/blg/logEsim.pdf