sunnuntai 4. lokakuuta 2015

Taustaa, Matlab-perusteita

Viimeksi kuluneiden runsaan 30:n vuoden kuluessa yhtenä intohimonani on ollut matemaattisten ohjelmistojen ja korkean tason kielien tarjoamien mahdollisuuksien kokeilu ja kehittäminen matematiikan opetuksessa ja tutkimuksessa. Nykyisin aihe on taas erityisen ajankohtainen etenkin koulumaailmassa, jossa ohjelmointia ollaan kovalla ryminällä tuomassa opetukseen mukaan.

Tässä "Mattie-esittelyä" varten tekemäni kooste.

Siinä palautetaan mieleen symbolilaskennan ja numeeristen ohjelmistojen historiaa, ja mukana on laaja linkkilista omiin kursimateriaaleihini vuosien varrelta.

Nostan tässä aikajanani alkupisteeksi esiin kauan ennen Internet-aikoja Helsingin yliopiston matematiikan laitoksella aloittamaamme seminaariin liittyvän näytteen, joka toimitettiin  tuonaikaisella viestintäohjelmalla nimeltään Portacom.

                                 https://math.aalto.fi/opetus/Mattie/Blogi/HYseminaari83-84.pdf

Aloitan nyt taas Matlab:sta, samasta ohjelmasta, josta silloin  syksyllä 1983 niinikään aloitettiin!! Toden totta, näissä IT-alan  myrskyissä on jotain näin pysyvää. Toki ohjelmassa on tapahtunut valtavasti kehitystä noista alkuajoista, mutta perusrakenteet ja ajattelutapa ovat samat kuin silloin.  Matlab on tänään mitä ajankohtaisin matemaattinen ohjelma ja korkean tason ohjelmointikieli, jolla on erittäin laaja käyttäjäkunta.

Toinen pääkohde on symbolilaskentaohjelma Maple. Maplen kanssa tasavertainen ohjelma on Mathematica, jonka käsittelyn jätän mahdollisten muiden blogikirjotteluuni osallistuvien henkilöiden varaan. "Vierailukirjoittajiksi" ovat alustavasti lupautuneet ainakin Aalto-yliopiston yhteistyökumppanini Juha Kuortti ja Pekka Alestalo .

Eräs intohimoni on näiden vuosien aikana ollut numeerisen korkean tason kielen (kuten Matlab, APL) ja symbolilaskentakielen sopiva yhdistäminen ongelmia ratkottaessa.  Tähän on nyt erillisten ohjelmien "seurustelun" lisäksi tarjolla Matlab:n "symbolic toolbox", jota ohjelman valmistaja Mathworks on viime vuosina tuntuvasti kehittänyt. Mainittu intohimo näkyy "Symbolinen ja numeerinen laskenta"-nimisinä erikoiskursseina, joiden materiaaleihin on linkkejä yllä. Tämä on yksi "toolbox", jota takuuvarmasti tullaan käsittelemään blogeissamme.


Mattie - matematiikkaa tietokoneella 

https://math.aalto.fi/opetus/Mattie/ 

 

Jarmo Malisen aloitteesta ryhdyimme Eerikki Lehtisen ja Juha Kuortin kanssa rakentamaan Aalto yliopiston matematiikan laitoksella tehtäväportaalia, johon oli määrä kerätä ja edelleen kehittää tehtäviä, ohjeita, opetusmateriaalia, ratkaisuja ym. matematiikan tietokoneharjoitusten tarpeisiin ennen kaikkea sen materiaalin pohjalta, jota oli tällaisia kokeiluja harrastaneiden opettajien toimesta kehittynyt. Simo Kivelältä saatiin alkajaisiksi huomattava määrä käyttövalmiita Mathematica-tehtäviä. Jatkossa painopiste on ollut Matlab- ja Maple-tehtävillä, koska näihin liittyvää materiaalia on itselleni  kertynyt eniten.

Teknisestä toteutuksesta tässä senverran, että tehtävien näkyvillä oleva lähdekoodi on $\LaTeX$:ia, opettaja voi ottaa suoraan tehtävän, ja muokata sitä tarpeen mukaan. Tehtäviä voi selata html-sivulla, jossa matemaattiset kaavat näytetään MathJax:llä: https://www.mathjax.org/ , aivan kuten tässäkin blogissa teemme. (Edellyttää parin "loitsun" kirjoittamista blogin html-koodin alkuun.)


Näytteeksi vaikka eksponenttifunktion sarjakehitelmä:

$$ e^x = \sum_{k=0}^\infty \frac{x^k}{k!}= 1+x + \frac{x^2}{2!} + \ldots $$

Matkan varrella on syntynyt lukuisa määrä oppimateriaalia, kuten Maple-oppikirja, monia Matlab-verkkomateriaaleja, ohjelmistoja hyödyntävää luentomateriaalia, hienoja oppilastöitä niin peruskursseihin kuin erikoiskursseihin liittyen.
Näitä nostamme esiin tämän alkavan "blogimatkan" varrella, "jalostamme" sekä ajanmukaistamme. Samalla täydennämme MattieT - osiota uusilla tehtävillä. Joukkoon sijoitamme myös ns. demotehtäviä, joiden ratkaisut näkyvät kaikille, korjaamme virheitä, ja pyrimme parantamaan käytettävyyttä palautteen mukaan.

Tätä kirjoittaessa syntyi ajatus luokitella tehtäviä myös sen mukaan, soveltuuko tämä matematiikan tason perusteella koulumaailmaan. Niinpä osassa tehtäviä kuvaavaa luetteloa on attribuutti: "KOULU":
https://math.aalto.fi/opetus/Mattie/MattieT/html/contentsmlBasic.html
Näitä tulee eri aihepiirien sisällysluetteloihin, kunhan ehtii.

Blogin pyrkimyksiä 

 

Blogi voisi toimia myös eräänlaisena etäopiskelukurssina täydentäen ja laajentaen edellä mainittuja lyhytkursseja, joissa jouduimme ajoittain juoksemaan asioita läpi liian vauhdikkaasti vähäisen tuntimäärän vuoksi.
Pyrimme myös tarjoamaan yhtä näkökulmaa koulujen koodausbuumiin esittelemällä ohjelmoinnin ja matematiikan rinnakkaiseloa tehtävillä, joissa koulumatematiikan pohja riittää. 

Aloitamme alkeista, annamme runsaasti viitteitä omatoimiseen opiskeluun, sekä tehtäväehdotelmia, joiden ratkaisut laitamme aikanaan näkyville.

Blogi ei pyri olemaan johdonmukainen opasmateriaali, saatamme hyppiä aiheesta, vaikeusasteesta ja ohjelmasta toiseen. Pyrkimys on joka tapauksessa myös ohjata itseopiskelun polulla. Toisaalta tyypillisiä kirjoituksia voivat olla jotkut kekseliäät ratkaisut, ajattelutavat, tekniset ratkaisut,  ohjelmistojen uudet piirteet, "toolboxit", ohjelmisovalmistajien omista blogeista esiin nostetut ideat, uusien ohjelmistoversioiden tarjoamat tekniikat, mahdollisuudet ovat miltei rajattomat.

Osa blogiteksteistä on tarkoitus kirjoittaa englanniksi, aluksi ainakin niin, että ensin suomeksi, ja sitten sama tai vastaava käännettynä englanniksi, katsotaan, mihin kaikkeen resurssit riittävät.


Matlab:n perusteita, osa 1

 

Miten pääsen ohjelman ääreen


Aalto-yliopistossa sekä henkilökunta että oppilaat saavat Matlab:n omalle koneelleen ohjelmistojakelusta. Opiskelijoille ja oppilaitoksille on saatavissa/neuvoteltavissa edullisia lisenssejä. Sama pätee muihinkin tässä blogissa käsiteltävin ohjelmiin.

Lisäksi  saatavilla on  ilmaiset "kloonit", jotka voi ladata linkeistä

https://math.aalto.fi/opetus/Mattie/MattieO/octave.html
https://math.aalto.fi/opetus/Mattie/MattieO/scilab.html


Matlabin hieno editori julkaisuominaisuuksineen, monet toolboxit, ym. eivät ole näillä klooneilla käytettävissä, mutta huomattava määrä Matlab-työskentelyn perusteista toimii samalla tavoin, joten opetteluun ne sopivat vallan hyvin.

Mistä aloitan


 MattieO:n Matlab-sivulla on kattava kokoelma viitteitä

https://math.aalto.fi/opetus/Mattie/MattieO/matlab.html 

Erittäin suositeltava suomenkielinen opas on Timo Mäkelän
https://sites.google.com/site/laskenta/matlab 
(Samalta tekijältä on myös hyvä Maple-opas.)

Itselläni on erinäisiä html-tekstejä, ne ovat sikäli käteviä tässä yhteydessä, että voin antaa täsmälinkkejä haluamiini kohtiin ja työstää tekstejä lennossa paremmiksi (tai huonommiksi) .
https://math.aalto.fi/~apiola/matlab/opas/mini/Index.html
https://math.aalto.fi/~apiola/matlab/opas/lyhyt/
https://math.aalto.fi/~apiola/matlab/opas/mini/tutoriaali.html


Jos pidät video-opetuksesta, voit kokeilla videotutoriaaleja sivulta:
http://se.mathworks.com/academia/student_center/tutorials/launchpad.html
Suositeltavia tässä vaiheessa: (1) Getting started, (2) Writing a Matlab program
Parasta tietysti jälleen, jos Matlab/Octave on samalla auki. Muita videoita ja koodiesimerkkejä on samalla sivulla.

Videoita löytyy Google-haulla suoraan Youtubesta. Seuraavassa on samoja asioita työskentelytyylistä ja  m-tiedostoista (skriptit ja funktiot) hiukan eri esimerkein.
https://www.youtube.com/watch?v=NPd13u4i6fM

Eräs tapa aloittaa, on käydä läpi kevään 2014 kurssille tekemäni ensimmäisen luennon (Beamer)kalvot:

https://math.aalto.fi/opetus/MatOhjelmistot/2014kevat/L/MatlabPerusteet1.pdf

Niissä on mukana myös relevantteja linkkejä.

Lyhyen pohjatiedon hankkimisen jälkeen, vaikkapa viimemainittujen luentokalvojen tai joidenkin muiden yllä olevien viitteiden  perusteella voit käydä esimerkkeihin käsiksi. Parasta on tietenkin jälleen, jos käsillä on Matlab tai Octave (tai Scilab), jolloin voit tehdä sopivia omia muunnelmia.
Matlab-komennot on talletettu tekstitiedostoon, ns. m-tiedostoon, tässä tapauksessa https://math.aalto.fi/opetus/Mattie/Blogi/Matlab/ExpTaylor.m
Tämä tiedosto on ajettu Matlab:n publish-komennolla (klikkauksella) tiedostoksi
https://math.aalto.fi/opetus/Mattie/Blogi/Matlab/html/ExpTaylor.html , 
joka samalla näyttää, miten Matlab-työstä saa kauniin html-dokumentin kuvineen. Poimin komennot kuvineen tähän suoraankin, ettei jää pelkän klikkailun varaan. Tämä on samalla blogialustan käyttökokeilua, miten Matlab-julkaisuvälineet ja blogialusta saataisiin parhaiten yhteistyöhön.
Sopivia komentokokonaisuuksia voit suoraan kopioida ("copy/paste") ohjelman komentoikkunaan tai omaan m-tiedostoosi.

Esimerkki 1

Exponenttifunktion Taylorin polynomeja


Matlabin publish-työkalun generoimassa (kauniimmassa) muodossa tässä: 
https://math.aalto.fi/opetus/Mattie/Blogi/Matlab/html/ExpTaylor.html

Kuten yllä jo muistutettiin, sarjakehitelmä on tällainen:

$$ e^x = \sum_{k=0}^\infty \frac{x^k}{k!} $$

Matlab-istunto:


close all                         % Suljetaan mahd. avoinna olevat
                                  % grafiikkaikkunat
x = [-2:.01:2];                   % Diskreetti x-akselin väli
y = exp(x);                       % exp-funktion arvot x-pisteissä

Lasketaan Taylorin polynomien arvoja x-pisteissä

p0 = ones(size(x));               % Ykkösistä koostuva vektori
p1 = p0 + x;                      % Lisätään x-vektori
p2 = p1 + (x.^2)/2;               % Seuraava termi, huomaa .^
p3 = p2 + (x.^3)/6;               %  Ja vielä yksi.

Piirretään kaikki samaan kuvaan

plot(x,y)
hold on                    % Seuraavat samaan kuvaan pyyhkimättä vanhaa.
plot(x,p0)
plot(x,p1)
plot(x,p2)
plot(x,p3)
grid on
legend('e^x','p0','p1','p2','p3','Location','NW')  % NW=North West
shg  % "Show Graphics" Ei välttämätön, mutta hyvä.

Entä, jos halutaan laskea ja piirtää korkeamman asteisia?

Otetaan käyttöön for-silmukka, tehdään alusta saakka:
p{1}=ones(size(x)); % Matlab ei salli 0-indeksiä. Huomaa aaltosulut {}.
                % p{k} voidaan ajatella indeksoituna (vektori)muuttujana.
N=10;           % Muuttele tarpeen mukaan
for k=1:N
    p{k+1}=p{k}+(x.^(k))/factorial(k);
end
%%
hold off   % Seuraavat piirtokomennot pyyhkivät edelliset piirrokset 
% Valitaan värit:  'r' = red, 'g'=green, 'k'=black 
plot(x,y,'r--',x,p{3},'g',x,p{5},'b',x,p{9},'k') % Parilliset polynomit
hold on    % Pidetään edelliset
plot(x,y,'r--','LineWidth',2)  % Punainen, paksumpi katkoviiva, jotta
                               % erottuisi seuraavassa p{9}:n kuvaajasta.
grid on
title('e^x ja parillisia Taylorin polynomeja')
legend('e^x','T_2','T_4','T_8','Location','NW')
shg
 
 
 
 
% Zoomaamalla gragfiikkaikkunan suurennuslasilla, nähdään, missä vaiheessa
% T_8 :n (eli p{9}:n) ja exp(x):n kuvaajat erkanevat.
%

Approksimointivirhe

figure            % Avataan uusi grafiikkaikkuna.
plot(x,y-p{9})    % Piirretään erotus exp(x)-T8(x)
title('Virhe: e^x - T_8(x)')
grid on
shg

Ja lasketaan maksimivirhe:
maksvirhe=max(abs(y-p{9}))
%
maksvirhe =

    0.0018

Jospa nyt maltan lopettaa tällä kertaa tähän.

Lisää esimerkkejä ja tehtäväehdotuksia seuraavalla kerralla.