Simo K. Kivelä / 02.09.2010

Funktiot

In[1]:=

luento5_1.gif

Valmiit funktiot

Mathematica tuntee melkoisen joukon valmiita funktioita:

In[2]:=

luento5_2.gif

Out[2]=

luento5_3.gif

In[3]:=

luento5_4.gif

Out[3]=

luento5_5.gif

Nämä ovat joko tavallisia matemaattisia alkeisfunktioita (luento5_6.gif, sin, cos, log, arctan, ...) tai hieman vähemmän tunnettuja, ns. erikoisfunktiota (erf, Γ, Besselin funktiot, ...)

Mathematican komennot ovat myös luonteeltaan funktioita:

In[4]:=

luento5_7.gif

Out[4]=

luento5_8.gif

In[5]:=

luento5_9.gif

Out[5]=

luento5_10.gif

Käyttäjän määrittelemät funktiot

Käyttäjä voi itse määritellä Mathematicassa omat funktionsa, jotka määrittelyn jälkeen toimivat kuten mitkä tahansa valmiit funktiot. Määrittelyssä on vasemmalla funktion nimi, jossa muuttujien tulee olla ns. muodollisia parametreja. Näiden merkkinä on alaviiva. Tämän jälkeen on merkki := tai =. (Näiden välillä on pieni ero.) Oikealla puolella annetaan funktion lauseke, jossa muodolliset parametrit esiintyvät, mutta jossa ei enää saa käyttää alaviivoja.

In[6]:=

luento5_11.gif

Out[6]=

luento5_12.gif

In[7]:=

luento5_13.gif

Out[7]=

luento5_14.gif

In[8]:=

luento5_15.gif

Out[8]=

luento5_16.gif

In[9]:=

luento5_17.gif

Out[9]=

luento5_18.gif

In[10]:=

luento5_19.gif

Out[10]=

luento5_20.gif

Derivaatalle voidaan käyttää myös lyhyempää merkintää pilkuttamalla tavanomaiseen tapaan:

In[11]:=

luento5_21.gif

Out[11]=

luento5_22.gif

In[12]:=

luento5_23.gif

Out[12]=

luento5_24.gif

In[13]:=

luento5_25.gif

Out[13]=

luento5_26.gif

Pilkkumerkintä soveltuu myös standardifunktioihin:

In[14]:=

luento5_27.gif

Out[14]=

luento5_28.gif

In[15]:=

luento5_29.gif

Out[15]=

luento5_30.gif


Myös usean muuttujan funktioita voidaan määritellä:

In[16]:=

luento5_31.gif

In[17]:=

luento5_32.gif

Out[17]=

luento5_33.gif

Funktiot voidaan myös määritellä paloittain, jolloin argumenttiin liitetään ehto operaattorin /; (Condition) avulla:

In[18]:=

luento5_34.gif

Määrittelyt voidaan antaa yhdellä rivillä kuten edellä, mutta ne voidaan jakaa myös eri riveille.

In[19]:=

luento5_35.gif

Out[19]=

luento5_36.gif

In[20]:=

luento5_37.gif

Out[20]//TableForm=

-1 -Sin[5]
luento5_38.gif luento5_39.gif
0 2
luento5_40.gif luento5_41.gif
1 e

Vaihtoehtoinen tapa funktion määrittelemiseen on funktion Function käyttö:

In[21]:=

luento5_42.gif

Out[21]=

luento5_43.gif

In[22]:=

luento5_44.gif

Out[22]=

luento5_45.gif

Myös usean muuttujan funktiot ovat mahdollisia eikä arvojenkaan tarvitse olla lukuja:

In[23]:=

luento5_46.gif

Out[23]=

luento5_47.gif

In[24]:=

luento5_48.gif

Out[24]=

luento5_49.gif

Funktiomäärittelylle on lyhyempikin tapa, joka on käyttökelpoinen varsinkin ohjelmakoodia kirjoitettaessa: muuttuja merkitään symbolilla # (tai usean muuttujan tapauksessa #1, #2, ...) ja määrittely päätetään merkkiin &. Esimerkiksi:

In[25]:=

luento5_50.gif

Out[25]=

luento5_51.gif

In[26]:=

luento5_52.gif

Out[26]=

luento5_53.gif

In[27]:=

luento5_54.gif

Out[27]=

luento5_55.gif

In[28]:=

luento5_56.gif

Out[28]=

luento5_57.gif

Rekursiiviset määrittelyt

Funktiomäärittelyt voivat olla myös rekursiivisia. Esimerkiksi Fibonacci'n luvut voidaan määritellä seuraavasti.

Aluksi määritellään kaksi alkuarvoa

In[29]:=

luento5_58.gif

Out[29]=

luento5_59.gif

In[30]:=

luento5_60.gif

Out[30]=

luento5_61.gif

ja tämän jälkeen rekursiivisesti loput, ts. ilmoitetaan, että seuraava on aina kahden edellisen summa:

In[31]:=

luento5_62.gif

Kysymysmerkillä voidaan katsoa, millainen määrittely funktiolle a on tallentunut:

In[32]:=

luento5_63.gif

Global`a

a[0]=1
a[1]=1
a[n_]:=a[n-1]+a[n-2]

Määritelmän perusteella voidaan laskea lista Fibonacci'n lukuja:

In[33]:=

luento5_64.gif

Out[33]=

luento5_65.gif

Sama määrittely voidaan antaa hieman erilaisessa muodossa, jolloin laskenta nopeutuu oleellisesti. Tämän valossa voi pohtia operaattoreiden := ja = välistä eroa. Näillä kuten kaikilla Mathematican symboleilla on myös nimet: Set ja SetDelayed.

In[34]:=

luento5_66.gif

In[35]:=

luento5_67.gif

Global`b

b[0]=1
b[1]=1
b[n_]:=b[n]=b[n-1]+b[n-2]

Laskentanopeudessa on todellakin huomattava ero:

In[36]:=

luento5_68.gif

Out[36]=

luento5_69.gif

In[37]:=

luento5_70.gif

Out[37]=

luento5_71.gif

Funktio Timing antaa paitsi tuloksen myös sen laskemiseen käytetyn ajan.

Spikey Created with Wolfram Mathematica 7.0