Ideje resenja zadataka sa kolokvijuma u decembru 2017

Prva grupa

1A

Definišemo dva vektora, x0 i b, kao i matricu A

x0={1,2,3}; b={1,1,1};A={{1,0,-1},{1,1,0},{0,1,0}};

Množenje matrice na vektor radi se pomoću funkcije Dot ili, skraćeno, .

Dot[A,x0]

je isto što i

A.x0

Polazeći od liste (vektora) x0, napraviti 5 iteracija tipa x1= A.x0+b, x2=A.x1+b itd pet puta. Napraviti liniju u 3D koja prolazi kroz tako dobijene tačke, koristeći komandu Arrow. Napraviti da linija bude crvena i puna. Onda napisati funkciju iteracijaVektora[mat, vek1, vek2, n]  koja kao argument uzima kvadratnu matricu mat, vektore vek1 i vek2 koje imaju istu dimenziju kao matrica mat, kao i ceo pozitivan broj n. Output treba da  bude grafik tipa onog što ste dobili gore. Proverite da ste dobili isto što i gore ukoliko izračunate:

iteracijaVektora[A, x0, b, 5]

Ideja rešenja

x0={1,2,3};b={1,1,1};A={{1,0,-1},{1,1,.0},{0,1,0}};

x1=Dot[A,x0]+b

x2=Dot[A,x1]+b

NestList[Dot[A,#]+b&,x0,5]

Graphics3D[Style[Arrow[NestList[Dot[A,#]+b&,x0,5]],Red]]

iteracijaVektora[A_List,b_List,x0_List,n_Integer]/;SquareMatrixQ[A]&&Length[A]==Length[b]:=Graphics3D[Style[Arrow[NestList[Dot[A,#]+b&,x0,n]],Red]]

iteracijaVektora[A,b,x0,20]

2A

Naći parove brojeva {i,j} gde i i j idu od 1 do 30 za koje važi da je suma kubova (i^3)+(j^3) kvadrat nekog celog broja. U svakom paru, prvi broj treba da bude manji ili jednak drugom broju. Onda napisati funkciju parovi[n] koja kao argument uzima ceo broj n>1 i daje takve parove. Proveriti da je parovi[30] isto što i lista koju ste malopre dobili.

Ideja rešenja

uredjeniparovi=Cases[Flatten[Table[{i,j},{i,30},{j,30}],1],{p_,q_}/;p≤q]

Module[{uredjeniparovi=Cases[Flatten[Table[{i,j},{i,30},{j,30}],1],{x_,y_}/;x≤y]},Cases[uredjeniparovi,{p_,q_}/;IntegerQ[(Sqrt[(p^3)+(q^3)])]]]

Sada možemo napisati funkciju parovi

Clear[parovi]

parovi[n_Integer]:=Module[{uredjeniparovi=Cases[Flatten[Table[{i,j},{i,n},{j,n}],1],{x_,y_}/;x≤y]},Cases[uredjeniparovi,{p_,q_}/;IntegerQ[(Sqrt[(p^3)+(q^3)])]]]

parovi[30]

4A

Napišite funkciju f[m,n] koja je definisana za proizvoljna dva cela  broja i kao output daje listu čiji je prvi element suma kvadrata tih brojeva a drugi element kvadrat sume m i n. Izračunati f[5,4]. Onda primenite tu funkciju na listu koja se sastoji od

lista=RandomInteger[10,{100,2}]

tako da prvi broj u svakom paru bude prvi argument funkcije, a drugi element u svakom paru bude drugi element funkcije f. Na primer, ukoliko je 
{ {3,4}, {1,2}, ...}, onda treba da imamo listu za koju se istračuna

{f[3,4], f[1,2], ...} itd.

Kao output treba da dobijete listu istih dimenzija kao lista.

Ideja rešenja

f[m, n] koja je definisana za dva proizvoljna cela broja

f[m_Integer,n_Integer]:={(m^2)+(n^2),(((m+n))^2)}

f[5,4]

lista=RandomInteger[10,{100,2}]

Primenimo sada Apply na nivou 1 funkciju f na listu:

f@@@lista

To je isto što i

Apply[f,lista,{1}]

Primetimo da to nije isto što Map na prvom nivou

Druga grupa

1B

Napišite funkciju matricniStepen[mat, n] koja kao input uzima kvadratnu matricu mat i neki pozitivan ceo broj n>=1 (ne zaboravite da unesete uslove u definiciju funkcije). Kao output dobijamo proizvod matrice mat sa samom sobom n puta koristeći funckiju Dot (matrično množenje). Na primer

matricniStepen[A,2]

treba da bude

Dot[A,A]

matricniStepen[A,3]

treba da bude

Dot[A,Dot[A,A]]

i td.

Izračunajte

matricniStepen[A,20]

ukoliko je

A={{0,1},{1,0}};

Ideja rešenja

Primetimo da je

matricniStepen[A, 2]

A.A

Dot[A,A]

matricniStepen[A, 3]

A.A.A

Dot[A,Dot[A,A]]

A={{0,1},{1,0}};

Dot[A,A]

matricniStepen[A_List,n_Integer]/;SquareMatrixQ[A]&&n>0:=Nest[Dot[#,A]&,A,n-1]

matricniStepen[A,20]

To je isto što i

Nest[Dot[#,A]&,A,19]

2B

Napravite Manipulate koji će vam omogućiti da birate funkcije koje ćete predstaviti grafički pomoću Plot-a iz liste funkcija {Sin,Sinh,Tan}. Omogućite korisniku da bira interval u kome će funkcije biti prikazane, kao i boju u kojoj će biti prikazane (korisnik treba da bira između crvene, crne, braon i 
žute boje). Donja granica intervala je izmedju -10 i 0 a gornja između 1 i 11. Svaki grafik mora da ima odgovara naslov (PlotLabel) koji će sadržati ime funkcije koja se prikazuje i koji će se takođe menjati kako se menja funkcija koju biramo.

Ideja rešenja

Manipulate[Plot[func[x],{x,a,b},PlotStyle->boje,PlotLabel-> StringJoin["Ovo je funkcija ",ToString[func],"(x)"]],{func,{Sin,Sinh,Tan}},{boje,{Red,Brown,Pink}},{a,-10,0},{b,1,11}]

3B

Kreirajte listu 100 trojki slučajnih brojeva (dakle, podliste su dimenzije 3) gde je svaki broj ceo između 0 i 10. Iz te liste izvaditi one podliste (trojke) za koje važi, istovremeno, da je: suma sva tri ne manja od 20, suma kvadrata ne manje 150, a poslednji broj u trojci je paran. Predstavite grafički u 3D ove tačke crvenom bojom a komplement tog stupa (tačke koje ne zadovoljavaju ove kriterijume) plavom bojom. Veličina tačke treba da bude 0.01.

Ideja rešenja

trojke=RandomInteger[10,{100,3}]

izabrano=Cases[trojke,{x_,y_,z_}/;x+y+z≥20&&(x^2)+(y^2)+(z^2)≥150&&EvenQ[z]]

ostatak=Complement[trojke,izabrano];

Graphics3D[{Style[Point[izabrano],Red],Style[Point[ostatak],Blue]}]

4B

Napisati funkcija novoSabiranje koja kao input uzima listu x i onda prvi broj u listi ostavi takav kakav jeste, drugi digne na kvadrat, treći na kub itd (najveći stepen odgovara broju elemenata liste). Na kraju sabere sve tako dobijene elemente liste. Onda izračunajte

novoSabiranje[{a,b,c}]

novoSabiranje[Range[10]]

Ideja rešenja

Clear[a,b,c]

{a,b,c}

a+(b^2)+(c^3)

Jedno moguće rešenje

f[x_List]:=Total[Table[Power[Part[x,i],i],{i,1,Length[x]}]]

Clear[b]

f[{a,b,c}]

Evo i drugog rešenja

Total[(({a,b,c})^(Range[3]))]

f1[x_List]:=Total[(x^(Range[Length[x]]))]

f1[{a,b,c}]

f1[Range[10]]

Treća grupa

1C

Napisati funkciju f[x] čiji je input lista. Ako je argument lista realnih brojeva f[x] treba da izračuna sumu kubova elemenata te liste liste. Ukoliko se lista sastoji samo od celih brojeva, onda f[x] treba da izračuna sumu kvadrata brojeva u toj listi. Najzad, za bilo koju drugu listu, samo se saberu elementi liste.

Izračunajte

f[{10.,5.}]

f[{10,5}]

f[{10,5/9}]

Ideja rešenja

Clear[f]

f[x:{_Real..}]:=Total[(x^3)]

f[x:{_Integer..}]:=Total[(x^2)]

f[x_List]:=Total[x]

f[{10,5/9}]

f[{10,5}]

f[{10.,5.}]

2C

Napisati funkciju funk[n] gde je n pozitivan ceo broj koja radi sledeće. Ona mapira funkciju Sinc (primetimo da to nije Sin, nego Sinc), na listu prvih n pozitivnih parnih brojeva. Kada je n jednako 5 lista ovih brojeva bi, na primer, bila jednaka:

{2,4,6,8,10}

Dobijenu listu funkcija funk onda grafički predstavlja u crvenoj boji (koristimo ListLinePlot za grafiku), uz PlotRange koji treba da prikazuje sve tačke. Output treba da bude taj grafik. Naći:

funk[100]

Ideja rešenja

Clear[func]

func[n_]:=ListLinePlot[Module[{lista=2Range[n]},Map[Sinc,lista]],PlotStyle->Red,PlotRange->All]

func[100]

3C

Napisati čistu funkciju jedne vektorske promenljive u 3 dimenzije koja prvu komponentu vektora diže na kvadrat, drugu komponentu diže na kub a treću na četvrti stepen a onda sva tri broja sabira. Mapirajte onda tu funkciju na listu 100 trojki slučajnih brojeva od 0 do 10. Ta lista može biti nešto ovako

{{3,2,1},{7,8,2}...}

Ideja rešenja

Ta čista funkcija je

((#[[1]])^2)+((#[[2]])^3)+((#[[3]])^4)&

Ovako generišemo slučajne trojke

trojke=RandomInteger[10,{100,3}]

Ovako primenjujemo čistu funkciju na te trojke

Map[((#[[1]])^2)+((#[[2]])^3)+((#[[3]])^4)&,trojke]

4C

Generisati 100 parova slučajnih brojeva. Svaki broj je od 1 do 10. Nazovite tu listu lista1. Napravite sledeće transformacije te liste. Prvo, ukoliko je prvi element u paru veći od drugog, onda ga permutujte tako da dobijemo da je svaki par brojeva sortiran od manjeg ka većem. Drugo, posle drugog elementa tako transformisane liste, dodajte geometrijsku srednju vrednost para. Naime, ukoliko su elementi u paru {3,4}, geometrijska srednja vrednost je

(Sqrt[3 4])

pa bi onda taj par postao trojka

{3,4,(Sqrt[3 4])}

Takvu novu listu nazovite lista2. Napravite je od početne liste lista1 putem ovih transformacija.

Ideja rešenja

lista1=RandomInteger[{1,10},{100,2}]

Sort/@lista1/.{x_,y_}:> {x,y,(Sqrt[x y])}

4. Grupa

2D

Napravite parove tačaka tako da je prvi element u paru od 1 do 100 a drugi od 100 do 1. Ovako bi izgledali ti parovi.

{{1,100},{2,99},...{100,1}}

Nazovite tu listu, lista1. Napišite funkciju kvadKoren[x] koja računa kvadratni koren sume kvadrata liste x (to je dužina vektora x). Mapirajte tu funkciju na lista1. Treba da dobijete 100 vrednosti (dužina vektora {1,100}, {2,99} itd).

Ideja rešenja

Prvo treba da generišemo listu

{1,100},{2,99},{3,98},...,{100,1}

lista1={Range[100],Reverse[Range[100]]}\[Transpose]

kvadKoren[x_]:=Norm[x]

kvadKoren/@lista1

4D

Napravite funkciju slucajna[n] koja će, prvo, praviti slučajni uzorak sa ponavljanjem dužine n od liste uzastopnih brojeva od 1 do n, i za taj uzorak izračunati vrednost funkcije
 ((x^3)-4 x +5)/1000. Funkcija treba da, onda, nacrta grafik tih tačaka koristeći ListLinePlot. Naći:

slucajna[100]

Ideja rešenja

slucajna[n_]:=ListLinePlot[Function[{x},(((x^3)-4 x +5)/1000)]/@RandomChoice[Range[n],n]]

slucajna[100]