Mathematica — matematički pristup

Prošli put smo detaljno vidjeli kako možemo definirati razne funkcije s obzirom na tipove parametara, i uvjete koje oni zadovoljavaju, strukturalno. Naravno, postoji i matematički pristup.

TraditionalForm

Obični Mathematicin output je u tzv. StandardForm-u, što je dosta korisno za one koji tek uče kako Mathematica funkcionira, jer se lako vidi što je dio čega, i kako se izrazi tvore. Glavna snaga StandardForm-a je što output možemo praktički pretipkati u input, često bez ikakvih posebnih znakova, i StandardForm je dizajniran s tom glavnom svrhom. No StandardForm nije optimalan za stvari koje su primarno "tradicionalno matematičke", jer one koriste razne simbole i forme koje je teško pretipkati, a čak i kad ih pretipkamo, pitanje je što one znače — tradicionalne matematičke oznake su često višeznačne (naprimjer, matrica 2×1 izgleda baš kao binomni koeficijent).
Vidjeli smo jedan primjer, da matrice ne prikazuje dvodimenzionalno, već kao liste lista (osim ako upotrijebimo MatrixForm). To je korisno za početnike da vide što matrica doista jest, i kako se s njima može raditi pomoću funkcija koje operiraju na listama, ali je nezgodno za vizualizaciju. Još jedan od primjera je što su polinomi poredani po eksponentima varijable u rastućem redoslijedu, a ne u padajućem. To je korisno za razumjeti Sort, Orderless i slične stvari, jer je taj poredak donekle u skladu s onim što očekujemo kad npr. sortiramo listu proizvoljnih izraza (jednostavniji prije kompliciranijih), ali je vrlo čudno sa stajališta tradicionalnog matematičara koji je navikao da mu kvadratna jednadžba izgleda kao a (x^2)+b x+c==0. Ima i dosta drugih primjera (dvostruki = vs. jednostruki, trigonometrijske funkcije velikim slovom, argumenti u uglatim zagradama, logički veznici) koji svi imaju dobar razlog zašto su takvi kakvi jesu na inputu, ali nema razloga da output ne bude "tradicionalan". Jedino što tada moramo napustiti je ideja da output ima isti oblik kao input, no za matematičke stvari s kojima smo naučili raditi, to i nije tako strašno.

Mathematica posjeduje način pisanja koji je puno više u skladu s tradicionalnom matematičkom notacijom, i zove se TraditionalForm.

StandardForm@Column@{(({{1, 2}, {3, 4}})),Sin[x]Sin[x],a (x^2)+b x+c==0,p&&q||r,Rationals}

TraditionalForm@Column@{(({{1, 2}, {3, 4}})),Sin[x]Sin[x],a (x^2)+b x+c==0,p&&q||r,Rationals}

Neke stvari su malo drugačije, u skladu s američkim označavanjem:

TraditionalForm@{ArcCos@x,Sinh@x,((Sin@x)/(Cos@x)),Log[E,x]}

Kako dobiti output u TraditionalForm-u? Jedan način smo već vidjeli, pozivom unarne funkcije TraditionalForm. Ako to često radimo, možemo je pridružiti sistemskoj varijabli $PrePrint, koja se (ako je definirana) primjenjuje na svaki output neposredno prije nego što se on ispiše.

$PrePrint=TraditionalForm

(({{1, 2}, {3, 4}})).(({{5, 6}, {7, 8}}))

Reduce[Sin@x==(1/2),x]

Ako miješamo strukturalni (programerski) i matematički output često, ili želimo vidjeti kako se neki tradicionalni objekt interno prikazuje kako bismo ga napali strukturalnim sredstvima, uvijek postoji i funkcija StandardForm.

StandardForm@%

Ako često "šaltamo" između jednog i drugog, dobro je znati za tipkovničke kratice (za vrijeme dok je kursor unutar ćelije koja nije u eksplicitno zadanom StandardForm ili TraditionalForm obliku):
Ctrl[⇧[t]]: pretvorba u TraditionalForm
Ctrl[⇧[n]]: pretvorba u StandardForm

(({{1, 2}, {3, 4}}))

Skupovi brojeva

Mathematica poznaje sljedeće skupove (svi osim zadnjeg su skupovi brojeva):

({{ime, StandardForm, TraditionalForm, objašnjenje}, {prim–brojevi, Primes, ℙ, {p∈ℤ:p≥2∧(∀d∈ℤ)(d|p=>d∈{1,p})}}, {cijeli brojevi, Integers, ℤ, {x∈ℂ:Im(x)=0∧⌊x⌋=x}}, {racionalni brojevi, Rationals, ℚ, {(a/b):a,b∈ℤ∧b>0}}, {algebarski brojevi, Algebraics, 𝔸, {α∈ℂ:(∃p(x)∈ℤ[x])p(α)=0}}, {realni brojevi, Reals, ℝ, {x∈ℂ:Im(x)=0}}, {kompleksni brojevi, Complexes, ℂ, univerzalni skup brojeva za Mathematicu}, {logičke vrijednosti, Booleans, 𝔹, {True,False}}})

Primijetimo da nema skupa prirodnih brojeva, ali njega uvijek možemo dobiti pomoću ℤ i Positive (ili NonNegative, ako želite 0∈ℕ). Oznaka ∈ se dobije sa el. Doublestruck slova se dobiju sa dsX, gdje je X odgovarajuće veliko slovo, ali to ne pomaže puno, jer u StandardForm-u ti skupovi nemaju ta imena. Ipak, ako vam se puno više sviđa pisati ℝ nego Reals, uvijek možete definirati

{ℙ,ℤ,ℚ,𝔸,ℝ,ℂ,𝔹}={Primes,Integers,Rationals,Algebraics,Reals,Complexes,Booleans}

Ovo su matematičke definicije, dakle ℙ⊂ℤ⊂ℚ⊂ℝ⋂𝔸⊂ℝ⋃𝔸⊂ℂ:

{2∈Rationals,π∈Complexes}

Primijetimo da su 𝔸 i ℝ neusporedivi: nijedan nije podskup onog drugog:

Outer[Element,{π,I},{𝔸,ℝ}]

prirodnadomena@f_:=Reduce[f∈Reals,x,Reals]

prirodnadomena@(Sqrt[(x^2)+x-3])

Svi ostali skupovi prikazuju se pomoću gore navedenih, te jednakosti odnosno nejednakosti (pri tom treba napomenuti da je univerzalni skup ℂ, ali čim se pojave nejednakosti, Mathematica silazi na ℝ, jer na općim kompleksnim brojevima nije definiran uređaj). Mathematica ne zna za skupovne operacije na njima, ali zna za logičke operacije pomoću kojih se one mogu dobiti.

Funkcije definirane po slučajevima

Da bismo funkciju definirali po slučajevima strukturalno, koristimo patterne kako je već objašnjeno. No možemo je definirati po slučajevima i matematički, što je često korisnije za matematičke operacije s njom (na primjer, kad je želimo derivirati). To je standardna "definicija pomoću vitičaste zagrade", koja se u Mathematici dobije sa pw, nakon koje ide 2×n matrica (gdje je n broj slučajeva). Treba napomenuti da za razliku od klasične definicije, gdje se uvjeti ne preklapaju, u Mathematici je to dozvoljeno i uvjeti se provjeravaju redom kojim su navedeni. Dakle, onaj "inače" koji je često na kraju takvih definicija, u Mathematici se kaže jednostavno True, odnosno to je ono što je uvijek ispunjeno, a do čega će se doći jedino ako nijedan uvjet prije nije ispunjen. (Ako nema tog True na kraju, a popisani slučajevi ne pokrivaju sve mogućnosti, funkcija se defaultno proširuje nulom).

fpodijelovima@x_:=(Piecewise[{{x, x<0}, {(x^2), x<1}, {-1, True}}])

Plot[fpodijelovima@x,{x,-1,2}]

Neke tako definirane funkcije nisu baš pogodne za matematičke operacije; jednakosti i nejednakosti su obično ok, ali pripadnost određenim domenama zna zbuniti Mathematicu:

Plot[(Piecewise[{{1, x∈Algebraics}, {0, True}}]),{x,0,1}]

∫(Piecewise[{{1, x∈Integers}, {0, True}}])\[DifferentialD]x

Čiste funkcije

Na mnogim mjestima (na primjer prije operatora /@, ili kao drugi argument od Select) Mathematica očekuje unarnu funkciju. Ako ona ima ime, samo ga navedemo i Mathematica će napraviti što treba:

Length/@{a+b,c d e}

Select[{4,-6,0,I,(Sqrt[5]),3.14,a},Positive]

Ali što ako je naša funkcija specijalnija i nema ugrađeno ime? Na primjer, kako iz gornje liste izvući brojeve koji su manji od 3? Uvijek možemo definirati posebnu funkciju:

uvjet@x_/;x∈Reals:=x<3

Select[{4,-6,0,I,(Sqrt[5]),3.14,a},uvjet]

Ali postoji i kraći način. Mathematica ima metodu kojom možemo na licu mjesta konstruirati unarnu funkciju (može imati i više argumenata, ali najčešće se koristi za unarne funkcije): izraz na čijem kraju se nalazi operator & ("pure function") se može evaluirati na proizvoljnim izrazima, koji se uvrštavaju na mjesto specijalnog "slota" označenog s #. Na primjer, čista funkcija koja svoj argument kvadrira i dvostruki rezultat zbraja s 3 može se napisati kao

2((#)^2)+3&

%@5

%%'

%'

Select[{4,-6,0,I,(Sqrt[5]),3.14,a},#<3&]

Select[{4,-6,0,I,(Sqrt[5]),3.14,a},#∈Reals∧#<3&]

Vidimo da slot # ima puno ime #1, što znači da predstavlja prvi argument. Možemo koristiti i ostale slotove za višeargumentne funkcije, pa čak i #0 za samu funkciju (što dobro dođe kod rekurzivnih poziva):

#1+#2 #3&[4,5,6]

#1+#2 #3&[4,5,6,7,8]

#1+#2 #3&[4,5]

(Piecewise[{{1, #<2}, {#0[#-1]#, True}}])&@6

Čiste funkcije imaju odgođenu evaluaciju:

3+(2+#)+3&

%@x

U Mathematici 7, postoji i bolja notacija za čiste funkcije, u skladu s matematičkom notacijom. Simbol |-> se dobije sa fn.

x|->2(x^2)+3

%'

%'

Mathematica će automatski preimenovati unutrašnje varijable ako procijeni da je moguće da dođe do kolizije:

(x|->y|->x)@y

Derivacije: ',(Subscript[d, x]),(∂_x)

Derivirati pomoću ' možemo samo čiste (ili imenovane) funkcije, ne izraze poput 2(x^2)+3 — za njih trebamo upotrijebiti (Subscript[d, v]), gdje je v u indeksu varijabla po kojoj želimo derivirati:

(2(x^2)+3)'

ArcCos'

(Subscript[\[DifferentialD], x])(2(x^2)+3)

3#+5#2&'

Deriviranje pomoću (Subscript[d, v]) derivira sve simbole po v; ako hoćemo smatrati konstantama one dijelove izraza u kojima se ne pojavljuje v eksplicitno, možemo upotrijebiti (∂_v) (znak ∂ dobijemo sa pd).

Column@{(Subscript[\[DifferentialD], x])(2x+3y+f[5x]),(∂_x)(2x+3y+f[5x])}

Sequence i slotovi

Head Sequence nam omogućuje da imamo slotove koji dohvate sve argumente čiste funkcije (ili sve počevši od nekog). To pišemo pomoću ##. Moramo isključiti TraditionalForm jer se Sequence objekti i unutar njega "razlijevaju", pa ne dobijemo željeni rezultat.

$PrePrint=.

##&[4,6,7]

3+##&[4,6,7]

{1,3,##2,5}&[4,6,7]

$PrePrint=TraditionalForm