7predavanje_1.gif

7. predavanje

7predavanje_2.gif    |    7predavanje_3.gif

Proceduralno programiranje - funkcionalno programiranje

Proceduralno programiranje: prati se transformacija podataka od ulaznih podataka do konačnog rezultata.
Funkcionalno programiranje: transformiraju se funkcije tako da transformirane funkcije od polaznih podataka daju konačan rezultat.

7predavanje_4.gif    |    7predavanje_5.gif

U programu Mathematica  "sve je funkcija"

Naredba FullForm ; Head izraza i elementi izraza

Mathematica svaki izraz koji korisnik napiše preformulira u funkcijski izraz tj. sve se prikazuje kao funkcija. Interni prikaz izraza možemo vidjeti pomoću funkcije FullForm.

7predavanje_6.gif

Plus se zove Head izraza (glavni dio izraza), dok su a i b elementi izraza.

7predavanje_7.gif

7predavanje_8.gif

Times se zove Head (glavni dio) izraza dok su x i y elementi izraza.

7predavanje_9.gif

7predavanje_10.gif

List se zove Head izraza dok su 1 ,  a,  6 i Sin[5] elementi izraza.

7predavanje_11.gif

7predavanje_12.gif

7predavanje_13.gif

7predavanje_14.gif

Osnovni elementi funkcionalnog programiranja

Budući svaki izraz Mathematica interno prikazuje kao funkciju koja ima svoje glavni dio (Head) i svoje elemente to je jasno da su osnovne opreacije nad takvim izrazom one koje

mijenjaju glavni dio  izraza - funkcija Apply

mijenjaju elemente izraza - funkcija Map

7predavanje_15.gif    |    7predavanje_16.gif

Promjena glavnog dijela izraza (promjena Head-a)

Sintaksa i semantika

Glavni dio izraza mijenjamo funkcijom Apply. Sintaksa je
            Apply[f, izraz]
a rezultat je novi izraz kojem je glavni dio zamijenjen s f.  
Drugi način pisanja je:
             f @@  izraz

Primjeri

7predavanje_17.gif

7predavanje_18.gif

7predavanje_19.gif

7predavanje_20.gif

Zbrajanje i množenje članova liste

7predavanje_21.gif

7predavanje_22.gif

7predavanje_23.gif

Apply s argumentom Plus se može primjeniti na bilo koji Head:

7predavanje_24.gif

7predavanje_25.gif    |    7predavanje_26.gif

Promijena elemenata izraza

Sintaksa i semantika

Elemente izraza mijenjamo funkcijom Map. Važno: Head izraza se ne mijenja. Način upotrebe je
                 Map[f, izraz]
Rezultat je novi izraz koji ima isti glavni dio kao i polazni i na sve elemente je primjenjena funkcija f.
Drugi način pisanja je:
             f /@  izraz

Primjer

7predavanje_27.gif

7predavanje_28.gif

Primjer

Odredite duljinu svake od podlista liste {{1,2},{3,4,5},{6,7,8,9}}.

Upotrijebiti ćemo funkciju Length[lista] koja vraća duljinu liste. Točnije, funkcija Length[izraz] vraća broj elementa izraza na koji je primjenjena.

7predavanje_29.gif

7predavanje_30.gif    |    7predavanje_31.gif

Anonimne funkcije (anonymous functions)

Anonimne funkcije se obično definiraja onda kada nam treba funkcija koju ćemo koristiti u tom trenutku i neće nam trebati kasnije.

Ne zadaje se ime takve funkcije.

Funkcija se zadaje samo formulom (bez imena).

Ako se radi o funkciji jedne varijable tada ta varijabla obavezno ima ime #.   Ukoliko se radi o funkcije više varijabli te varijable se zovu #1, #2, #3,...

Kraj formule se, obavezno, označava znakom &.

Primjeri anonimnih fukcija

Uobičajna definicija funkcije koja kvadrira svoj argument je

7predavanje_32.gif

i koristimo je na uobičajan način:

7predavanje_33.gif

Ista funkcija definirana kao anonymous function je (na navodi se ime samo formula) je izraz

7predavanje_34.gif

a upotrebljava se ovako

7predavanje_35.gif

Daljnji primjeri anonymous functions

Funkcija  7predavanje_36.gif primjenjena na argument 2:

7predavanje_37.gif

Funkcija Cos(2x+π) primjenjena na argument  1.2:

7predavanje_38.gif

Funkcija 7predavanje_39.gif primjenjena na točku domene (2.1; 3.4):

7predavanje_40.gif

7predavanje_41.gif    |    7predavanje_42.gif

Daljnji primjeri djelovanja na elemente izraza

Primjer

Zadana je lista listi {{0,1,2},{3,4,5},{6,7,8,9}}. Izdvojite druge elemente svake od podlisti.

Kao što je poznato i-ti element liste dobije se pomoću lista[[i]].

7predavanje_43.gif

Primjer

Dodajte nulu na kraj svake od podlisti liste {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}.  
Dodajte nulu na početak svake od podlisti.

Koristiti ćemo funkciju Append[lista, element] koja element dodaje na kraj liste i funkciju Prepend[lista, element] koja element dodaje na početak liste.

7predavanje_44.gif

Primjer

Dodajte nulu na početak i na kraj svako od podlisti liste {{1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11, 12}}.

7predavanje_45.gif

7predavanje_46.gif    |    7predavanje_47.gif

Kombiniranje Apply i Map

Primjer

Napišite izraz koji će davati srednju vrijednost svakog retka matrice.

Za ilustraciju ćemo koristiti slučajnu matricu tipa (5, 5) generiranu od brojeva 0 i 1 te ćemo izračunati srednju vrijednost svakog retka.

7predavanje_48.gif

Primjer

Za podatke u listi {3.1, 4.2,  5.6, 4.1, 6.7} odredite srednju vrijednost i standardnu devijaciju podataka.

Znamo: srednja vrijednost je 7predavanje_49.gif7predavanje_50.gif a standardna devijacija je 7predavanje_51.gif=7predavanje_52.gif

7predavanje_53.gif

7predavanje_54.gif    |    7predavanje_55.gif

Iteracije, funkcija Nest

Funkcija Nest

Nest[f, izraz, n]
     funkcija f se primjeni na zadani izraz n puta.

Primjeri

7predavanje_56.gif

7predavanje_57.gif

Funkcija Framed[izraz] vraća uokvireni izraz.

7predavanje_58.gif

7predavanje_59.gif

U slijedećim primjerima ćemo koristiti činjenicu (bez dokaza) da niz
              7predavanje_60.gif
konvergira prema 7predavanje_61.gif za razumno odabrani 7predavanje_62.gif (Newton).

Koliki je  7predavanje_63.gif

7predavanje_64.gif

7predavanje_65.gif

Usporedimo rezultate iteracije s "točnom" vrijednošću.

7predavanje_66.gif

7predavanje_67.gif

7predavanje_68.gif

Koliko je  7predavanje_69.gif  

7predavanje_70.gif

Funkcija NestList

NestList[f, izraz, n]
     daje listu rezultata kada se funkcija f primjeni na zadani izraz od 0 do n puta. Drugim riječima              dobijemo sve međurezulate funkcije Nest.

Primjeri

7predavanje_71.gif

7predavanje_72.gif

7predavanje_73.gif

7predavanje_74.gif    |    7predavanje_75.gif

Usporedba brzine izvođenja proceduralno i funkcionalno napisanog programa

Brzina izvođenja proceduralnog programa je znatno manja nego brzina ekvivalentnog funkcionalnog programa.

Primjer

Zadatak: provedimo 1,000,000 iteracija po slijedećoj formuli
           7predavanje_76.gif
proceduralno i funkcionalno i izmjerimo vrijeme izvođenja funkcijom Timing.

Funkcija Timing vraća listu od dva člana; prvi je izmjereno vrijeme a drugi je dobiveni rezultat.

7predavanje_77.gif

7predavanje_78.gif

7predavanje_79.gif

U ovom primjeru je proceduralno napisan program sporiji približno 15 puta.

Primjer

Zadatak: Od poznate lista realnih brojeva treba dobiti umnožak sinusa elemenata liste.
Za ilustraciju postupka listu ćemo dobiti tako da 300 000 puta generiramo slučajan broj.

In[5]:=

7predavanje_80.gif

In[7]:=

7predavanje_81.gif

In[8]:=

7predavanje_82.gif

In[9]:=

7predavanje_83.gif

Out[9]=

7predavanje_84.gif

U ovom primjeru je proceduralno napisan program sporiji približno 8 puta.

7predavanje_85.gif    |    7predavanje_86.gif

Spikey Created with Wolfram Mathematica 7.0