TE^AJ IZ MATHEMATICE

2. DEL

Bor Plestenjak

Definiranje lastnih funkcij

Poleg vgrajenih funkcij nam MMA omogo~a tudi definiranje novih funkcij in spremenljivk, ki se za uporabnika prav ni~ ne razlikujejo od `e vgrajenih.

Spremenljivke

Spremenljivkam podamo vrednost tako, da imenu spremenljvke dodamo = ali := in izraz, ki ga `elimo prirediti.

Spremenljivki a postavimo vrednost na 5.

a=5

Sedaj lahko izra~unamo izraz a+b+7. Ker spremenljivka b {e ne obstaja, MMA ra~una z njo kot s simbolom.

a+b+7

Funkcije

Za zgled definicije funkcije je najbolj{i kar zgled.

f[x_]:=x+3

Na zgornji na~in smo definirali funkcijo f, ki ima en argument. Argumente navedemo med oglatimi oklepaji in jih lo~imo z vejicami. Pod~rtaj pomeni, da je vrednost argumenta poljubna in da lahko v nadaljevanju definicije funkcije z njim ra~unamo kot s spremenljivko.

f[3]

?f

Funkija z istim imenom ima lahko razli~ne predpise, prav tako jo lahko definiramo za razli~no {tevil spremenljivk. Tako bomo definirali funkcijo f tudi kot funkcijo dveh spremenljivk.

f[x_,y_]:=x+y

f[4,5]

f[x_,1]:=0

f[3,1]

f[3,2]

?f

Funkcija f ima sedaj ve~ predpisov. Pri enem argumentu je to x+3, pri dveh je to vsota argumentov, razen v primeru, ko je drugi argument 1. Tedaj vrne 0. MMA si razli~ne predpise uredi v vrstni red, ki ga vidimo, ~e uporabimo ?. Ko funkcijo uporabimo, MMA od zgoraj preverja glave funkcij. Pri tem pod~rtaj pomeni, da tam lahko stoji karkoli ( {e vedno se mora ujemati {tevilo argumentov ), brez pod~rtaja pa, da mora tam stati prav ta izraz. MMA si definicije uredi tako, da bolj splo{ne definicije postavi na koneci.

Razlika med = in :=

Razlika med = in := je, da se pri prvem na~inu izraz na desni najprej izra~una in nato priredi, pri drugem na~inu pa se izraz na desni strani izra~una vsaki~, ko ga potrebujemo.

a=Random[]

b:=Random[]

Razlika je `e v tem, da se pri prvem na~inu po prirejanju izpi{e rezultat, pri drugem pa ne, saj izraza {e nismo uporabili.

{a,b,a,b}

Kot vidimo, dobimo za a vedno enak rezultat, vrednosti b pa se izra~unajo vsaki~ ob uporabi. Praviloma pri definiranju funkcij vedno uporabljamo :=.

Brisanje definicij

Clear[a,b,...]

Clear zbri{e definicije spremenljivk in funkcij z imeni a,b,.... Od sedaj naprej so to za MMA spet navadni simboli.

a

Clear[a]; a

Seznami

Uvod

Seznam v MMA je poljubno kon~no {tevilo izrazov, lo~enih z vejicami, ki jih na{tejemo med zavitimi oklepaji. Seznami so znotraj MMA predstavljeni z glavo List s poljubnim {tevilom argumentov. List lahko uporabljamo tudi kot funkcijo s poljubnih {tevilom argumentov, ki zgradi seznam iz svojih argumentov.

List[1,3,5]

Kot ka`e naslednji primer, so elementi seznama lahko poljubni izrazi, lahko so razli~nih tipov in prav tako so lahko spet seznami.

sez={1,"abc",Pi,7.17,{1,2,4}}

Osnovni ukazi za delo s seznami

Length[s]

Length vrne dol`ino seznama s.

Length[sez]

Part[s,i]

Part vrne i-ti element seznama s. Namesto tega lahko i-ti element dobimo tudi kot s[[i]].

Part[sez,3]

sez[[3]]

sez[[5,3]]

sez[[{1,3}]]

First[s]

First vrne prvi element seznama s.

First[sez]

Last[s]

Last vrne zadnji element seznama s.

Last[sez]

Rest[s]

Rest vrne seznam s brez prvega elementa.

Rest[sez]

Take[s,k]

Take vrne seznam prvih k elementov seznama s, ~e je k pozitiven, oziroma zadnjih k, ~e je k negativen.

Take[sez,2]

Take[sez,-2]

Drop[s,k]

Drop vrne seznam s brez prvih k elementov, ~e je k pozitiven, oziroma brez zadnjih k, ~e je k negativen.

Drop[sez,2]

Drop[sez,-2]

Reverse[s]

Reverse obrne seznam s.

Reverse[sez]

RotateLeft[s,k], RotateRight[s,k]

RotateLeft zasu~e seznam s za k mest v levo, RotateRight pa za k mest v desno.

RotateLeft[sez,2]

RotateRight[sez,2]

Permutations[s]

Permutations vrne seznam vseh permutacij seznama s.

Permutations[{1,2,3}]

Na~ini generiranja seznamov

Range[min,max,korak]

Range vrne aritmeti~no zaporedje {tevil s korakom korak, ki se za~ne z min, elementi pa so manj{i ali enaki max. Vsi argumenti niso potrebni, kar vidimo iz naslednjih primerov.

Range[10]

V primeru enega samega argumenta n dobimo kar seznam naravnih {tevil od 1 do n.

Range[5,10]

V primeru dveh argumentov min, max dobimo seznam naravnih {tevil med min in max.

Range[5,15,2]

Table[izr,{i,min,max,korak}]

Table tabelira izraz izr pri vrednostih iteratorja i. Argumenti min, max in korak imajo enak pomen kot pri ukazu Range in spet ni nujno pisati vseh argumentov, ~e to ni potrebno.

Table[Sin[i],{i,10}]

Table[i^2,{i,5,15,2}]

Tabeliramo lahko tudi funkcije ve~ spremenljivk. Tako dobimo sezname seznamov.

Table[i j,{i,5},{j,5}]

Array[f,dim]

Array sestavi tabelo vrednosti funkcije f razse`nosti dim. Dim je naravno {tevilo ali pa seznam naravnih {tevil. Funkcija f mora biti funkcija k spremenljivk, ~e je k dol`ina seznama dim ( 1, ~e dim ni seznam ).

Array[g,{3,3}]

^e definiramo svojo funkcijo za produkt dveh {tevil lahko predzadnjo tabelo zgeneriramo tudi z ukazom Array.

prod[x_,y_]:=x y
Array[prod,{5,5}]

Map[f,s]

Map je zelo mo~an in pomemben ukaz. Vrne seznam, kjer na vsakem elementu seznama s uporabi fukcijo z imenom f. Funkcija f mora biti funkcija ene spremenljivke.

Map[Sin,{1,3,7}]

Map[g,{3,4}]

Na~ini popravljanja in spreminjanja seznamov

Append[s,e], Prepend[s,e]

Append vrne seznam, kjer je seznamu s na koncu dodan element e. Prepend pa vrne seznam, kjer je seznamu s na za~etku dodan element e.

Append[sez,5]

Prepend[sez,3]

Join[s1,s2,...]

Join zdru`i dva ali ve~ seznamov tako, da vsakega naslednjega doda na konec `e zdru`enih prej{njih.

Join[Range[5],Range[3]]

Partition[s,vel,premik]

Partition razdeli seznam s na podsezname dol`ine vel z zamikom premik. ^e zamik ni podan, je kar enak velikosti podseznamov. Pri uporabi ukaza Partition se lahko v primeru da premik ni delitelj dol`ine seznama s zgodi, da dobljena particija ne vsebuje vseh elementov.

Partition[sez,2]

Ker ima seznam sez 5 elementov, v particiji ni zadnjega elementa.

s3=Partition[sez,2,1]

Flatten[s,k]

Flatten brez podanega k odstrani vse zavite oklepaje znotraj seznama. ^e pa podamo {e k, potem odstrani le k-nivojev oklepajev. To pomeni, da zbri{e le vse oklepaje, ki imajo globino manj{o ali enako k.

Flatten[s3]

Flatten[s3,1]

Sortiranje elementov v seznamu po klju~u

Sort[s,f]

Sort sortira elemente v seznamu s. Pri tem lahko kot argument podamo tudi ime funkcije f, ki predstavlja klju~ urejanja. Ta funkcija mora biti funkcija dveh spremenljivk. Vrne naj True, ~e naj bo prvi element pred drugim v urejeni tabeli in False sicer. ^e funkcije f ne podamo, Sort uredi elemente po velikosti od najmanj{ega proti najve~jemu.

s4={10,7,5,4,3,2,8,9,1,6};
Sort[s4]

Namesto po velikosti bomo sedaj elemente seznama s4 uredili po velikosti ostanka pri deljenju s 3 od najve~jega proti najmanj{emu.

vecji[x_,y_]:=Mod[x,3]>=Mod[y,3];
Sort[s4,vecji]

Izbiranje elementov seznama po klju~u

Select[s,f]

Select nam omogo~a, da iz seznama s izberemo tiste, ki ustrezajo dolo~enemu klju~u. Ta klju~ podamo kot ime funkcije f, ki mora biti funkcija ene spremenljivke. Vrne naj True, ~e element ustreza klju~u, sicer pa vrne 0.

Poiskali bomo tiste elemente prej{njega seznama, ki dajo pri deljenju s 3 ostanek 1.

izberi[x_]:=Mod[x,3]==1
Select[s4,izberi]

Vsota in produkt elementov v seznamu

Za izra~un vsote in produkta elementov v seznamu uporabimo funkcijo Apply, ki je sicer veliko mo~nej{a funkcija.

Apply[f,s]

Apply v seznamu s nadomesti glavo seznama (List) z f. V bistvu to pomeni, da izra~unamo s1*s2*s3*..*sk, ~e je * operacija, si pa so elementi seznama s. ^e za f vzamemo Plus (ne samo simbol + ), dobimo tako vsoto vseh elementov, ~e vzamemo Times pa produkt vseh elementov.

Apply[Plus,s4]

Apply[Times,s4]

Seznami kot mno`ice

^eprav je vrstni red elementov v seznamu pomemben, si lahko sezname predstavljamo tudi kot mno`ice. Tedaj seveda pozabimo na vrstni red elementov.

Union[s1,s2,...]

Union vrne unijo mno`ic s1,s2,.... Kot argument mu lahko podamo tudi en sam seznam. V tem primeru vrne seznam, kjer ni ve~ morebitnega podvajanja elementov.

s1={1,3,5,7};
s2={2,3,5,8};
Union[s1,s2]

Union[{1,2,3,1,2,3,4}]

Intersection[s1,s2]

Intersection vrne presek mno`ic s1,s2,....

Intersection[s1,s2]

Complement[s1,s2]

Complement vrne komplement mno`ic s1 in s2, torej vse elemente mno`ice s1, ki niso hkrati tudi elementi s2.

Complement[s2,s1]

Seznami kot vektorji

Sezname si lahko predstavljamo tudi kot n-dimenzionalne vektorje, kjer je n dol`ina seznama. Seveda potem elementi seznama ne smejo biti seznami, za ra~unanje z vektorji pa morajo imeti le-ti tudi enako dol`ino.

Produkt vektorja s skalarjem

Produkt vektorja s skalarjem izra~unamo tako, da seznam mno`imo s skalarjem.

x1={1,2,3};
y1={2,3,4};
5 x1

Vsota vektorjev

Vektorje se{tevamo tako, da se{tevamo sezname (vektorje).

x1+y1

Skalarni produkt

Za skalarni produkt dveh vektorjev imamo . (pika). ^e namre~ vektorja mno`imo z navadnim mno`enjem, dobimo vektor, katerega elementi so produkti istole`e~ih elementov.

x1 y1

x1.y1

Norma vektorja

Za normo (dol`ino) vektorja ne obstaja vgrajena funkcija. Vemo pa, da je kvadrat dol`ine enak skalarnemu produktu vektorja samega s sabo. Tako potem lahko izra~unamo dol`ino.

dolz=Sqrt[x1.x1]

Vektorski produkt

Vektorski produkt prav tako ni vgrajena funkcija, a se na sre~o nahaja v enem izmed {tevilnih paketov, ki jih dobimo zraven MMA. To pomeni, da moramo te funkcije najprej nalo`iti v spomin, ~e jih `elimo uporabljati.

V na{em primeru to naredimo z naslednjim ukazom.

<<Calculus`VectorAnalysis`

Sedaj imamo za izra~un vektorskega produkta na voljo operacijo CrossProduct.

CrossProduct[x1,y1]

vp=CrossProduct[{a1,a2,a3},{b1,b2,b3}]

ColumnForm

ColumnForm izpi{e vsak element seznama v svojo vrstico. V primeru vektorja tako dobimo pokon~ni izpis vektorja.

Na ta na~in lahko izpi{emo zadnji vektor, ki vsebuje formulo za vektorski produkt dveh vektorjev.

ColumnForm[vp]

VectorQ[s]

VectorQ vrne True, ~e je seznam s res vektor. To pomeni, da elementi seznama ne smejo biti seznami.

VectorQ[{1,2,3}]

VectorQ[{1,{2,3},3}]

VectorQ[x1]

Seznami kot matrike

S seznami lahko predstavljamo tudi matrike. Matrika je potem seznam, v katerem so vsi elementi vektorji enake dol`ine. Seveda to {e ni konec, seznami lahko predstavljajo tudi {e ve~ dimenzionalne matrike, t.i. tenzorje.

Matriko vnesemo kot seznam.

m1={{1,2},{3,4}}

Dimensions[m]

Dimensions vrne seznam dimenzij tenzorja m. V primeru matrike bo prvi element seznama {tevilo vrstic, drugi pa {tevilo stolpcev.

Dimensions[m1]

Elementi matrike

Do elementov matrike pridemo kot do elementov seznama, saj so matrike samo posebna vrsta seznamov. Prvi indeks vedno pomeni vrstico, drugi pa stolpec elementa, ki ga i{~emo. ^e damo samo en indeks, dobimo celo vrstico matrike.

m1[[2,1]]

m1[[2]]

MatrixForm[m]

Podobno kot ColumnForm je tudi MatrixForm posebna oblika izpisa matrike. V tem primeru se matrika m izpi{e v obliki matrike in ne seznama, kar je veliko bolj pregledno v primeru matrik manj{ih dimenzij.

m2={{1,-1},{3,-1}}

MatrixForm[m2]

Produkt matrike s skalarjem

Produkt matrike s skalarjem ra~unamo podobno kot produkt vektorja s skalarjem.

4 m1 // MatrixForm

Vsota matrik

Matrike se{tevamo podobno kot se{tevamo vektorje.

m1+m2 // MatrixForm

Produkt matrik

Tudi za produkt matrik uporabimo . in ne *. Pri matrikah je potrebno {e posebno paziti, saj pri vektorju v enem primeru dobimo skalar in v drugem vektor, v primeru matrik pa obakrat dobimo matriko in je te`je opaziti napako. Navadno mno`enje nam spet vrne le matriko s produkti istole`nih elementov.

m1.m2 // MatrixForm

m2*m2 // MatrixForm

Produkt matrike z vektorjem

Matriko z vektorjem mno`imo s . (pika).

m1.{a1,a2}

IdentityMatrix[n]

IdentityMatrix vrne matriko identitete dimenzije n.

IdentityMatrix[3] // MatrixForm

DiagonalMatrix[s]

DiagonalMatrix vrne matriko, ki ima na diagonali elemente vektorja s, ostali elementi pa so enaki 0.

DiagonalMatrix[{1,2,3}] // MatrixForm

Transpose[m]

Transpose vrne transponirano matriko m.

Transpose[m1] // MatrixForm

Det[m]

Det izra~una determinanto matrike m. Seveda mora biti matrika m kvadratna.

Det[m1]

Inverse[m]

Inverse izra~una inverzno matriko matrike m.

Inverse[m1]

LinearSolve[m,b]

LinearSolve poi{~e re{itev linarnega sistema z matriko m in vektorjem b.

b={1,2};
LinearSolve[m1,b]

NullSpace[m]

NullSpace poi{~e ni~elni prostor matrike m, to so vektorji, ki jih matrika m preslika v 0.

NullSpace[{{1,3},{0,0}}]

MatrixQ[s]

MatrixQ vrne True, ~e seznam s res predstavlja matriko.

t1=Table[i+j+k,{i,3},{j,3},{k,3}]

MatrixQ[t1]

MatrixQ[m1]

MatrixQ[x]

Zgledi ra~unanja z matrikami in vektorji

Naloga 1: Izra~unaj razdaljo med to~kama T1(1,2,3) in T2(-1,1,-3).

Razdalja med to~kama je enaka dol`ini vektorja razlik obeh krajevnih vektorjev to~k.

T1={1,2,3};
T2={-1,1,-3};
d=Sqrt[(T2-T1).(T2-T1)]

Naloga 2: Dolo~i ena~bo premice med to~kama T1(1,2,3) in T2(-1,2,-3).

Ena~bo premice zapi{emo v parametri~ni obliki.

premica=T1+t(T2-T1)

premica[[1]]

Naloga 3: Zapi{i ena~bo ravnine, ki gre skozi dane tri to~ke TA(1,-1,2), TB(-1,-1,4) in TC(0,1,0). Ena~bo zapi{i v parametri~ni in normalni obliki.

Pri parametri~ni obliki krajevni vektor to~ke na ravnini izrazimo s pomo~jo dveh vektorjev in to~ke na ravnini. Dva vektorja sta kar vektorja razlik krajevnih vektorjev to~k na ravnini.

TA={1,-1,2};
TB={-1,-1,4};
TC={0,1,0};
paroblika=TA+s(TB-TA)+t(TC-TA)

Pri normalni obliki moramo najprej izra~unati normalni vektor ravnine, to je vektor, ki je pravokoten na ravnino in ima dol`ino 1. Pravokotni vektor na ravnino dobimo z vektorskim produktom vektorjev na ravnini.

n=CrossProduct[TB-TA,TC-TA]

Vektor moramo {e normirati, potem pa lahko zapi{emo ena~bo ravnine v normalni obliki.

n=n/Sqrt[n.n]

noroblika=n.({x,y,z}-TA)==0

To obliko lahko {e poenostavimo.

Simplify[noroblika]

Naloga 4: Izra~unaj razdaljo to~ke TD(1,3,5) od prej{nje ravnine.

Razdaljo to~ke od ravnine dobimo tako, da to~ko vstavimo v ena~bo ravnine (normalna oblika).

TD={1,3,5};
raz=n.(TD-TA)

Naloga 5: Dolo~i prese~i{~e premice, dolo~ene s to~ko TD(1,0,1) in smernim vektorjem (1,1,1), s prej{njo ravnino.

Najprej zapi{emo ena~bo premice v parametri~ni obliki.

TD={1,0,1};
p={1,1,1};
enacbapremice=TD+u p

Prese~i{~e je to~ka, kjer se ujemata ena~ba premice in ravnine, re{iti moramo torej sistem, kjer izena~imo x,y in z komponento obeh ena~b. Namesto nas to naredi MMA, ki poi{~e vrednosti vseh parametrov to~ke v prese~i{~u.

Solve[enacbapremice==paroblika]

To~ko sedaj dobimo tako, da v ena~bo premice vsavimo dobljeno vrednost parametra u.

enacbapremice /. u-> -(1/7)