Predavanje 2: Glave 4 do 6

FlipView[{Text[Style[" Branko Urošević, imqfbrankourosevic@gmail.com ",20,"Text",Italic]],Text[Style[" Faculty of Economics, University of Belgrade, NBS and CESIfo Munich",20,"Text", Italic]]}]

4. Različiti načini za predstavljanje listi brojeva

ListLinePlot

ListPlot je jedan od načina da se vizualizuje grupa brojeva koja se nalazi u listi. Ima puno drugih načina. Različiti pristupi fokusiraju se na različite aspekte liste.

ListLinePlot crta liniju koja spaja svaku tačku iz liste pomoću prave linije:

ListLinePlot[{1,2,1,3,6,1}]

U FullForm:

ListLinePlot[List[1,2,1,3,6,1]]

Za neke liste teško je sagledati zavisnost preko ListPlot a mnogo lakše preko ListLinePlot:

ListPlot[{1,2,1,3,6,1}]

ListLinePlot od složenijih lista

Razmotrimo listu koja se dobijamo spajanjem

Join[Range[10],Reverse[Range[10]]]

ListLinePlot[Join[Range[10],Reverse[Range[10]]]]

Kako da nacrtamo ovo ali bez horizontalnog dela u sredini?

ListLinePlot[Join[Range[10],Reverse[Range[9]]]]

A šta ako plotujemo listu od listi umesto jednu spojenu listu?

List[Range[10],Reverse[Range[9]]]

ListLinePlot[List[Range[10],Reverse[Range[9]]]]

BarChart

U poslovnim prezentacijama, BarChart se koristi veoma često. Visina svakog bara odgovara nivou tačke koja se predstavlja:

BarChart[{1,2,1,3,6,1}]

U FullForm:

BarChart[List[1,2,1,3,6,1]]

Probajmo sada šta bi bilo

BarChart[Join[Range[10],Range[5]]]

Evo i BarChart-a za listu od listi

BarChart[List[Range[10],Range[5]]]

Vidimo da se kod liste napravljene od listi BarChart ponaša drugačije od ListPlot i ListLinePlot.

PieChart

Ukoliko lista nije mnogo velika, PieChart je dobar način da se predstavi na jednom grafiku relativni odnos veličina:

PieChart[{1,3,5}]

PieChart[{1,2,1,3,6,1}]

Primetimo da je kod PieChart relativni odnos jedino važan, a ne apsolutna vrednost. Na primer, uporedimo

PieChart[{1,1,1}]

PieChart[{5,5,5}]

Kako izgleda

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

Poredak nije isto kao kod:

PieChart[Join[Range[3],Reverse[Range[5]]]]

А šta bi bilo ako koristimo

PieChart[List[Range[3],Reverse[Range[5]]]]

NumberLinePlot

Ukoliko samo želimo da znamo koji različiti brojevi se pojavljuju u listi, možemo da koristimo NumberLinePlot:

NumberLinePlot[{1,7,11,25}]

Primetimo da će ovo izgledati isto iako lista nije ista (zašto?)

NumberLinePlot[{1,7,11,25,7,1}]

Row i Column

Nekada ne želimo da crtamo ništa nego da samo stavimo brojeve u Row ili Column (vrstu ili kolonu):

Column[{100,350,502,400}]

Row[{100,350,502,400}]

Primetimo da Row ili Column daje sliku liste, pa nešto ovako nije moguće:

Row[{100,350,502,400}]-90

Sa druge strane,

{100,350,502,400}-90

List može da sadrži i grafike (i bilo šta drugo)

List može da sadrži bilo šta, uključujući i grafike.  Napravite listu koja se sastoji iz dve PieChart.

{PieChart[Range[3]],PieChart[Range[5]]}

Prikažite listu sa 3 BarChart:

{BarChart[{1,1,4,2}],BarChart[{5,1,1,0}],BarChart[{1,3,2,4}]}

5. Uvodne diskusije u operacije na listama

Možemo dodati ili oduzeti neki broj od liste brojeva

Postoji bukvalno hiljade funkcija koje rade sa listama. Evo kako radi obična aritmetika na listama. Na primer

{1,2,3}+15

U FullForm to je

Plus[List[1,2,3],15]

Evo kako možempo da oduzmemo 15 od liste {1,2,3}

{1,2,3}-15

Subtract[List[1,2,3],15]

Liste istih dimenzija mogu se sabirati ili oduzimati

Liste iste dimenzija mogu se sabirati. U tom slučaju listu možemo interpretirati kao vektor a onda je ovo sabiranje lista isto što i po-komponentno sabiranje vektora.

{2,3,1}+{7,-1,3}

U FullForm

Plus[List[2,3,1],List[7,-1,3]]

Slično, možemo i da oduzmemo dve liste istih dimenzija

{2,3,1}-{7,-1,3}

U FullForm:

Subtract[List[2,3,1],List[7,-1,3]]

Množenje liste na skalar (broj)

Možemo i da pomnožimo neku listu (vektor) sa brojem (skalarom)

-17 {1,2,3}

U FullForm

Times[List[1,2,3],-17]

Pokomponentno množenje listi

Takođe, možemo pokomponentno množiti dve liste ukoliko su istih dimenzija liste istih dimenzija of the same dimensions:

{1,2,3}*{1,2,3}

{1,2,3}{1,2,3}

Kako to izgleda u FullForm?

Times[List[1,2,3],List[1,2,3]]

Kvadrat i kub liste brojeva od 1 do 10

Izračunajmo kvadrate brojeva od 1 do 10:

Ovo se može uraditi na puno različitih načina:

Range[10] Range[10]

Range[10]^2

((Range[10])^2)

Kub liste brojeva od 1 do 10 možemo izračunati ovako

((Range[10])^3)

U punoj formi

U punoj formi, ovi izrazi su:

Times[Range[10],Range[10]]

i, respektivno:

Power[Range[10],2]

Grafički predstaviti rezultate operacija na listama

Predstavite preko ListPlot kvadrate prvih 20 brojeva od 1 do 20:

ListPlot[Range[20]^2]

ListLinePlot[Range[20]^2]

Na ovaj način možemo videti kako početnu listu koju kvadriramo (linearna funkcija) tako i rezultat kvadriranja (kvadratna funkcija)

ListLinePlot[List[Range[20],Range[20]^2]]

Vidimo koliko brže raste kvadratna funkcija

Sortiranja elemenata liste: Sort

Sort sortira listu od najmanjeg do najvećeg elementa (ako su u pitanju brojevi):

Sort[{1,4,5,2,8}]

ili, u FullForm

Sort[List[1,4,5,2,8]]

Možemo grafički predstaviti originalnu liniju koja spaja tačke liste koju sortiramo, kao i rezultat sortiranja

ListLinePlot[List[{1,4,5,2,8}]]

ListLinePlot[List[{1,4,5,2,8},Sort[{1,4,5,2,8}]]]

Nesortirana lista je prva, pa je, po defoltu, plave boje.

Dužina (Length), suma elemenata liste (Total), i Count

Length određuje broj elemenata u listi:

Length[{1,2,5,1,2,9}]

Total računa sumu elemenata u listi (to je veoma brza funkcija, ima i drugih načina da se izračuna suma elemenata u listi):

Total[Range[5]]

Naći sumu brojeva od 1 do 10:

Total[Range[10]]

Count broji broj puta koliko se neki element pojavljuje u listi. Nađimo broj puta koliko se element a pojavljuje u listi:

Count[{a,b,a,a,c,b,a},a]

Naći element u listi

Često je veoma korisno da nađemo neke individualne elemente ili grupe elemenata u listi. First uzima prvi element, Last uzima poslednji. Part uzima element na nekom zadatom mestu u listi. Odaberimo prvi i poslednji element u listi {7,4,2}.

First[{7,4,2}]

Last[{7,4,2}]

Izaberite element redni broj 2:

Part[{7,4,2},2]

Drugi česti način da se ovo napiše jeste pomoću dvostruke srednje zagrade:

{7,4,2}[[2]]

Ukoliko izaberemo prvi element u listi koju smo prethodno sortirali po uzlaznom redu dobijamo Min:

First[Sort[{4,1,5,7,3}]]

Min[{4,1,5,7,3}]

Kako izabrati više od jednog elementa u listi

Pretpostavimo da želite da uzmete samo deo liste. To možete da uradite pomoću funkcije Take[]. Uzmite prva 4 elementa liste Range[5]

Range[5]

Take[Range[5],4]

Ukoliko želite da zadržite samo prva 3 elementa onda biste uradili sledeće:

Take[Range[5],3]

Pretpostavimo da želite da zadržite samo poslednja 3 elementa. Možete to uraditi ovako:

Take[Range[5],-3]

Kako izabrati elemente od rednog broja 2 do 4?

Take[Range[5],{2,4}]

IntegerDigits uzima kao argument ceo broj i pravi listu cifara koje ga čine

IntegerDigits[5671]

Naći poslednju cifru broja 2016

Last[IntegerDigits[2016]]

FromDigits uzima listu cifara i pravi od nje ceo broj

Kombinovanje više operacija na listama

Prisetimo se da Take omogućava da uzmemo određene elemente liste. Ovako uzimamo prva tri elementa liste

Take[{101,203,401,602,332,412},3]

Uzmite prvih 10 cifara broja 2 na stepen 100:

IntegerDigits[2^100]

Take[IntegerDigits[2^100],10]

Drop odbacuje elemente umesto da ih uzima:

Drop[Range[10],3]

Drop[Range[10],-3]

Koliko ima nula u broju (2^1000)

Da bismo odgovorili na to pitanje prvo nađemo listu cifara tog broja. Onda primenimo Count sa drugim argumentom jedankim 0.

IntegerDigits[(2^1000)]

Count[IntegerDigits[(2^1000)],0]

A koliko ima dvojki u tom broju?

Count[IntegerDigits[(2^1000)],2]

Koliko ima ukupno cifara

Length[IntegerDigits[(2^1000)]]

6. Pravljenje liste pomoću Table

Lista istovetnih elemenata

Videli smo prethodno nekoliko načina da pravimo liste u Wolfram Language. Možemo da ih direktno ukucamo, da koristimo Range, ili, na primer, da koristimo funkcije tipa IntergerDigits. Jedan od najfleksibilnijih načina da pravimo liste jeste pomoću funkcije Table. U najprostijoj formi, Table pravi listu jednog istog elementa ponovljenu određen broj puta. Napraviti listu koja se sastoji od broja 5 ponovljenog 10 puta:

Table[5,10]

A šta bi bilo ovo?

Table[x,7]

Možete da ponavljate i cele liste, ili recimo grafike:

Table[{1,2,5},10]

Table[PieChart[{1,2,5}],4]

Tabele sa različitim elementima

Ali, šta ukoliko želite da napravite tabelu sa različitim elementima? To možemo da uradimo ukoliko uvedemo takozvane iteratore. Na primer, iterirajte n od 1 do 5 i napravite listu a[n]:

Table[a[n],{n,5}]

Evo kako to radi. Iterator n je prvo jednak 1. Za tu vrednost vrši se zamena u izrazu za a. Onda na red dolazi drugi element, pa treći i tako dalje. Naći tabelu koja daje vrednosti n+1 ukoliko n ide od 1 do 10:

Table[n+1,{n,1,10}]

Kvadrat i kub brojeva od 1 do 20 pomoću Table

Izračunati kvadrate i kubove brojeva od 1 do 20 koristeći Table:

Table[n^2,{n,1,20}]

Table[n^3,{n,1,20}]

To može i jednostavnije (ukoliko ništa ne kažemo, iterator polazi od 1 pa se taj broj može izostaviti)

Table[n^2,{n,20}]

Table[n^3,{n,20}]

Kombinacija Range i Table

Pomoću Table možemo da napravimo tabele bilo čega.  Ovde je tabela gde Range ima sve više i više elemenata:

Table[Range[n],{n,5}]

Table[Column[Range[n]],{n,8}]

Table[ListPlot[Range[10*n]],{n,3}]

Table[PieChart[Table[1,n]],{n,5}]

Više o iteratorima

Do sada smo koristili n kao iterator, ali to, naravno, ne moramo da radimo. Možemo da koristimo bilo koji drugi simbol ili grupu simbola. Na primer, expt je sasvim dobro ime za iterator:

Table[2^expt,{expt,10}]

Ovde koristimo x kao iterator, i pravimo tabelu, istovremeno, za različite funkcije:

Table[{x,x+1,x^2},{x,5}]

Table sa simboličkim funkcijama

U Table[f[n],(n,5)], n uzima vrednosti 1, 2, 3, 4, 5. Table[f[n],{n,3,5}] kaže da n počinje od vrednosti 3, pa su vrednosti iteratora: 3, 4, 5. Ova tabela ima iterator koji ide od 1 do 10:

Table[f[n],{n,10}]

a ovo generiše n od 4 do 10:

Table[f[n],{n,4,10}]

Veličina koraka može biti i veća i manja od 1. Na primer, ovde n ide od 4 do 10 u koracima od 2:

Table[f[n],{n,4,10,2}]

Range sa različitim iteracijama

Wolfram Language je veoma konsistentan, pa na primer, Range je napravljen tako da radi slično kao Table (ali bez velikih zagrada za iteratore).

Range[4,10]

Range[4,10,2]

Range[0,1,0.1]

Ti izrazi pomoću Table bi bili

Table[n,{n,4,10}]

Table[n,{n,4,10,2}]

Table[n,{0,1,0.1}]

Kada iterator uzima vrednost iz proizvoljne liste

Razmotrimo listu {-1,20, 34} nađimo vrednosti funkcije n^2 za te vrednosti n. To se može uraditi ovako:

Table[(n^2),{n,{-1,20,34}}]

U punoj formi to bi bilo:

Table[(n^2),List[n,List[-1,20,34]]]

Iteratori mogu biti potpuno proizvoljne liste. Recimo, ovo je sasvim OK:

Table[(n^2)+7 n,{n,{a,b,c,d,e}}]

Grafici funkcija pomoću grafičkog prikaza tabela

Ima puno različitih načina da se ista stvar napravi u Wolfram Language. Na primer, evo kako Table i Range mogu da proizvedu identične plotove. Preko Table:

ListPlot[Table[x-x^2,{x,0,1,.02}]]

ListLinePlot[Table[x-x^2,{x,0,1,.02}]]

Preko Range:

ListPlot[Range[0,1,.02]-Range[0,1,.02]^2]

ListLinePlot[Range[0,1,.02]-Range[0,1,.02]^2]

Granice naravno ne moraju da budu u pozitivnom intervalu. Pretpostavimo da nas interesuje grafik u intervalu -1 do 1.

ListLinePlot[Range[-1,1,.02]-Range[-1,1,.02]^2]

Generisati više slučajnih brojeva

Ovo generiše 20 nezavisnih slučajnih celih brojeva od nula do 10:

Table[RandomInteger[10],20]

A ovo generiše 20 celih slučajnih brojeva od -10 do 10

Table[RandomInteger[{-10,10}],20]

Ovo takođe generiše 20 slučajnih brojeva koji su u rasponu od 0 do 10:

RandomInteger[10,20]

a ovo u rasponu od -10 do 10

RandomInteger[{-10,10},20]

To se u punoj formi može napisati i ovako:

RandomInteger[List[-10,10],20]