Simo K. Kivelä / 12.05.2003

Funktiot

In[1]:=

Remove["Global`*"]

•Valmiit funktiot

Mathematica tuntee melkoisen joukon valmiita funktioita:

In[2]:=

Log[1.5]

Out[2]=

0.4054651081081644`

In[3]:=

Plot[Erf[x], {x, -5, 5}]

[Graphics:HTMLFiles/luento5_5.gif]

Out[3]=

-Graphics -

In[4]:=

Expand[(x + y)^3]

Out[4]=

x^3 + 3 x^2 y + 3 x y^2 + y^3

In[5]:=

TrigExpand[Sin[x + y]]

Out[5]=

Cos[y] Sin[x] + Cos[x] Sin[y]

Nämä ovat joko tavallisia matemaattisia alkeisfunktioita (x^p, sin, cos, log, arctan, ...) , hieman vähemmän tunnettuja, ns. erikoisfunktiota (erf, Γ, ...) tai Mathematican komentoja, jotka myös voidaan ajatella funktioiksi (Plot, Expand, TrigExpand, ...).

•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 vain yhtäläisyysmerkki; näiden välillä on pieni ero). Oikealla puolella annetaan funktion lauseke, jossa muodolliset parametri esiintyvät, mutta jossa ei enää saa käyttää alaviivoja.

In[6]:=

f[x_] := Log[x] Sin[x]^2

In[7]:=

f[3]

Out[7]=

Log[3] Sin[3]^2

In[8]:=

f[3.]

Out[8]=

0.021878706270018075`

In[9]:=

f[a + b]

Out[9]=

Log[a + b] Sin[a + b]^2

In[10]:=

Plot[f[t], {t, 0, 10}]

[Graphics:HTMLFiles/luento5_20.gif]

Out[10]=

-Graphics -

In[11]:=

D[f[x], x]

Out[11]=

2 Cos[x] Log[x] Sin[x] + Sin[x]^2/x

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

In[12]:=

f '[x]

Out[12]=

2 Cos[x] Log[x] Sin[x] + Sin[x]^2/x

In[13]:=

f '[3]

Out[13]=

2 Cos[3] Log[3] Sin[3] + Sin[3]^2/3

In[14]:=

f ''[t]

Out[14]=

(4 Cos[t] Sin[t])/t - Sin[t]^2/t^2 + Log[t] (2 Cos[t]^2 - 2 Sin[t]^2)

Pilkkumerkintä soveltuu myös standardifunktioihin:

In[15]:=

Sin '[x]

Out[15]=

Cos[x]

In[16]:=

Sin ''[x]

Out[16]=

-Sin[x]

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

In[17]:=

g[x_, y_] := (1 + Sin[x]^2)/(2 + Exp[y])

In[18]:=

g[a, 5/7]

Out[18]=

(1 + Sin[a]^2)/(2 + e^(5/7))

In[19]:=

g[3.0, 0.01]

Out[19]=

0.3388364977527292`

Funktiot voidaan myös määritellä paloittain:

In[20]:=

h[x_ /; x > 0] := Exp[x]

In[21]:=

h[x_ /; x < 0] := Sin[5 x]

In[22]:=

h[0] = 2

Out[22]=

2

In[23]:=

Plot[h[x], {x, -2, 2}]

[Graphics:HTMLFiles/luento5_44.gif]

Out[23]=

-Graphics -

In[24]:=

Table[h[x], {x, -2, 2, 1/2}]

Out[24]=

{-Sin[10], -Sin[15/2], -Sin[5], -Sin[5/2], 2, e^(1/2), e, e^(3/2), e^2}

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

In[25]:=

ff = Function[t, Log[t] Sin[t]^2]

Out[25]=

Function[t, Log[t] Sin[t]^2]

Tämä on sama kuin aluksi määritelty funktio f:

In[26]:=

f[u] == ff[u]

Out[26]=

True

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

In[27]:=

gg = Function[{x, y, n}, Table[x^k y^(n - k), {k, 0, n}]]

Out[27]=

Function[{x, y, n}, Table[x^k y^(n - k), {k, 0, n}]]

In[28]:=

gg[u, v, 5]

Out[28]=

{v^5, u v^4, u^2 v^3, u^3 v^2, u^4 v, u^5}

•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]:=

a[0] = 1

Out[29]=

1

In[30]:=

a[1] = 1

Out[30]=

1

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

In[31]:=

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

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

In[32]:=

? a

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]:=

Table[a[k], {k, 0, 25}]

Out[33]=

{1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393}

Sam määrittely voidaan antaa se hieman erilaisessa muodossa, jolloin laskenta nopeutuu oleellisesti. Mistä oikeastaan on kysymys, jääköön ohjelmointihenkisten pohdittavaksi.

In[34]:=

b[0] = 1

Out[34]=

1

In[35]:=

b[1] = 1

Out[35]=

1

In[36]:=

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

In[37]:=

? b

Global`b

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

Laskentanopeudessa on todellakin huomattava ero:

In[38]:=

Timing[a[30]]

Out[38]=

{10.781999999999996` Second, 1346269}

In[39]:=

Timing[b[30]]

Out[39]=

{0.` Second, 1346269}

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


Converted by Mathematica  (May 14, 2003)