lauantai 16. helmikuuta 2019

Sieventäminen ei aina mene niin kuin luulisi

GeoGebran CAS

Potenssilausekkeen (herätteenä K. Väisälän algebran kirjan harjoitustehtävä, joskaan ei ihan tässä muodossa)
\[
x^{1+n} (x^{n-1})^n (x^n)^{-n}
\]
sieventäminen on useimmille lukiolaisille yksinkertainen juttu: tulos on $x$. GeoGebrakin sieventää sen ongelmitta: pelkän lausekkeen syöttäminen tosin antaa kesken jääneen tuloksen mutta lausekkeen uudelleen kutsuminen (tai suoraan Simplify/Sievennä-komennon käyttö) antaa tuloksen $x$.

Mathematica ei kuitenkaan suostu sieventämään lauseketta Simplify-komennolla, vaan palauttaa sen muuttumattomana. Mitä tästä pitäisi ajatella? Sievennys kyllä onnistuu, jos asetetaan sopiva lisäehto, esimerkiksi Simplify[lsk,x>0] tai Simplify[lsk,Element[n,Integers]], missä lsk tarkoittaa kyseistä lauseketta ja komennon jälkimmäinen argumentti määrittelee $x$:n positiiviseksi reaaliluvuksi tai $n$:n kokonaisluvuksi. Eikö sievennys pädekään rajoituksitta?

Mathematican oletuksena on, että symbolit ovat kompleksilukuja (joiden osajoukkona tietenkin ovat reaaliluvut). Tällöin siis $x$, $n$ tai laskennan välitulokset voivat olla kompleksilukuja, ellei toisin ilmoiteta. GeoGebra sen sijaan ei kompleksilukualgebraa kaikissa suhteissa käytä eikä ota huomioon mahdollisia kompleksiarvoja.

Onko sitten olemassa joitakin arvoja luvuille $x$ ja $n$, joilla lausekkeen arvo ei olekaan $x$?  Ehkä helpoin tapa lähteä tutkimaan asiaa on ajatella lauseke kahden muuttujan, $x$ ja $n$ funktioksi ja piirtää sen kuvaaja, ts. kolmiulotteisen avaruuden pinta. Tähän on olemassa komento, ja tulos on oheisen kuvan mukainen. Mitä ovat pinnan liuskat ja niiden välissä olevat tyhjät tilat?

Plot3D[lsk, {x, -2, 2}, {n, -5, 5}]

Komento Plot3D piirtää reaaliarvoisten funktioiden kuvaajia. Jos arvo on jossakin pisteessä kompleksinen, se jätetään yksinkertaisesti piirtämättä. Lausekkeen reaaliosa ja imaginaariosa ovat kuitenkin reaaliarvoisia:

Plot3D[Re[lsk], {x, -2, 2}, {n, -5, 5}]

Plot3D[Im[lsk], {x, -2, 2}, {n, -5, 5}]

Vaikuttaa siis siltä, että esimerkiksi arvolla $n = -1/5$ funktion arvot ovat kompleksisia, jos $x < 0$. Näin onkin. Arvoksi saadaan Mathematicalla laskettuna
\[
\left(\frac{\sqrt{5}-1}{4} - i\sqrt{\frac{\sqrt{5}+5}{8}}\right)x.
\]
Jos $n = -1/2$ ja $x < 0$, tulos on $-x$.

Lukija ehkä kysyy, miten murtopotenssit — tai niiden päähaarat — on tällöin määritelty ja voiko olla varma, että Mathematica laskee oikein. Tai että ylipäätään jokin laskentaohjelma laskee oikein. Varovaisuus on paikallaan. Mikään ihmisen tekemä ei yleensä ole täysin virheetöntä eivätkä määritelmätkään ole aina samoja. Saman laskun voikin varmuuden vuoksi laskea useammalla ohjelmalla. Ihan itse käsin laskeminen on lisäksi opettavaista, mutta saattaa olla työlästä eikä sekään aina virheetöntä.

Onko edellä oleva sitten laskettu oikein? Ainakin Matlab-klooni Octave laskee samoin.

maanantai 4. helmikuuta 2019

Sieventämisen kauneus ja kauheus


Lupauduin auttamaan lukiolaista matematiikan kertaamisessa ja taitojen testaamiseksi annoin ratkaistavaksi muutaman sievennystehtävän. Tällaisiahan on hieno kokoelma Kalle Väisälän klassikossa, Algebran oppi- ja esimerkkikirjan ensimmäisessä osassa, jota aikoinani itse käytin. Sievennystehtäviä ratkaistiin keskikoulun viimeisellä luokalla vastaten nykyistä peruskoulun viimeistä vuotta.

Sievennystehtävissä tuli kerratuksi polynomien ja rationaalilausekkeiden perusalgebra.  Niistä opittiin jotakin yleisempääkin: Yhtä ainoaa tietä lausekkeen sieventämiseen ei ole, vaan voidaan edetä montaa erilaista reittiä joko paljon työtä tehden tai hyvän oikotien löytäen. Lopputuloskaan ei ole yksikäsitteinen, vaan sievyys riippuu mieltymyksistä ja siitä, mitä lausekkeella on seuraavaksi tarkoitus tehdä.

Väisälällä on yhtenä esimerkkinä lauseke
\[ \frac{x^2 + \frac{1 }{x^2} + 2}{x + \frac{1}{x}}, \] jossa osoittaja ja nimittäjä voidaan ensin saattaa samannimiseiksi ja sitten suorittaa murtolausekkeiden jakolasku:
\[ \frac{\dfrac{x^4 + 1 + 2x^2}{x^2}}{\dfrac{x^2 + 1}{x}} = \frac{x(x^4 + 1 + 2x^2)}{x^2(x^2 + 1)}. \] Tekijällä $x$ voidaan supistaa ja osoittaja tunnistaa binomin neliöksi:
\[ \frac{(x^2 + 1)^2}{x(x^2 + 1)} = \frac{x^2 + 1}{x}. \]
Hieman suorempaan olisi päästy laventamalla alkuperäinen murtolauseke tekijällä $x^2$ ja tunnistamalla binomin neliö (tai suorittamalla polynomien jakolasku):
\[ \frac{x^4 + 1 + 2x^2}{x^3 + x} = \frac{(x^2 + 1)^2}{x(x^2 + 1)} = \frac{x^2 + 1}{x}. \]
Lyhin tie kuitenkin varmaan olisi tunnistaa alkuperäisen lausekkeen osoittaja binomin neliöksi:
\[ \frac{\left(x + \frac{1}{x}\right)^2}{x + \frac{1}{x}} = x + \frac{1}{x} \] Lopputulos on hieman erinäköinen kuin edellä, mutta kuitenkin yhtäpitävä. Molempia voidaan pitää kohtuullisen sievinä.

Tällaisia sievennyksiä ei nykyään enää taideta koulussa juurikaan opetella. Pitäisikö kuitenkin?

Pelkkä lausekkeiden sieventäminen sujuu kyllä helposti symbolisilla ohjelmilla. Tällöin ei kuitenkaan kehity laskijan taito hahmottaa rakenteita ja tarpeen tullen muuntaa lauseke johonkin muuhun kuin ohjelman sievänä pitämään muotoon. Arvelen, ettei Väisäläkään pitänyt tärkeänä konstikkaiden lausekkeiden sieventämistä sinänsä vaan taitoa yleensä muokata lausekkeita, ja tähän sievennystehtävät olivat hyvää harjoitusta. Aivan kuten polkupyörällä temppuilu johtaa varmuuteen pyörän hallitsemisessa yllättävissäkin tilanteissa.

Symbolisissa laskentaohjelmissakaan lausekkeen muokkaus ei ole aina suoraviivaista.  Esimerkiksi Mathematica tarjoaa yleiskäyttöisen Simplify-komennon lisäksi joukon spesiaalimpia muokkauskomentoja: Expand, ExpandAll, TrigExpand, PowerExpand, ComplexExpand, FunctionExpand, Reduce, TrigReduce, ExpToTrig, TrigToExp, Together, Apart, Cancel, ... Näiden käyttö edellyttää näkemystä siitä, mitä on tekemässä. Mekaanisen työn ne kyllä hoitavat.