Prvi koraki v Mathematici

Andrej Bauer

Kaj je Mathematica

Mathematica je sistem za numerično in simbolno računanje. Mathematico je zasnoval Stephen Wolfram, danes pa jo razvija in prodaja njegovo podjetje Wolfram Research iz ZDA.

Mathematico si lahko predstavljamo kot zelo napreden kalkulator. Z njo lahko računamo:

2+2

6^200

6^6000

Mathematica zna računati z natančnimi števili, se pravi, da ne zaokroži rezultatov, razen če to zahteva uporabnik s funkcijo N:

Sin[Pi/5]

Sin[Pi/3]

N[Sin[Pi/5]]

N[Sin[Pi/5],1000]

Mathematica zna računati s simboli in ne samo s števili:

x + y + 2*x - 2*y + 3*x

(((2*x+y-3*x))^6)

Factor[(((x+(y^2)))^6)+(((x (y^2)))^6)]

Factor[(x^6)+(y^6)]

Simplify[Cos[4x]Cos[2x] Cos[x]  Sin[x]]

Vendar zna Mathematica še veliko več. Na primer, računa odvode, integrale, lastne vrednosti, rešuje enačbe, riše grafe itn.:

D[f[x]*g[x], x]

D[((Sin[x])^2)*Exp[x], x]

Integrate[x^2 Sin[x], x]

Integrate[x^2 Sin[x], {x,0,Pi/6}]

Eigenvalues[(({{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}))]

Solve[x^2 == x + 1, x]

Solve[Sin[2*x]==Cos[x],x]

Plot[Sin[x^3]/(1 + x^2), {x, -5, 5}, PlotRange->All]

Plot[(x^2)-3*x+6,{x,1,2}]

Plot3D[((Cos[(Sqrt[(x^2)+(y^2)])])/(Log[2+(x^2)+(y^2)])),{x,-15,15},{y,-15,15}]

FinancialData["EUR/USD", "2000-01-01"]

DateListPlot[FinancialData["EUR/USD", "2000-01-01"]]

DateListPlot[FinancialData["AAPL", "2015-01-01"]]

Mathematica je močno orodje, ki ga lahko študentje  s pridom uporabljajo pri svojem študiju, če se le potrudijo in se naučijo, kako sistem deluje in kako se ga uporablja.

N[Pi,20000]

Frontend in kernel

Mathematica je sestavljena iz dveh delov. Prvi je frontend, to je uporabniški vmesnik, v katerem urejamo dokumente, ki vsebujejo račune, besedilo in grafiko. Frontend ničesar ne računa sam, ampak samo skrbi za prikaz dokumentov in rezultatov računanja. Vse računanje opravi drugi del Mathematice, ki se imenuje kernel.

Dokumenti, ki jih pišemo s frontendom, se imenujejo zvezki (notebooks) in imajo končnico .nb. Zvezek sestoji iz celic. Vsaka celica je označena z modrim "oklepajem" na desni strani zvezka. Kot vidimo, so nekatere celice vsebovane v drugih. Več o zvezkih bomo povedali v naslednjem razdelku, zaenkrat le povejmo, da poznamo več vrst celic, od katerih so najpomembnejše tri:

tekstovne celice, v katere pišemo besedilo

vhodne celice, v katere pišemo račune in ukaze, ki jih frontend posreduje kernelu

izhodne celice, izhodne celice, ki prikazujejo rezultate, ki jih je izračunal kernel

Kakšne so ostale vrste celic si lahko ogledamo v meniju "Format:Style".

Računanje v Mathematici je v osnovi zelo preprosto:

1. Uporabnik v vhodno celico vpiše račun ali kak drug ukaz in pritisne Shift+Enter.

2. Frontend račun ali ukaz posreduje kernelu.

3. Kernel izračuna rezultat in ga posreduje frontendu.

4. Frontend rezultat vstavi v izhodno celico.

Vhodne in izhodne celice so oštevilčene, da vemo, katera vhodna celica pripada kateri izhodni celici. Vrstni red računov je razviden iz zaporednih številk vhodnih in izhodnih celic in je neodvisen od tega, kako se celice razporejene v zvezku (to pogosto povzroča tezave začetnikom). Primer:

2+3

10+x+x

To celico izračunamo kasneje:

2/3 + 1/7

Najprej izračunamo to celico:

Factor[x^12 - y^12]

a=5

a+10

a=6

b=5

b+10

b=6

While[True,2]

2+2

Včasih kernel zelo dolgo računa, ne da bi vrnil rezultat. V tem primeru lahko račun prekinemo z ukazom z menija "Kernel:Abort Evaluation". Če pa tudi to ne zaleže, si pomagamo s ukazom z menija "Kernel:Quit kernel:local", ki kernel popolnoma prekine. V tem primeru seveda izgubimo vse definicije, ki so bile shranjene v kernelu. Ne izgubimo pa računov, ki so ze shranjeni v zvezku. Primer:

Definiramo spremenljivko a. Kernel vrne njeno vrednost:

a = (∑_(k=1)^∞)(1/(k^2))

Kernel zdaj pozna vrednost spremenljivke a:

(a + 1)^2

Če kernel prekinemo, potem se ob naslednjem računu zazene nov kernel, ki ne pozna več definicije spremenljivke a:

(a + 1)^2

Opazimo tudi, da novi kernel šteje vhodne in izhodne celice začenši z 1.

Definicijo vrednosti zbrišemo z ukazom ClearAll:

ClearAll[a]

Zvezki (notebooks)

Omenili smo že, da zvezek sestoji iz celic. Celice so označene z modrimi oklepaji na desni strani dokumenta. Kot vidimo, so nekatere celice vsebovane v drugih. S tem je zvezek razporejen na posamezno enote. Če dvakrat kliknemo na oklepaj kake skupinske celice, se celica zapre. Ko dvakrat kliknemo na zaprto celico, se ta odpre. Zaprte celice so označene z majnim modrim trikotnikom na dnu modrega oklepaja.

Zapiranje in odpiranje celic je uporabno, saj lahko celice, ki nas ne zanimajo zapremo. Pogosto se zgodi, da kernel vrne zelo dolg rezultat. Če ga ne želimo gledati, zapremo celico, ki vsebuje rezultat:

Expand[(x + y)^100]

Novo celico naredimo tako, da kliknemo v prostor med dvema celicama ali za zadnjo celico. Pojavi se vodoravna črta, ki kaze, kje se bo naredila nova celica. Ko začnemo tipkati, se naredi vhodna celica. Vsebino vhodne celice posredujemo kernelu v izračun tako, da pritisnemo Shift+Enter. Če želimo narediti tekstovno celico ali celico kake druge vrste (naslov, podnaslov, ipd.), si njen tip izberemo z menija "Format:Style" preden začnemo tipkati. Stil obstoječe celice lahko spremenimo tako, da izberemo njen modri oklepaj in spremenimo stil z menija "Format:Style".

2+2+2

To je vhodna celica.

To je še ena vhodna celica. Spremenimo jo v tekstovno celico.

V zvezek vnašamo matematične izraze s tipkovnice ali posebnih palet, ki so naštete v meniju "File:Palettes". Na primer, takole lahko na dva načina vnesemo isti račun:

(x^2)+(y^(n+1))

((1+(x^2))/(Sqrt[(1/(1-x))]))

∫(x^2)Log[x]\[DifferentialD]x

Det[(({{a, 1, 0}, {0, b, 1}, {0, 0, c}}))]

x×y

Simplify[((Cos[α])^2)+((Sin[α])^2)]

(Sqrt[(∫_0^1)(x^2)\[DifferentialD]x])

Sqrt[Integrate[x^2, {x, 0, 1}]]

InputForm[Hold[(∑_(i=1)^n)(1/((i^2)+7))]]

Sum[1/(i^2 + 7), {i, 1, n}]

Zvezki imajo končnico .nb. Včasih zelimo napisati program v Mathematici, ki vsebuje samo ukaze za kernel. Take programe shranjujemo v datoteke s končnico .m in jih ne pišemo s frontendom, ampak z navadnim urejevalnikom besedil, kakršen je na primer Textpad. Datoteko s končnico .m naložimo v kernel z ukazom Get:

Get["primer.m"]

Kaj vse zna Mathematica

Oglejmo si, kaj vse zna Mathematica.

Najprej povejmo, da v Mathematici uporabljamo oglate oklepaje, ko uporabimo funkcijo na argumentu. Torej pišemo f[x] namesto f(x) in (f[x + y] + g[x])^2 namesto (f(x + y) + g(x))^2.

Velja si tudi zapomniti, da se vse vgrajene funkcije in rezervirane besede pišejo z veliko začetnico. Na primer:

Sin[Pi/3]

((Sin(Pi/3))/(Sin(Pi/2)))

Če napišemo Sin ali Pi z malo začetnico, Mathematica to razume kot splošno spremenljivko in ne kot vgrajeno trigonometrijsko funkcijo ali konstanto π. Da je nekaj narobe nam Mathematica prikaže z barvami: simboli, ki nimajo definicije, se obarvani z modro barvo.

sin[Pi/3]

Sin[pi/3]

Ker se imena vgrajenih funkcij in konstant začnejo z velikimi začetnicami, je uporabniku priporočeno, da  svoje funkcije in konstante poimenuje z malo začetnico, da ne bi prišlo do zmešnjave.

Oglejmo si, kako z Mathematico rešujemo tipične naloge, s katerimi se sreča študent matematike.

Linearna algebra

Izračunajmo lastne vrednosti in lastne vektorje matrike

a = (({{y, (x^2), 0}, {(z^2), y, (x^2)}, {0, (z^2), y}}))

Eigenvalues[a]

Eigenvectors[a]

Sedaj ne vemo, kateri vektor spada h kateri lastni vrednosti. V ta namen imamo ukaz Eigensystem:

Eigensystem[a]

MatrixForm[Last[JordanDecomposition[a]]]

Spomnimo se še enkrat, da definicijo spremenljivke ali funkcije pobrišemo z ukazom ClearAll:

ClearAll[a]

a

Limite

Izračunaj limito izraza (Sqrt[(x^2) + b*x+1])-(Sqrt[(x^2)- b*x+1]), ko gre x->∞:

Limit[(Sqrt[(x^2) + b*x+1])-(Sqrt[(x^2)- b*x+1]),x->∞]

Vendar moramo biti previdni, ker včasih Mathematica “noče” izračunati rezultata:

Limit[(x^p)*Log[x], x->0]

Težava je v tem, da ne ve nič o vrednosti p. Če na primer vemo, da je p > 0, lahko to povemo z opcijo Assumptions:

Limit[(x^p)*Log[x], x->0,Assumptions->{p>0}]

Limit[(x^p)*Log[x], x->0,Assumptions->{p<0}]

Diferencialni račun

Odvod funkcije f[x] po spremenljivki x je D[f,x]:

D[Sin[x*y], x]

Odvod je včasih precej zakompliciran...

h = D[((((1 + g[x]))^2)/(1-((g[x])^2))),x]

...a v Mathematici lahko izraz poenostavimo z ukazom Simplify:

Simplify[h]

Še pametnejši od Simplify je ukaz FullSimplify.

Seveda lahko v Mathematici tudi integriramo.

Integrate[(x^3)Cos[x], x]

(∫_0^∞)Sin[(x^2)]\[DifferentialD]x

Narišimo krivuljo Sin[(x^2)]:

Plot[Sin[(x^2)], {x, 0, 5}]

Izračunajmo dolžino krivulje f[x]=x·Sin[x] na intervalu [0,a].

f[x_]:=x * Sin[x]

g[x_]=Sqrt[1+(((D[f[x], x]))^2)]

s[a_] = Integrate[g[x], {x, 0, a}]

Mathematica tega integrala ne zna izračunati za splošen a. Lahko pa integriramo numerično za dano vrednost, na primer a=3/2.

N[s[3/2]]

Narišimo grafa funkcij f[x] in s[x]

sn[a_] := NIntegrate[g[x], {x, 0, a}]

Plot[{f[x], sn[x]}, {x, 1, 10}, PlotStyle->{RGBColor[1,0,0],RGBColor[0,1,0]}]

Ve primerov računanja bomo videli na vajah.