Hyppijä

Oheinen väkkärä hyppelehtii outomerellä ponttoniensa varassa. Sitä ohjataan jalkoja ja niiden välistä vartta lyhentämään ja pidentämään pyrkivillä voimilla.

väkkärä

Alkuperäinen tavoite oli laatia algoritmi, joka saa väkkärän hyppelehtimään iloisesti ja heittämään vaikka volttia, mutta onnistuin saamaan aikaiseksi vain yhden vaatimattoman hypyn.

Liian monimutkainen tehtävä käsityöksi

Tein kaiken tietokoneella, koska tehtävä vaati lausekkeiden pyörittelyä enemmän kuin mihin käsivoimani riittivät. Simulointiin ja optimiohjauksen numeeriseen iterointiin tarvittavat lausekkeet olivat nekin liian monimutkaisia käsin koodattavaksi.

Ratkaisun alussa valitaan koordinaatisto, jossa järjestelmä tila esitetään. Vasta kolmannella osuin toimivaan. Joka yrityksellä piti kaikki laskea alusta loppuun uudestaan. Käsityönä siinä olisi mennyt ikä ja terveys. Tietokone laski kaiken uudestaan muutamassa sekunnissa.

Virheitäkin tuli. Onneksi tietokoneen siististi auki kirjoittamat välivaiheet auttoivat virheen paikallistamisessa. Tietokoneen ansiosta riitti korjata virhe, ei laskea kaikkea käsin uudestaan.

Kuvaajiakin annoin tietokoneen piirrellä, että minulle hahmoittui, millaisia muutamista keksimistäni luonnonlaeista seuraa. Kuvaajien piirtämisessä tietokone on paljon nopeampi ja tarkempi kuin minä. Se osaa piirtää sellaistakin, mihin käden taitoni ei riitä.

Tietokoneen tarjoamat apuvälineet

Maxima on sopiva tällaiseen, mutta minä otin käyttöön pythonin, koska sillä muutenkin ohjelmoin ja koska sillä on tarvittaessa helppo lisätä ohjelmanpätkiä ratkaisuun. Tämä "työkirja" on laadittu jupyterlab-nimisellä sovelluksella.

Lausekkeiden pyörittelyyn käytän sympy-kirjaston metodeja. Niitä ei ollut ihan helppo oppia käyttämään eikä niiden lukeminen liene helppoa. Ohjelmointiin tottumaton voi onneksi keskittyä matemaattisessa muodossa tulostettuihin lausekkeisiin. Jutun olen tosin kirjoittanut sillä mielellä, että siitä olisi apua tällaisesta ohjelmoinnista kiinnostuneelle.

Juttu on pikkuisen sekava helposti seurattavaksi, mutta antanee yleisvaikutelman tietokoneen tarjoamista matematiikan apuvälineistä.

Ensimmäisellä lukemisella voit hypätä suoraan pikku esimerkkiin

Simulaattori ja liikeradan optimointi Pythonilla

Alustuksia

Python-ohjelmien alussa luetellaan python-moduleja, joiden funktiota käytetään hyväksi.

Pyörittelen tässä ohjelmassa symbolisia lausekkeita, joista generoidaan python-koodia numeerista laskentaa varten. Koodista tulee niin monimutkaista, etteivät sen lausekkeet mahdu yhdelle riville. textwrap-paketista löytyvä metodi fill osaa katkoa rivit automaattisesti pythonin hyväksymällä tavalla.

... import fill tarkoittaa, että voin kutsua funktiota fill suoraan.

Numpy-moduli tarjoaa numeerisen laskennan apufunktioita. import numpy muotoinen import komento edellyttää, että esimerkiksi numpy-modulin funktioita array kutsuessani, minun pitää numpy.array

Tyylikkäintä olisi ollut käyttää vain yhtä import-muotoa, mutta tulin kokeilleeksi kaikkia vaihtoehtoja.

Re-modulissa on regular expressions funktioita merkkijonojen käsittelyyn. Regular expressions on käytettävissä kaikissa kunnollisissa editoreissa ja kaikki ohjelmointikielet tukevat niitä. Regular expressions-funktioita on vaikea oppia käyttämään, mutta ne nopeuttavat editointia ja ohjelmoinnissa ei aina edes selviä ilman niitä.

Symboliseen laskentaan käytetään sympy-modulia. Se ei kuulu pythonin perusasennukseen, joten installoin sen erikseen komennolla pip3 install sympy.

... as sp tarkoittaa, että voin tästä ohjelmasta kutsua sympy:n funktioita lisäämällä funktion nimen eteen sp. Tämä tekee koodista selkeämpää.

Ylläoleva varmistaa, että matemaattiset lausekkeet tulostetaan niin hyvin, kuin tietokoneesi sallii. Olen installoinut LaTeX ohjelmiston yms. joten minulle yhtälöt tulostuvat siististi.

(init_printing()-funktiolle voi antaa monenlaisia parametreja, mutta niihin perehtyminen ei tuntunut hyödylliseltä.)

Symbolisten muuttujien esittely

Käskyllä y = sp.Function('y')(t) muuttujalle y annetaan arvoksi määrittelemätön funktio y(t).

Käskyllä sp.dsolve(sp.diff(y, t) - y) ratkaistaan differentiaaliyhtälö $\frac{d}{dt}y(t) = y(t)$

Muotoa sp.dsolve(sp.diff(y, t) = y) ei voi käyttää vaan on käytettävä joko muotoa sp.dsolve(sp.diff(y, t) - y) tai sp.dsolve(sp.Eq(sp.diff(y, t), y))

Yhtälöä a = b ei voi tulostaa sellaiseen display-funktiolla, vaan a = b pitää korvata lausekkeella sp.Eq(a,b).

Yksinkertainen esimerkki tietokoneavusteisesta matematiikasta

Ennen kuin siirrytään tarkastelemaan väkkärän ohjaamisen matematiikka, tarkastellaan tietokoneavusteista matematiikkaa pienen esimerkin avulla.

Funktio, sen derivaatta ja derivaatan 0-kohdat

koodin kirjoittaminen

Yleensä matemaattisia lausekkeita tarvitaan jossain tietokone-ohjelmassa. Kirjoitetaan python-moduliin p.fy funktiot f(x) ja df(x)

Tulostetaan tiedoston sisältö.

Funktioiden piirtäminen

f ja df ovat funktion ja sen derivaatan lausekkeita. Tehdään niitä vastaavat numeeriset funktiot kuvoiden piirtämisen helpottamiseksi. (Myöhemmin tässä jutussa käytän hölmömpää tapaa, jonka joskus korjaan.)

Sijoitetaan kertoimille a, b, c ja d muutamia arvoja, tulostetaan parametrit, derivaatan 0.kohtien arvon ja piirretään funktion g ja sen derivaatan dg kuvaajat.