Predavanje 17: Primene 1

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]]}]

Algebarske jednačine i matematička analiza u WL

1. Algebarski izrazi

Transformacija algebarskih izraza: Expand

Sve u WL bazirano je na principu izraza (expressions). Sva standarna svojstva koja očekujemo od sistema koji treba da radi matematiku (Mathematica nije slučajno dobila taj naziv) važe manje-više i u ovom programu.

Kao prvo, ogroman broj matematičkih funkcija je već implementiran u WL i one rade predvidivo. Sva postojeća pravila se implementiraju automatski, osim ako se drugačije ne naredi:

3 Sin[(π/2)]+4 Cos[2 π]

Šta bi bilo ovo:

(((1 +(Sqrt[2])))^2)

Pošto programu nismo rekli šta sa tim da radi, a u pitanju je validni izraz, on ga ostavi tako kako je. Ako hoćemo da transformišemo izraz korisno je da probamo:

(((1 +(Sqrt[2])))^2)//Expand

Expand rastavlja algebarske izraze na pojedinačne članove. Izrazi ostaju egzaktni osim ako ne damo komandu koja će ih pretvoriti u decimalni zapis:

(((1 +(Sqrt[2])))^2)//N

Kako uprostiti (Simplify) ili razložiti (Expand) algebarske izraze

WL vam omogućava da sa lakoćom manipulišete sa algebarskim izrazima. Već smo videli kako radi  Expand. Evo još jednog primera.

Expand[(((a+b))^20)]

Možemo da rastavimo na monove i veće izraze:

Expand[(((a+b+c))^30)]

Za razliku od Expand koja rastavlja algebarske izraze na prostije činioce, Simplify pokušava da svede izraz na što manji broj članova. Na primer:

Simplify[(a^20)+20 (a^19) b+190 (a^18) (b^2)+1140 (a^17) (b^3)+4845 (a^16) (b^4)+15504 (a^15) (b^5)+38760 (a^14) (b^6)+77520 (a^13) (b^7)+125970 (a^12) (b^8)+167960 (a^11) (b^9)+184756 (a^10) (b^10)+167960 (a^9) (b^11)+125970 (a^8) (b^12)+77520 (a^7) (b^13)+38760 (a^6) (b^14)+15504 (a^5) (b^15)+4845 (a^4) (b^16)+1140 (a^3) (b^17)+190 (a^2) (b^18)+20 a (b^19)+(b^20)]

Simplify radi i sa razlomcima:

Simplify[(1/(3 (1+x)))-((-1+2 x)/(6 (1-x+(x^2))))+(2/(3 (1+(1/3) (((-1+2 x))^2))))]

Sa druge strane, ukoliko bismo probali da ponovo razbijemo ovaj izraz i dobijemo prethodni, to ne bi radilo.

Expand[(1/(1+(x^3)))]

Izdvajanje članova određenog tipa pomoću Collect

Pretpostavimo da želimo da sakupimo sve članove nekog izraza i izraze propocionalne x, (x^2) i td. Za to možemo da koristimo Collect.

izraz=Collect[(((1+a+x+y))^4),{x,y}]

izraz=Collect[(((1+a+x))^4),x]

Ako želimo da izdvojimo samo član koji je proporcionalan x jedan način da to uradimo je pomoću funkcije Part:

Part[izraz,6][[1]]

Tu je, međutim, važno znati koji je redni broj člana koji nam treba. Ako nećemo da nagađamo oko toga, isto možemo da postignemo i koristeći oblike (tražimo članove koji imaju oblik nešto puta x gde god da se pojave):

Cases[izraz,Times[_,x],Infinity]

Proverimo kako to radi za različite stepene x, od 1 do 3:

Table[Cases[izraz,Times[_,(x^n)],Infinity],{n,3}]

Kako bismo mogli da izvučemo član koji je proporcionalan (x^4)? To bi bilo (po obliku, vidimo da to nije isto što Times[_,(x^4)]):

TreeForm[izraz]

Cases[izraz,(x^4),Infinity]

Transformacije algebarskih izraza pomoću Replace

Pretpostavimo da imamo neki algebarski izraz, na primer (((a+b))^3) i hoćemo da u tom izrazu b zamenimo sa (((1+x))^2) +7. Najlakši način da se to uradi lokalno jeste

(((a+b))^3)/.b-> (((1+x))^2)+7

Možemo zameniti i više različitih izraza

(((a+b))^3)/.{b-> (((1+x))^2)+7,a-> 3+x}

A evo i primera sa razlomkom. Pretpostavimo da u izrazu

((2+3r-a)/(1-r+4 b))

želimo da r-2 bude zamenjeno sa a+b. Ovo dole ne bi radilo jer r-2 nije oblik koji može da se nađe u levoj strani izraza

((2+3r-a)/(1-r+4 b))/.{r-2-> a+b}

Ali, ovo bi radilo, jer oblik r postoji kao deo izraza na levoj strani:

((2+3r-a)/(1-r+4 b))/.{r-> a+b+2}

Evo šta dobijemo ako upotrebimo Simplify

Simplify[%]

Još o transformacijama algebarskih izraza

Razmotrimo sada šta bi se dobilo ukoliko želimo da prvo transformišemo a onda uprostimo sledeći algebarski izraz

(((a+b))^4)-(((a-2 b))^3)/.{a->1+t,b->t-7}//Expand

(((a+b))^4)-(((a-2 b))^3)/.{a->1+t,b->t-7}

Primenimo na to Simplify:

Simplify[%]

Možemo da probamo da to dodatno uprostimo tako što bismo sada uradili Expand

Expand[%]

To bismo isto dobili i ukoliko odmah primenimo Expand

Expand[(((a+b))^4)-(((a-2 b))^3)/.{a->1+t,b->t-7}]

Pretpostavimo da želimo da izvućemo samo koeficijent koji množi (t^2) u ovom izrazu. Kako to možemo da uradimo pomoću Cases? Prvo izvucimo ceo monom

(((a+b))^4)-(((a-2 b))^3)/.{a->1+t,b->t-7}

Cases[(((a+b))^4)-(((a-2 b))^3)/.{a->1+t,b->t-7},Times[koef_ ,(t^2)],Infinity]

Expand[(((a+b))^4)-(((a-2 b))^3)/.{a->1+t,b->t-7}]

Cases[Expand[(((a+b))^4)-(((a-2 b))^3)/.{a->1+t,b->t-7}],Times[koef_ ,(t^2)],Infinity]

A onda i odgovarajući koeficijent

%/.List[Times[koef_,(t^2)]]:> koef

Izračunavanje buduće vrednosti novčanog toka

Pretpostavimo da imamo 500 evra i da smo ih oročili na godinu dana. Kamata je 3 posto godišnje i obračunava se jednom mesečno. Koliko ćemo imati novca posle jedne godine ako ne podižemo ništa sa računa? U pitanju je izračunavanje buduće vrednosti novca, veoma korisno u životu čak i ako niste ekonomista. Evo par načina da to uradimo. Jedan je sledeći. Pošto je godišnja kamata 0.03, a obračunava se mesečno, mesečna kamata je 0.03/12. Stoga je na računu posle godinu dana:

bv=500 (((1+(0.03/12)))^12)

Razlog zašto se to tako izračunava jeste da je zapravo mesec sada elementarni period vremena za koji sve računamo, a imamo 12 meseci za koje treba da računamo i sve kamate na kamatu. Ako želimo, možemo prvo naći opštu formulu (za proizvoljnu godišnju kamatnu stopu r) pa onda izračunati njenu vrednost za konkretnu r. Na primer:

bv=500 (((1+(r/12)))^12)

a onda i ubaciti i konkretnu vrednost

bv/.{r-> 0.03}

Možemo, naravno, koristiti i veći stepen slobode, pa imati kao opšte brojeve sve promenljive. Ako je broj godina oročavanja T, a broj koliko puta obračunavamo kamatu godišnje jednak n, onda ćemo imati nešto ovako:

buducaVrednost=orocenaSuma (((1+(godisnjaKamata/n)))^(T n))

Buduća vrednost jednog novčanog toka (nastavak)

Ako nas zanima koliko bismo novca imali na racunu da smo našu sumu od 500 evra oročili na 3 godine, godišnja kamata je 3.5 posto, a kamata se obračunava 12 puta godišnje, odnosno jednom mesečno, dobili bismo sledeću sumu:

buducaVrednost/. {orocenaSuma-> 500,godisnjaKamata-> 0.035,n-> 12,T-> 3}

Naravno, možemo da umesto varijable buducaVrednost napravimo funkciju koja će raditi to isto.

Clear[buducaVrednost]

buducaVrednost[orocenaSuma_,godisnjaKamata_,n_,T_]:=orocenaSuma (((1+(godisnjaKamata/n)))^(T n))

U tom slučaju, buduću vrednost obračunavamo ovako:

buducaVrednost[500,0.035,12,3]

Izračunavanje kamate na kamatu

Razmotrimo sada opšti izraz vezan za izračunavanje buduće vrednosti jednog novčanog toka. Radi jednostavnosti pretpostavimo da je kamata k za recimo 1 mesec, i da treba da nađemo buduću vrednost novca posle četiri meseca. U tom slučaju:

bv=orocenaSuma (((1+k))^4);

U pitanju je polinom po k. Da bismo to videmo rastavimo ga na monome:

Expand[bv]

Vidimo da se buduća vrednost sastoji od glavnice koju dobijemo, 4 mesečne kamate na glavnicu (to se zove prosta kamata), kao i kamate na kamatu. Kamatu na kamatu dobijamo kao razliku buduće vrednosti novca i sume glavnice i proste kamate.

Expand[bv]-(orocenaSuma+4 k orocenaSuma)

Sada želimo da napišemo funkciju koja izračunava kamatu na kamatu za novčani tok uložen na T godina, sa kamatnom stopom godisnjaKamata, ukoliko se kamata izračunava n puta godišnje.

Clear[kamataNaKamatu, orocenaSuma, n,godisnjaKamata,T]

kamataNaKamatu[orocenaSuma_,godisnjaKamata_Real,n_Integer,T_]:=orocenaSuma (((1+(godisnjaKamata/n)))^(T n))-orocenaSuma-godisnjaKamata*orocenaSuma *T

Numerični primeri

U našem prethodnom slučaju, ukoliko smo 500 evra po 3.5 godišnje oročili na 3 godine, a kamata se obračunava mesečno, dobili bismo sledeći iznos kamate na kamatu:

kamataNaKamatu[500,0.035,12,3]

Indijanci su prodali Menhetn za 5 dolara Holađanima 1657. Ukoliko su tu sumu mogli da ulože po kamati od 10 posto godišnje (mesečno ukamaćenje), koliku bi sumu sada imali, i kolika bi bila kamata na kamatu. Imali bi na računu sada:

buducaVrednost[5,0.1,12,2017-1657]

Izraženo u milijardama dolara, ovaj broj je

buducaVrednost[5,0.1,12,2017-1657]/(10^9)

Znači, vrednost bi bila skoro 19 triliona dolara. Kamata na kamatu bi bila praktično celokupna vrednost (setimo se da je početna suma samo 5 dolara).

kamataNaKamatu[5,0.1,12,2017-1657]/(10^9)

Ukoliko bi mogli da oroče samo po 3.5 posto godišnje,

kamataNaKamatu[5,0.035,12,2017-1657]

vrednost bi bila za mnogo redova veličine manja!

Buduća vrednost više novčanih tokova

Pretpostavimo da želimo da nađemo vrednost novčanih tokova u nekom trenutku ukoliko smo danas (godina 0), u godini 1, i u godini 2 imali novčane tokove c0, c1, i c2, respektivno. Ukoliko se u godini dana ostvaruje prihod od r po uloženom evro za projekte takvog rizika, koliko bi bila suma koju bismo imali na kraju 0, 1. i 2. godine. To dobijamo koristeći FoldList:

FoldList[#2+#1(1+r)&,{c0,c1,c2}]

Neka je novčani tok danas ulaganje (negativni novčani tok) od 32000 evra, pozitivan novčani tok u godini 1 je 16000, a u godini 2 je jednak 21000. Ukoliko je oportunitetni trošak r jednak 13 posto godišnje, onda je neto buduća vrednost projekta u godini 2 jednaka

Fold[#2+#1(1+r)&,{c0,c1,c2}]

Fold[#2+#1(1+r)&,{c0,c1,c2}]/.{c0->-32000,c1-> 16000,c2-> 21000,r-> 0.13}

Napišimo sada funkciju koja izračunava buduću vrednost grupe novčanih tokova u trenutku isplate poslednjeg novčanog toka. Po defoltu, prvi novčani tok je isplaćen (ili uložen) u trenutku 0.

nbv[{-32000,16000,21000,1000},0.13]

Clear[nbv]

nbv[novcaniTokovi_List,r_]:=Fold[#2+#1(1+r)&,novcaniTokovi]

nbv[{-32000,16000,21000},0.13]

Sadašnja vrednost grupe novčanih tokova (NSV)

NSV je fer vrednost nekog projekta (grupe novčanih tokova) ukoliko bismo taj projekat želeli da kupimo danas (u trenutku 0). U slučaju projekta koji smo prethodno razmatrali, NSV bi bila:

netoSadasnjaVrednost=c0+(c1/(1+r))+(c2/(((1+r))^2));

netoSadasnjaVrednost/.{c0->-32000,c1-> 16000,c2-> 21000,r-> 0.13}

Vidimo da je neto sadašnja vrednost projekta negativna. To znači da u takav projekat ne bi trebalo investirati. Previše je skup, odnosno ili košta previše novca danas ili je previše rizičan pa je oportunitetni trošak prevelik. Kako nsv zavisi od oportunitetnog trošta r?

netoSadasnjaVrednost/.{c0->-32000,c1-> 16000,c2-> 21000}

Predstavimo grafički ovu zavisnost:

Plot[-32000+(21000/(((1+r))^2))+(16000/(1+r)),{r,0,0.18}]

Vidimo da je maksimalni oportunitetni troštak za koji se još isplati uložiti ovaj novac negde malo manji od 10 posto godišnje (to je tačka preseka sa x osom, odnosno nula funkcije). To je interna stopa prinosa (Internal Rate of Return ili IRR).

Funkcija za izračunavanje neto sadašnje vrednosti grupe novčanih tokova

Koristeći Fold napišimo funkciju koja izračunava, za proizvoljne vrednosti i broj novčanih tokova, njihovu sadašnju vrednost. Omogućićemo korisniku da odredi kada počinje prvi novčani tok (da li u trenutku 0, po defoltu, ili u nekom drugom trenutku, n). Pođimo od novčanih tokova {c0, c1 c2}. Njihova sadašnja vrednost je data izrazom:

Fold[#1+#2/(1+r)&,{c0,c1,c2}]//Expand

Sada možemo da definišemo funkciju koja izračunava neto sadašnju vrednost, po defoltu, ovako:

Clear[nsv]

nsv[cf_List,r_]:=Fold[#2+#1/(1+r)&,Reverse[cf]]

Za novčane tokove iz prethodnog primera dobijamo da je:

nsv[{-32000,16000,21000},0.13]

Ukoliko želimo da definišemo da je prvi novčani tok u trenutku n (a ne nula kao po defoltu), to možemo da uradimo, na primer, tako što dodefinišemo funkciju nsv i dodamo još argument n

nsv[cf_List,r_,n_Integer]/;n>0:=(1/(((1+r))^n)) Fold[#2+#1/(1+r)&,Reverse[cf]]

Na primer

nsv[{c1,c2,c3,c4},r,1]//Expand

Primer: Vrednovanje obveznice sa fiksnom kamatnom stopom

Obveznica je dugovna hartija od vrednosti. Vlasnik obveznice sa fiksnom kamatnom stopom r, svake godine (počevši od godine 1) dobija kamatu r F (zove se kupon), a na kraju poslednju kamatu i glavnicu F. Pre izbijanja krize grčkog duga kupili smo grčku državnu obveznicu sa kamatom 5 posto godišnje i glavnicom 100 evra. Kolika je vrednost te obveznice ukoliko je diskontna odnosna tržišna diskontna stopa 5 posto, kao i ukoliko je ta stopa 21 posto. Vreme do dospeća je 15 godina. Prvo nalazimo novčane tokove za ovu obveznicu. Kuponi su:

ConstantArray[0.05 100,15]

Glavnica se isplaćuje tek na kraju. To se može predstaviti kao vektor sa 14 nula i na kraju brojem 100.

PadLeft[{100},15]

tokoviObveznice=ConstantArray[0.05 100,15]+PadLeft[{100},15]

nsv[Table[c,15],0.05,1]==100

Solve[{10.37965803818059` c==100},{c}]

Table[c,15]

U mirno vreme, kada je diskontna stopa bila 5 posto, ova obveznica bi vredela:

nsv[tokoviObveznice,0.05,1]

Vidimo da kada je kamatna stopa obveznice jednaka diskontnoj, tržišna vrednost obveznice je jednaka glavnici. Sa druge strane, posle izbijanja krize, vrednost obveznice dramatično pada:

nsv[tokoviObveznice,0.21,1]

2. Rešavanje algebarskih jednačina

Jedna jednačina sa jednom nepoznatom

Pođimo od najjednostavnijeg primera, a naime, od jedne jednačine sa jednom nepoznatom. U finansijama i ekonomiji ti problemi su česti. Pretpostavimo, recimo, da nas zanima da rešimo linearnu jednačinu (po x):

a x +b ==0

Primetimo da se jednačine pišu uvek sa logičkim (dvojnim) znakom ==, a ne sa znakom prisvajanja =. To je jedna od najčešćih grešaka koje se prave prilikom rešavanja jednačina u WL. Ukoliko mislimo da jednačinu možemo da rešimo egzaktno, koristimo Solve. Sintaksa je Solve[{ lista jednačina},{lista promenljivih}]

Solve[{a x +b ==0},{x}]

Pretpostavimo da želimo da kupimo kola na kredit i da hoćemo da izračunamo ratu za kredit. Kamata je fiksna, plaća se mesečno i na godišnjem nivou je 9 posto. FInansiramo sumu od 10000 evra, a kredit treba da isplatimo u 48 jednakih rata. Koliko iznosi jedna rata ukoliko isplata kredita počinje prvog narednog meseca. Nepoznatu mesečnu ratu c nalazimo iz uslova da je neto sadašnja vrednost kredita jednaka finansiranoj sumi (diskontuje se korišćenjem kamatne stope od 9 posto godišnje:

nsv[ConstantArray[c,48],0.09/12,1]==10000

Odatle nalazimo da je mesečna rata ovog kredita jednaka

Solve[{40.1847818851796` c==10000},{c}]

Rešavanje nelinearnih jednačina

Ukoliko ste kao ja, ne želite ništa da memorišete. Jedno od dosadnih pravila jeste pravilo za rešavanje kvadratne jednačine. U WL možemo da ga dobijemo odmah, i to u opštim brojevima:

sol1=Solve[{c+b x+a (x^2)==0},{x}]

Ukoliko želimo da izdvojimo samo jedno rešenje, na primer prvo, to možemo da uradimo ovako:

sol1[[1]]

Jedan način da izdvojimo samo rešenje, bio bi

sol1[[1]]/.List[x-> nesto_]:> nesto

Pretpostavimo da želite da rešite jednačinu za neke konkretne brojeve: 3 (x^2) +2 x -1 == 0. Jedan način da se to uradi je da se ubace konkretne vrednosti u opšte rešenje sol1:

sol1/.{a->3,b-> 2,c-> -1}

Drugi način da se uradi to isto jeste:

Solve[-1+2 x+ 3(x^2)==0,x]

Naravno možete to da uradite i grafički

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

Još o rešavanju nelinearnih jednačina

Ovako možemo da označimo nule funkcije na grafiku. Mesh nam omogućava da vidimo neke tačke (u ovom slučaju tačke nivoa 0, odnosno nule funkcije). MeshFunction definiše funkciju za koju hoćemo da crtamo tačke crveno, a MeshDirective kaže kako te tačke treba da budu nacrtane (crvenom bojom i veličinom 0.03).

Plot[-1+2 x+ 3(x^2),{x,-2,2},MeshFunctions->{-1+2#+3((#)^2)&},Mesh->{{0.}},MeshStyle->Directive[PointSize[0.03],Red]]

Možemo da rešimo i komplikovanije jednačine. Na primer:

Solve[{5-x+2 (x^2)+3 (x^3)==0},{x}]

To baš ne deluje pregledno. Možemo, umesto toga, da potražimo numeričko rešenje pomoću NSolve:

sol2=NSolve[5-x+2 (x^2)+3 (x^3)==0,x]

Tu se pojavljuju kao rešenja i kompleksni brojevi. Ako želimo samo realne brojeve možemo ih izdvojiti ovako:

Cases[sol2,{x-> _Real}]

ili preko opcije Reals prilikom rešavanja jednačine:

NSolve[5-x+2 (x^2)+3 (x^3)==0,x, Reals]

Primeri izračunavanje interne stope prinosa

Pretpostavimo da je tržišna cena one iste grčke obveznice 50 evra. Kolika je interna stopa prinosa, odnosu, u terminu obveznica to je prinos do dospeća. Ona se određuje kao ona tržišna diskontna stopa y za koju je neto sadašnja vrednost obveznice jednaka tržišnoj vrednosti. Moramo da rešimo jednačlinu:

nsv[tokoviObveznice,y,1]//Expand

nsv[tokoviObveznice,y,1]==50//Expand

U pitanju je jednačina 15. stepena. Egzaktnog rešenja neće biti. Možemo da probamo

sol3=NSolve[{nsv[tokoviObveznice,y,1]==50},{y}]

Izvucimo samo realna rešenja:

Cases[sol3,{y-> _Real}]

To lako možemo videti i grafički ukoliko nacrtamo grafik funkcije nsv - 50. To će biti tačka koja preseca y osu.

Plot[nsv[tokoviObveznice,y,1]-50,{y,0.05,0.25}]

Plot[Evaluate[nsv[tokoviObveznice,y,1]-50],{y,0.05,0.25}]

Naći internu stopu prinosa za projekat koji smo prethodno razmatrali:

sol4=Solve[nsv[{-32000,16000,21000},r]==0,{r}]

Izvucimo samo pozitivno rešenje i nađimo mu numeričku vrednost:

Cases[sol4,{r->nesto_}/;nesto>0]//N

Sistemi linearnih jednačina

Još od osnovne škole nas gnjave sa time kako da nađemo rešenje sistema linearnih jednačina. U WL to radimo sa lakoćom. Pretpostavimo da želimo da nađemo rešenje sistema jednačina x+2 y ==10, 2 x +y ==7. To možemo da radimo na više načina. Prvi je grafički, koristeći ContourPlot funkciju:

ContourPlot3D[{x+2 y+3 z==12,2 x+y-z==7,-x +y+z==3},{x,0,10},{y,0,10},{z,0,2}]

ContourPlot[{x+2 y==10,2x+y==7},{x,-5,10},{y,-5,10}]

Sa slike vidimo da za ovaj sistem jednačina rešenje postoji. Ukoliko tražimo egzaktno rešenje koristimo Solve funkciju.

Solve[{x+2 y==10,2 x+y==7},{x,y}]

Naravno, možemo da probamo da rešimo i linearne jednačine sa više promenljivih:

resenje1=Solve[{x+2 y+3 z==12,2 x+y-z==7,-x +y+z==3},{x,y,z}]

Kako znamo da je to rešenje gornjeg sistema jednačina? Recimo, tako što to rešenje podmetnemo u početni sistem. Na primer, šta ćemo dobiti ako primenimo:

resenje1[[1]]

na levu stranu prve, druge i treće jednačine:

{x+2 y+3 z,2 x+y-z,-x +y+z}/.resenje1[[1]]

Određivanje ravnotežne cene i količine na osnovu preseka krive ponude i tražnje

Poznato je da se ravnotežna cena i količina neke robe na tržištu mogu dobiti izjednačavanjem u preseku krive ponude i krive tražnje. Pretspotavimo da je kriva tražnje

Qd==20-(p^2)

a kriva ponude

Qs==11+8 p

Predstaviti grafički krive ponude i tražnje i naći tačku preseka, odnosno ravnotežu na tržištu.

ContourPlot[{q==20-(p^2),q==11+8 p},{p,0.1,3},{q,0.1,40},PlotLegends->{"tražnja","ponuda"}]

Ravnotežna tačka se nalazi na osnovu izjednačavanja ponude i tražnje

ponudaTraznja=Solve[{q==20-(p^2),q==11+8 p},{p,q}]

Jasno je da je samo drugo rešenje ono ispravno. Jednostavan način da izdvojimo rešenje sa pozitivnim vrednostima bi bio:

Solve[{q==20-(p^2),q==11+8 p},{p,q}][[2]]

ili

Cases[ponudaTraznja,{_->pos1_/;pos1>0,_->pos2_/;pos2>0}]

Primeri iz geometrije

Naći stranice pravougaonika čiji je obim jednak 14 a površina jednaka 12. Da bismo to rešili, koristimo sledeći sistem jednačina

Solve[{a b==12,2 a+2 b==14},{a,b}]

Da li postoje tačke preseka jednične kružnice sa centrom u tački (-1/2, 0} i jedinične kružnice sa centrom u koordinatnom početku. Ako da, naći ih.

Prvo pogledajmo grafički:

ContourPlot[{(x^2)+(y^2)==1,(((x+(1/2)))^2)+(y^2)==1},{x,-2,2},{y,-2,2}]

Jasno je da postoji dva rešenja. Nalazimo ih ovako:

Solve[{(x^2)+(y^2)==1,(((x+(1/2)))^2)+(y^2)==1},{x,y}]

3. Nejednačine

U ekonomiji i finansijama nejednačine se tipično koriste da se definiše oblast u kojoj se traži optimum neke funkcije, npr, budžetska ograničenja. Takođe, potrošnja nikad nije negativna. Za rešavanje nejednačina koristimo Reduce:

Reduce[{3 + 2*x < 8}, {x}]

Dalje se fokusiramo na grafičko predstavljanje nejednakosti, korisno ako želimo da znamo kako izgleda oblast definisanosti nekog problema optimizacije.

Kako izgleda oblast definisana putem nejednačine (x^2)+2 (y^2) <= 1? Ovde x i y mogu biti proizvoljne vrednosti. Vidimo da je to konveksan skup (ukoliko je f konveksna, skup tipa f <= nesto je uvek konveksan).

RegionPlot[x^2+2y^2<=2,{x,-2,2},{y,-2,2}]

Sa druge strane, pošto funkcija x^2+y^3 nije konveksna, onda ni skup x^2+y^3<2 neće biti konveksan.

RegionPlot[x^2+y^3<2,{x,-2,2},{y,-2,2}]

Najzad, presek konveksnog i nekonveksnog skupa nije obavezno konveksan

RegionPlot[x^2+y^3<2&&x+y<1,{x,-2,2},{y,-2,2}]

dok je presek dva konveksna skupa konveksan

RegionPlot[x^2+y^2<2&&x+y<1,{x,-2,2},{y,-2,2}]

4. Ukratko o limesu (Limit)

Limit[((Sin[x])/x),x-> 0]

Plot[((Sin[x])/x),{x,-0.1,0.1}]

Pojam limesa

U ekonomiji, limesi se primenjuju više zato što su izvodi i integrali definisani preko limesa nego samo po sebi. Ipak nije loše imati makar malo pojma kako se sa njima radi. Najlakše se shvati pojam limesa preko toga čemu teži niz 1/n. Što je veće n, taj broj je manji i teži nuli. Naime:

Limit[(1/n),n-> ∞]

Beskonačnost se piše kao Esc inf Esc

Ako imamo razlomak (((n^2)-3n)/(4 (n^2) +50)) za veliko n u gornjem delu razlomka dominira prvi član, (n^2), dok u drugom dominira 4  (n^2). Stoga mora biti

Limit[(((n^2)-3n)/(4 (n^2) +50 ))  ,n->∞]

Ništa se ne bi promenilo ako bismo imali  (((n^2)-3n)/(4 (n^2) +50 n )) jer bi opet i gore i dole dominirao prvi član. Međutim

Limit[(((n^2)-3n)/(4 (n^2) +50 (n^3) ))  ,n->∞]

jer sada drugi član dole počne da dominira.

Kontinualno obračunata kamata

Jedan koristan limes u ekonomiji je limes kontinualnog obračuna kamate. Dakle, ako kontinualno obračunavamo kamatu imamo da

Limit[(((1+(r/n)))^n),n-> ∞]

Pretpostavimo da smo pozajmili 500 evra u banci. Kamata je 9 posto godišnje, i obračunata je kontinualno. Koliko bi bio naš dug posle godinu dana? Uporedite sa slučajem kada je ista kamata obračunata mesečno. Što se tiče mesečnog obračuna kamate, dobili bismo

bvKontinualno=500Exp[0.43]

bvMesecno=500 (((1+(0.43/12)))^12)

bvMesecno=500 (1+0.43)

bvMesecno=500 (((1+(0.09/12)))^12)

dok bi u slučaju kontinualnog obračuna dug bio:

bvKontinualno=500Exp[0.09]

Dug bi bio veći ukoliko bi banka kontinualno obračunavali kamatu. Za zadatu nominalnu kamatnu stopu, efektivna kamatna stopa je najveća ukoliko kamatu obračunavamo kontinualno, a najmanje ako je obračunavamo jednom godišnje.

5. Izvod funkcije

Kako se računa prvi izvod izvod

Jedan od najkorisnijih pojmova u matematici je pojam izvoda. U ekonomiji, kad god pričamo o marginalnoj korisnosti, marginalnom trošku, ili analizi osetljivosti mi zapravo računamo izvod neke funkcije. U WL to se radi trivijalno, koristeći funkciju D (od Derivative).

Izvod je po definiciji limes količnika infinitezimalne promene vrednosti funkcije u odnosu na vrednost nezavisne promenljive.

Limit[(f[x+Δx]-f[x])/Δx,Δx-> 0]//TraditionalForm

Nađimo izvod funkcije (x^2) po x. Trebalo bi svi da se sećamo da je to 2 x. Ali, ne moramo da pamtimo, naravno. Evo kako bismo to izračunali. Funkcija se zove D (od Derivative ili izvod). Prvo ide funkcija koju diferenciramo pa posle lista promenljivih po kojima diferenciramo.

D[(x^2),x]

Δx

Po gornjoj definiciji, ukoliko je f = (x^2), imamo da je (f[x + Δx] - f[x])/Δx jednaka:

Expand[(((x+Δx))^2)-(x^2)]

Expand[(((x+Δx))^2)-(x^2)]/Δx

Simplify[Expand[(((x+Δx))^2)-(x^2)]/Δx]

U limesu kada Δx -> 0 dobijamo 2 x.

Primeri izračunavanja prvog izvoda i izvoda višeg reda

Primetimo da se izvod složene funkcije računa ovako:

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

Evo prvih izvoda nekih elementarnih funkcija

D[#,x]&/@{(x^n),Log[x],Exp[x],Sin[x],Cos[x],(a^x)}

Ovde umesto slota dođe jedna po jedna funkcija kojoj računamo prvi izvod.

Prvi izvod možemo da napišemo i ovako (ovo će biti korisno za posle):

D[(x^2),{x,1}]

Cifra 1 tu govori da je u pitanju upravo prvi izvod. Drugi izvod bi onda bio:

D[(x^2),{x,2}]

Evo kako možemo da izračunamo druge i treće izvode elementarnih funkcija

D[#,{x,2}]&/@{(x^n),Log[x],Exp[x],Sin[x],Cos[x],(a^x)}

D[#,{x,3}]&/@{(x^n),Log[x],Exp[x],Sin[x],Cos[x],(a^x)}

Korisno je znati i da je izvod nultog reda definisan i jednak samoj funkciji

D[(x^2),{x,-1}]

D[(x^2),{x,0}]

Apsolutna averzija prema riziku: izračunavanje zakrivljenosti funkcije korisnosti

U finansijskoj ekonomiji, odnos investora prema riziku iskazuje se pomoću takozvanih izvedenih funkcija korisnosti u[w]. Ovde je w bogatstvo investitora. Onda u[w] meri količinu satisfakcije investitora od strukture svog investicionog portfolija.

Prvi izvod funkcije u po w je uvek pozitivan pošto svako preferira više u odnosu na manje novca. Međutim, investitor koji želi da bude kompenzovan za rizik koji preuzima ima funkciju korisnosti sa negativnim drugim izvodom. Takve funkcije nazivaju se konkavnim. Što je funkcija zakrivljenija odnosno konkavnija, to investitor ima veću averziju prema riziku.

Apsolutni koeficijent averzije AKAR = - u’’[w]/u’[w] meri tu averziju odnosno meri krivinu funkcije. Ukoliko je AKAR rastuća funkcija w, što je čovek bogatiji to će manje novca (u apsolutnom iznosu) ulagati u rizične hartije i obrnuto. Evo kako izgledaju izrazi za AKAR za tipične funkcije korisnosti

{Log[w],((w^(1-γ))/(1-γ)),-((Exp[-α w])/α),w-k (w^2)/2}

AKAR=-D[#,{w,2}]/D[#,{w,1}]&/@{Log[w],((w^(1-γ))/(1-γ)),-((Exp[-α w])/α),w-k (w^2)/2}

D[AKAR,w]

Kod prve dve funkcije korisnosti, investitor ulaže više para u rizične hartije što je bogatiji. Takvo ponašanje je za očekivati. U 3. slučaju on uvek ulaže istu količinu novca, dok u poslednjem slučaju čak smanjuje svoje rizične investicije što je bogatiji. Ako neko ima eksponencijalnu funkciju korisnosti, on će optimalno investirati, kažimo, 1000 evra u akcije a sve ostalo držati u kešu bilo da je siromah ili Bill Gates. To nije realistično.

Vizualizacija funkcija i njihovih izvoda pomoću kul Manipulate

Na naredne dva slajda želim da vam pokažem kako da vizualizujemo funkcije i njihove izvode, ali i da naučimo nešto korisno o Manipiulate. Na prvom grafiku korisnik ima mogućnost izbora funkcije pomoću promenljive func. Red izvoda kontroliše promenljiva n.

Manipulate[Plot[Evaluate[D[func@x,{x,n}]],{x,0,4 π}],{func,{Sin,Cos,Exp,Tan}},{n,Range[0,3]}]

Ovo radi kad imamo predefinisane glave funkcije,odnosno funkcije kao što su Sin, Cos, itd. Možemo nešto slično da uradimo i sa bilo kom drugom funkcijom. Za to nam treba da definišemo listu čistih funkcija. Međutim, postoji jedan problem. Naime, imena dugmića imaju naziv koji odgovara glavi, npr Function[{t},t-2 (t^2)] a ne samo t-2 (t^2). To je problematično.

Manipulate[Plot[Evaluate[D[func@x,{x,n}]],{x,-4 π,4 π},PlotRange-> All],{func,{Function[{t},t-2 (t^2)],Function[{t},t Sin[t]],Function[{t},(t^2)Sin[t]]}},{n,Range[0,3]}]

Da bismo se toga rešili, za svaku od funkcija uvedemo nadimak (alias) ovako Function[{t},t-2 (t^2)]->t-2 (t^2), i slično za ostale. Sada dugmići izgledaju bolje:

Manipulate[Plot[Evaluate[D[func@x,{x,n}]],{x,-4 π,4 π},PlotRange-> All],{func,{Function[{t},t-2 (t^2)]->t-2 (t^2),Function[{t},t Sin[t]]->t Sin[t],Function[{t},(t^2)Sin[t]]->(t^2) Sin[t]}},{n,Range[0,3]}]

Limit[Log[(x^2)+3 x +7]/(Sqrt[x]),x-> ∞]

Limit[(n^n)/Exp[n],n-> ∞]

D[{Log[(x^2)+3 x +7],Exp[-(x^2)]},{x,1}]

Nastavak

Ali, ovaj kod možemo dalje da unapredimo. Jedna od stvari koji nije idealna jeste da prethodni izraz sadrži puno ponavljanja istog oblika. Naime, lista

{Function[{t},t-2 (t^2)]->t-2 (t^2),Function[{t},t Sin[t]]->t Sin[t],Function[{t},(t^2)Sin[t]]->(t^2) Sin[t]}

može da se, preglednije, dobije tako što mapiramo funkciju Function[{t},#]->#& na listu {t-(t^2),t Sin[t],(t^2)Sin[t]}

Function[{t},#]->#&/@{t-(t^2),t Sin[t],(t^2)Sin[t]}

Najzad, dobijamo izraz koji je lako generalisati ako želimo da promenimo listu funkcija koje želimo da predstavimo grafički:

Manipulate[Plot[Evaluate[D[func@x,{x,n}]],{x,-4 π,4 π},PlotRange-> All],{func,Function[{t},#]->#&/@{t-(t^2),t Sin[t],(t^2)Sin[t]}},{n,Range[0,3]}]

Putanja, brzina, i ubrzanje satelita prilikom kretanja oko Zemlje

Izvodi nalaze ogromne primene u raznim naukama. Prvo su uvedeni, od strane Leibnitz-a i Newton-a u fizici. Pomoću pojmova izvoda definiše se recimo, brzina kretanja tela. Evo primera.

Pretpostavimo da se neki satelit kreće tako da su njegove koordinate x i y funkcije vremena i date izrazima:

D[x[t],t]

x[t_]:=21 Cos[((2π)/24) t]

y[t_]:=17 Sin[((2π)/24) t]

Naći putanju (trajektoriju) ovog satelita (to je satelit koji za 24 sata izrotira oko Zemlje, takozvani stacionarni satelit). To možemo naći koriščenjem ParametricPlot:

Manipulate[ParametricPlot[{x[t],y[t]},{t,0,τ}],{τ,0.01,24}]

ParametricPlot[{x[t],y[t]},{t,0,24}]

Vidimo da se satelit kreće po elipsi (to je tipično slučaj). Kako da izračunamo brzinu satelita? Brzina govori o tome koliko brzo se menjaju koordinate sa vremenom. Naime, brzina je vektor i njene komponente su:

D[{x[t],y[t]},t]

Veličina vektora brzine i ubrzanje satelita

Veličina vektora brzine data je njegovom normom (dužinom). O veličini vektora govorićemo više na narednom predavanju. Za sada samo izračunajmo veličinu vektora brzine. Ona je takođe funkcija vremena i data je izrazom:

brzinaSatelita[t_]:=Norm[D[{x[t],y[t]},t]]

Sada možemo videti kako se veličina brzine satelita menja u toku 24 sata:

Plot[Evaluate[brzinaSatelita[t]],{t,0,24}]

Vidimo da je brzina satelita periodična funkcija vremena. Nije teško sagledati da je veličina brzine najmanja kada se satelit nalazi na najudaljenijim tačkama putanje (elipse) dok je najveća kada se nalazi na najbližim tačkam zemlji.

Ubrzanje je drugi izvod od funkcije koordinata. Ubrzanje govori o tome koliko brzo se menja brzina sa vremenom. U slučaju kretanja satelita, imali bismo da je veličina vektora ubrzanja data izrazom:

ubrzanjeSatelita[t_]:=Norm[D[{x[t],y[t]},{t,2}]]

Plot[Evaluate[ubrzanjeSatelita[t]],{t,0,24}]

Vidimo da je i ubrzanje periodična funkcija.

Analiza osetljivosti vrednosti projekta u odnosu na promenu oportunitetnog troska y

Pretpostavimo da želimo da investiramo u projekat koji ima sledeće novčane tokove (oportunitetni je y=0.06): početno ulaganje je 31400 evra, a pozitivni novčani tokovi u godinama 1 do 3 su, respektivno: 10000, 12000, i 19000 evra. Sadašnja vrednost projekta, to jest fer vrednost tog projekta danas, bila bi:

nsv0=nsv[{-31400,10000,12000,19000},0.06]

Ukoliko bi se oportunitetni trošak povećao za jedan procentni poen, sa 6 sa 7 procenata, nova vrednost projekta bi bila:

nsv1=nsv[{-31400,10000,12000,19000},0.07]

pa bi razlika vrednosti projekta, u apsolutnom iznosu, iznosila:

nsv1-nsv0

Procentualno, smanjenje vrednosti bi bilo jednako, stoga:

(((nsv1-nsv0))/nsv0)

Relativna promena neke funkcije f[x] u odnosu na malu promenu veličine x od Δx može se predstaviti, aproksimativno, kao proizvod te promene, Δx i prvog izvoda od logaritma funkcije f[x], to jest kao:

osetljivost= D[Log[f[x]],x]Δx

Upoređenje egzaktne promene vrednosti investicije i linearne aproksimacije osetljivosti

Izraz za osetljivost govori za koliko se procenata promeni, grubo govoreći, vrendost nekog investicionog projekta ukoliko se vrednost diskontne stope promeni za 1 procentni poen. U slučaju našeg ulaganja, osetljivost u odnosu na promenu diskontne stope od Δy=0.01 (to jest, 1 posto) bi bila izračunata približno  koristeći sledeći izraz:

D[nsv[{-31400,10000,12000,19000},y],y]

nsv[{-31400,10000,12000,19000},y]

0.01(D[nsv[{-31400,10000,12000,19000},y],y]/nsv[{-31400,10000,12000,19000},y])/.{y-> 0.06}

Dakle, vidimo da povečanje diskontne stope za jedan procentni poen dovodi do pada vrednosti projetka od preko 15 procenata. To se relativno dobro poklapa sa egzaktnom promenom vrednosti projekta. 

Poklapanje je još puno bolje ukoliko merimo osetljivost na promenu od 0.1 procenat a ne 1 procenat. U tom slučaju, egzaktna promena vrednosti bi bila

(nsv[{-31400,10000,12000,19000},0.061]-nsv[{-31400,10000,12000,19000},0.06])/nsv[{-31400,10000,12000,19000},0.06]

dok približni metod baziran na osetljivosti daje

0.001(D[nsv[{-31400,10000,12000,19000},y],y]/nsv[{-31400,10000,12000,19000},y])+((0.001^2)/2)(D[nsv[{-31400,10000,12000,19000},y],{y,2}]/nsv[{-31400,10000,12000,19000},y])/.{y-> 0.06}

Primećujemo da je linearna aproksimacija na kojoj je bazirano korišćenje prvog izvoda utoliko bolja ukoliko je promena nezavisne promenljive manja.

6. Parcijalni izvodi

Marginalni trošak

Videli smo kako se lako računaju izvodi funkcije jedne promenljive. Isto tako se lako računaju prvi i viši izvodi funkcije više promenljivih, takozvani parcijalni izvodi. U računanju parcijalnih izvoda, uvek se sve promenljive drže fiksno, odnosno tretiraju kao konstante, osim promenljive po kojoj se diferencira.

Pretpostavimo da imamo proizvodnu tehnologiju za koju je funkcija ukupnog troška data sledećim izrazom (ovde su q1 i q2 količine iskorišćenih dobara 1 i 2):

ukupniTrosak=40+(q1^2)+2 (q2^2);

Naći marginalni trošak prvog i drugog dobra ukoliko znamo da su potrošene količine ta dva dobra date sa q1-> 5 odnosno q2-> 6 jedinica, respektivno. Nađimo prvo opšti izraz za vektor marginalnih troškova

marginalniTrosak={D[ukupniTrosak,q1],D[ukupniTrosak,q2]}

Ima još načina da se uradi to isto. Na primer, ukupniTrosak možemo diferencirati (jednom) po listi promenljivih {q1,q2}. Opet dobijamo, naravno, isti rezultat kao i gore:

D[f,{{x,y},2}][[1,2]]

D[f,{{x,1},{y,1}}]

D[D[f,x],y]

Clear[x,y]

f=(x^2)+(y^2)-3x y+x+Sin[x];

D[f,{{x,y},2}]

marginalniTrosak=D[ukupniTrosak,{{q1,q2},1}]

marginalniTrosak=D[ukupniTrosak,{{q1,q2},2}]//MatrixForm

Prednost je da na ovaj način ne moramo više puta da ponavljamo izraz za D. Evo i trećeg načina:

marginalniTrosak=Grad[ukupniTrosak,{q1,q2}]

Ovde smo iskoristili pojam gradijenta i funkciju Grad koja izračunava prvi izvod neke funkcije po svim komponentava vektora koji zadamo kao drugi argument.

Numerički primer za marginalni trošak i pojam marginalne korisnosti

Za konkretne vrednost dobijamo da su marginalni troškovi dati sledećim vektorom:

marginalniTrosak/.{q1->5,q2->6}

Drugim rečima, ako smanjimo potrošnju prve komponente za jednu jedinicu, smanjićemo trošak za 10 jedinica. Sa druge strane, ukoliko bismo smanjili potrošnju druge komponente za jednu jedinicu, smanjili bismo trošak za 24 jedinice. U eri zatezanja kajša, više se, ako možemo, isplati malo smanjiti drugi input.

Još jedan primer u ekonomiji vezan za izračunavanje parcijalnih izvoda jeste marginalna korisnost. Pretpostavimo da je funkcija korisnosti data izrazom:

u=(Sqrt[c1])+2 (Sqrt[c2]);

D[u,{{c1,c2},2}]

Ukoliko je naša trenutna alokacija dobara, c1-> 4, c2 -> 3, naći marginalnu korisnost prvog i drugog dobra (odnosno za koliko bi nam se povećala korisnost ukoliko bismo povećali potrošnju prvog odnosno drugog dobra za jednu jedinicu).

marginalnaKorisnost=D[u,{{c1,c2},1}]

marginalnaKorisnost/.{c1->4,c2->3}