Programozási gyakorlatok LATEXés MATLAB Kiss Olivér Rózemberczki Benedek
Kiss Olivér és Rózemberczki Benedek András ROZEMBERCZKI . WORDPRESS . COM
A példatárban szerepl˝o feladatok és problémák saját ötletek és tapasztalatok alapján készültek, részben pedig korábbi évek vizsga soraiból építkeznek, azokra adnak részletes megoldást. A feladatgy˝ujtemény felfogható egyfajta általános, és a tárgy teljesítéséhez szükséges probléma gy˝ujteményként is (problem set). A tartalmi, helyesírási és stilisztikai hibákat a
[email protected] címen lehet jelezni. A dokumentum a LATEXprogramnyelv segítségével készült, a beágyazott programkódok listings és mcode csomagokkal készültek.
A fejezetek szerz˝oi lebontva: 1. fejezet - Kiss Olivér 2. fejezet - Kiss Olivér 3. fejezet - Kiss Olivér 4. fejezet - Kiss Olivér 5. fejezet - Kiss Olivér 6. fejezet - Kiss Olivér 7. fejezet - Rózemberczki Benedek 8. fejezet - Rózemberczki Benedek 9. fejezet - Rózemberczki Benedek 10. fejezet - Rózemberczki Benedek Els˝o változat, január 2013
Tartalomjegyzék
1
LATEX- Els˝ o lépések . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2
LATEX- Szöveges dokumentumok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3
LATEX-A Beamer használata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
4
Alapszámítások, vektorok, mátrixok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
5
Függvények, elágazások és ciklusok . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
6
2D és 3D ábrázolások . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
7
Diszkrét dinamikus modellek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
8
Nem lineáris optimalizáció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
9
Lineáris programozás . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
10
Diszkretizáció . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
1 — LATEX- Els˝ o lépések Miel˝ott elkezdenénk elkészíteni az els˝o LATEX dokumentumunkat, néhány elengedhetetlen dolgot meg kell tennünk. A LATEX tudniillik egy programnyelv, melynek megfelel˝o használatához nem elég csupán a szintaktika és a szemantika alapos ismerete, a m˝uködéshez elengedhetetlen egy megfelel˝o fordítóprogram beszerzése is. A LATEX esetében számos ingyenesen elérhet˝o fordítóprogram létezik. Ezek eltér˝o funkciókkal rendelkeznek, és mindenki megtalálhatja azt, amelynek használata számára a legkényelmesebb. Jelen jegyzetben egységesen a MiKTeX programcsomagot használjuk dokumentumaink elkészítésére. A MiKTeX programcsomag számos funkcióval rendelkezik, melyek közül számunkra a TeXworks lesz a legfontosabb. A TeXworks számos platformra (Windows, Mac és a legtöbb Linux disztribúció) önállóan is elérhet˝o, nem windows operációs rendszeren történ˝o munkához a TeXworks telepítését javasoljuk. A MiKTeX letölthet˝o a MiKTeX honlapjáról. Innen az Other Downloads fülön található MiKTeX Portable szoftver használata javasolt, melyet egyszer˝uen egy pendrivera telepítve bárhová magunkkal vihetünk. Ehhez célszer˝u egy legalább 1 GB szabad kapacitással rendelkez˝o eszközt választani, mivel a különböz˝o csomagok telepítése során jelent˝osen n˝ohet a programcsomag által elfoglalt terület. A letöltött fájl egy önkicsomagoló, exe kiterjesztés˝u fájl. A telepítéshez a telepít˝o elindítását követ˝oen adjunk meg egy, a pendriveon található különálló mappát, melybe a szoftver, illetve a kés˝obbiekben a szoftver által letöltött kiegészít˝o csomagok kerülnek. A telepít˝o automatikusan elvégzi a szükséges lépéseket. A telepítés végeztével a kiválasztott mappában elérhet˝ové válik egy miktex-portable nev˝u kötegfájl, melyre kétszer kattintva elindul a programcsomag, és a tálcán megjelenik a MiKTeX ikonja. Erre jobb egérgombbal rákattintva több lehet˝oség közül választhatunk, ezek között megtalálható a TeXworks is. Erre kattintva megnyílik a szerkeszt˝o ablak, melyben a továbbiakban dolgozni fogunk. Amennyiben a szoftver portable verzióját telepítettük, soha ne felejtsünk el a pendrive leválasztása el˝ott kilépni a MiKTeX-b˝ol, melyet a MiKTeX ikonjára jobb egérgombbal kattintva az Exit opcióval tehetünk meg. Ezzel meg is tettük az els˝o lépéseket egy, a min˝oségi szakmai dokumentumok és publikációk elkészítésére használható megoldás elsajátítása felé. A következ˝o felejezben lépésr˝ol-lépésre bemutatjuk a szöveges dokumentumok elkészítésének rejtelmeit, melyet a harmadik fejezetben a LATEX prezentációkészít˝o funkciójának, a beamernek rövid bemutatása követ. Reméljük, hogy a LATEX használatát legalább annyira hasznosnak érzi majd, mint mi magunk. Mivel jelen egyetemi jegyzet még csak vázlat, így hibák el˝ofordulhatnak, melyek jelzését örömmel fogadjuk.
2 — LATEX- Szöveges dokumentumok 2.1
A LATEX dokumentumok szerkezeti felépítése Jelen jegyzet egy egyszer˝u mintadokumentumon keresztül mutatja be a különböz˝o funkciók m˝uködését, mely dokumentumot a jegyzet mellékleteként fejezetr˝ol-fejezetre haladva elérhet˝ové teszünk. A MiKTeX elindítását követ˝oen nyissuk meg a TeXworks-t. Egyel˝ore egy üres ablakkal találkozunk. A dokumentumot felépít˝o forráskódot ebben az ablakban kell begépelnünk, melyet ezt követ˝oen a TeXworks lefordít, és eredményként egy pdf formátumú dokumentumot kapunk. A forráskód minden esetben két f˝o strukturális elemb˝ol épül fel. Ezek a • Preambulum, ahol a dokumentum fontosabb tulajdonságait, a betöltend˝o csomagokat, illetve a speciális deklarációkat adhatjuk meg, illetve a • Szövegtörzs, ahol a magát a dokumentumot elkészítjük. A jegyzethez kapcsolódó mintadokumentumokon keresztül minden lépés szemléletesen követhet˝o, így a jegyzet olvasásával párhuzamosan célszer˝u azokat is tanulmányozni. A preambulumban kezdetben csupán azt fogjuk megadni, hogy milyen típusú dokumentumot szeretnénk létrehozni. A dokumentumtípusokról b˝ovebben egy kés˝obbi fejezet ad áttekintést. Gépeljük be a szerkeszt˝o ablakba az alábbi sort:
\documentclass{article} Ezzel el is készült a preambulum, melyben kizárólag azt adtuk meg, hogy a dokumentumunk típusa article. Ezt követ˝oen készítsük el a szövegtörzset. A szövegtörzsnek mindig a \begin{document} és az \end{document} utasításpáros közé kell kerülnie. Els˝o dokumentumunk kizárólag egy egyszer˝u mondatot tartalmaz majd, melyet a fenti utasításpáros közé gépelünk be. A teljes dokumentum az alábbi:
\documentclass{article} \begin{document} Az az els® mondatunk LaTeX környezetben. \end{document} A dokumentum átfordítására az ablak bal fels˝o sarkában található, zöld körben barna háromszöget tartalmazó gombra kattintva nyílik lehet˝oségünk. Ekkor a TeXworks egy ablakban megkérdezi, hogy hova mentse a fájlt. Célszer˝u egy külön mappát kijelölni minden egyes dokumentumnak, mivel a fordítás során a TeXworks több segédfájlt is létrehoz. A fordítást követ˝oen a kész dokumentum egy új ablakban meg is jelenik. Ez els˝o ránézésre nagyon sok problémával küzd. Nem jelennek meg az ékezetes karakterek, a szöveg a lap közepe táján kezd˝odik, és számos egyéb problémát fedezhetünk fel. Mindez annak a következménye, hogy a LATEX esetében meg kell adnunk a preambulumban a dokumentum számos fontos tulajdonságát is, mint a nyelv, margók, stb. Az alapvet˝o beállításokat a következ˝o fejezet mutatja be.
2.2 Alapvet˝ o csomagok és beállítások
2.2
6
Alapvet˝ o csomagok és beállítások A LATEX esetében nagyon fontos, hogy megadjuk, hogy a bevitt szöveg milyen típusú karaktereket tartalmaz, valamint hogy milyen nyelven íródik, így helyesen tudnak megjelenni a karakterek, illetve megfelel˝oen m˝uködhet a szavak elválasztása és számos egyéb nyelvspecifikus funkció is. Mindezt úgynevezett csomagok segítségével tudjuk megadni. A csomagok a LATEX alapfunkcióin túl további kiegészítéseket tartalmaznak, és ingyenesen hozzáférhet˝oek. S˝ot, a TeXworks egy új csomag használata esetén automatikusan le is tölti és telepíti azokat, ehhez elegend˝o a preambulumban megadni, hogy az adott csomagot a dokumentum elkészítése során használni szeretnénk. Az egyik legfontosabb dolog, hogy definiáljuk, milyen karakterkódolással dolgozunk a TeXworks által átfordítandó dokumentumban. Ezt az inputenc csomag segítségével tudjuk definiálni. Dokumentumunk preambulumát (ugye emlékszünk még, a preambulum a \begin{document} el˝otti rész) egészítsük ki az alábbi sorral:
\usepackage[utf8]{inputenc} Egy másik nagyon fontos csomag, melynek használata magyar nyelv˝u dokumentumok esetén elengedhetetlen a fontenc. Ez a csomag határozza meg a létrehozott pdf dokumentum kódolását, és ennek segítségével jeleníthet˝oek meg helyesen a magyar nyelvben is használt ékezetes karakterek. Ennek használatához szintén a preambulumban kell elhelyezni a következ˝o sort:
\usepackage[T1]{fontenc} Még egy csomag létezik, melynek használata elkerülhetetlen, ha nyelvileg helyes dokumentumokat szeretnénk létrehozni. Ez azt az információt hordozza magában, hogy az általunk létrehozott dokumentum magyar nyelven íródik. A preambulumban helyezzük el a következ˝o sort is:
\usepackage[magyar]{babel} Ezekb˝ol a példákból már látszik is a csomagok használatának általános módja. A csomagot a \usepackage paranccsal tudjuk meghívni, a csomag neve pedig ezt követ˝oen {} jelek közé kerül. A kett˝o között a csomagra vonatkozó beállításokat adhatjuk meg szögletes zárójelben. Ez a kés˝obbiekben is szinte minden esetben így lesz, tehát az egyes parancsok jellemz˝oen {} jelek közé, míg a beállítások [] jelek közé fognak kerülni. Ejtsünk is meg rögtön egy viszonylag fontos beállítást. A dokumentumunk els˝o sora eddig a \documentclass{article} parancsot tartalmazta. Adjunk meg ehhez még néhány kiegészít˝o beállítást, hogy dokumentumunk tényleg úgy nézzen ki, ahogy azt mi szeretnénk. Itt van lehet˝oségünk beállítani a dokumentum, valamint a karakterek méretét. Írjuk át az els˝o sort az alábbira:
\documentclass[a4paper,12pt]{article} Ezzel megadtuk, hogy azt szeretnénk, hogy dokumentumunk A4-es formátumú legyen, és a karakterek 12-es bet˝uméret˝uek legyenek. A dokumentumok további alapvet˝o tulajdonságait a következ˝o fejezetekben részletesebben is bemutatjuk. A teljes dokumentumunk most az alábbi módon néz ki:
\documentclass[a4paper,12pt]{article} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc} \usepackage[magyar]{babel} \begin{document} Az az els® mondatunk LaTeX környezetben. \end{document} Mindezt az el˝oz˝o fejezetben leírt módon lefordítva már egy olyan dokumentumot kapunk, melyben helyesen jelennek meg az ékezetes karakterek is. A dokumentumunk ett˝ol függetlenül még nem túl esztétikus, azonban ezen a következ˝o fejezetekben bemutatott beállításokkal segítünk.
2.3 A dokumentum f˝ obb tulajdonságai
2.3
7
A dokumentum f˝ obb tulajdonságai Nyilvánvaló, hogy az általunk létrehozott dokumentumok esetében magunk szeretnénk meghatározni a dokumentum f˝obb tulajdonságait, mint a margókat, a sorközöket, az oldal méretét, stb. Ebben a fejezetben áttekintjük, hogy milyen lehet˝oségek közül választhatunk a LATEX használata során. A dokumentumok méretének tekintetében az alábbi lehet˝oségek állnak rendelkezésünkre: a4paper, a5paper, b5paper, letterpaper, legalpaper. Azt, hogy ezek közü melyiket szeretnénk használni, a \documentclass{} beállításainál kell megadnunk, ahogy azt az el˝oz˝o fejezetben is tettük. Az egyes oldalméretek tulajdonságait az 2.1. táblázat foglalja össze: Természetesen a táblázatban megadott méretekBeállítás a4paper a5paper b5paper letterpaper
Szélesség 210 mm 148 mm 176 mm 215,9 mm
Magasság 297 mm 210 mm 250 mm 279,4 mm
legalpaper
215,9 mm
355,6 mm
Leírás Szabványos A4-es papírméret Szabványos A5-ös papírméret Szabványos B5-ös papírméret, tankönyvekre jellemz˝o Szabványos papírméret, jellemz˝oen Észak-Amerikában használatos Nem hagyományos méret, használata szintén Észak-Amerikában jellemz˝o
Táblázat 2.1: A LATEX által alapvet˝oen támogatott oldalméretek t˝ol eltér˝o oldalakat is használhatunk, ehhez a kés˝obbiekben bemutatott geometry csomag használata szükséges. A bet˝uméret esetében a választék a 10pt, a 11pt és a 12pt. Amennyiben ett˝ol eltér˝o méretet szeretnénk, azt ugyancsak egy csomag segítségével oldhatjuk meg. A beállítások alacsony száma annak köszönhet˝o, hogy a LATEX alapvet˝oen nyomdai min˝oség˝u tudományos m˝uvek, publikációk létrehozására szolgál, így ett˝ol eltér˝o beállításokra az esetek igen csekély hányadában lenne szükség. A margók beállítására ugyancsak a preambulumban van lehet˝oségünk. Ehhez egyrészt szükség van egy újabb csomag letöltésére, melynek neve anysize. Ez a csomag számos funkcióval rendelkezik, a kés˝obbiekben még használni fogjuk. Az egyik hasznos funkciója a margók szabályozása. Erre a \marginsize parancs használható, méghozzá az alábbi módon:
\usepackage{anysize} \marginsize{bal}{jobb}{fent}{lent} A már elkészített dokumentumunkra állítsunk be 2 cm nagyságú margókat az alábbi paranccsal:
\marginsize{2cm}{2cm}{2cm}{2cm} Egy nagyon fontos és gyakran elvárt tulajdonsága a dokumentumainknak a megfelel˝o sorköz. Ennek beállítására a \linespread parancs használható. Ha másfeles sorközt szeretnénk, akkor 1.3 nagyságú, míg dupla sorköz esetén 1.6 nagyságú beállítást kell alkalmaznunk. Jelenlegi dokumentumunkra állítsunk be másfeles sorközt, a preambulumot egészítsük ki az alábbi sorral:
\linespread{1.3} Természetesen mindennek hatásait csak akkor látjuk, ha már több sornyi szöveget tartalmaz a dokumentumunk. Kezdjünk hát el megírni egy minta dokumentumot, melynek témája a makroökonómia lesz, azon belül is a GDP számításról és a különböz˝o indexek kiszámításának módjáról fogunk írni. A teljes dokumentumunk az alábbi:
\documentclass[a4paper,12pt]{article} \usepackage[utf8]{inputenc} \usepackage[T1]{fontenc}
2.4 Egyedi formázási beállítások
8
\usepackage[magyar]{babel} \usepackage{anysize} \marginsize{2cm}{2cm}{2cm}{2cm} \linespread{1.3} \begin{document} A nominális GDP értékének meghatározása során minden, az adott gazdaságban adott id®szak alatt létrehozott termék és szolgáltatás összértékéb®l kivonjuk az adott év folyó termel® felhasználását, így a nominális GDP valójában nem más, mint a jelenbeli árakon számított hozzáadott érték. \end{document} Ezt átfordítva már egy szép, megfelel˝oen formázott dokumentumot kapunk.
2.4
Egyedi formázási beállítások Természetesen el˝ofordulhat olyan eset, amikor a LATEX nyújtotta alapvet˝o beállítások nem felelnek meg az igényeinknek. Ilyenkor egy-egy csomag használatával könnyen orvosolhatjuk ezt a problémát. Ebben a fejezetben bemutatjuk a f˝obb lehet˝oségeket. Ezeken túl természetesen számos más módosítást is végrehajthatunk, melynek pontos módját a LATEX-et használók közössége az interneten szinte minden esetben megtárgyalt már, így bármilyen igényünk is legyen, az interneten szinte minden esetben találunk megoldást a problémánkra. Kezdjük az áttekintést az oldal méretével. Amennyiben a hagyományos méretekt˝ol eltér˝o dokumentumot szeretnénk készíteni, hasznos megoldást nyújt a geometry csomag. Dokumentumunk preambulumában könnyedén megadhatjuk az általunk használni kívánt szélességet és magasságot az alábbi módon:
\usepackage[paperwidth=szélesség,paperheight=magasság]{geometry} A szélesség és a magasság helyére az általunk kívánt méreteket adhatjuk meg milliméterben. Amennyiben például A6-os dokumentumot szeretnénk létrehozni, a beállításunk az alábbi lenne:
\usepackage[paperwidth=105mm,paperheight=148.5mm]{geometry} A geometry és más csomagok együttes használata gyakran problémákba ütközhet a dokumentumok végrehajtott módosítások miatt. Egyes fordítóprogramok esetében a magyar babel is ezek közé tartozik. Ezekre a problémákra a megoldás a csomagok helyes sorrendben történ˝o betöltése. A geometry csomagot minden esetben els˝oként töltsük be, így sok problémától megkímélhetjük magunkat. Ugyancsak fontos, hogy a geometry csomag felülírja a documentclass-ben megadott tulajdonságokat, vagyis ha beállítjuk, hogy A4-es dokumentumot szeretnénk létrehozni, majd a geometry csomag segítségével A6-os méretet állítunk be, utóbbi fog érvényesülni. A jelenséget szemlélteti a jegyzethez mellékelt mintafájl. Nagyon fontos, hogy a geometry használata esetén ez a csomag fogja szabályozni a dokumentum margóit is, így innent˝ol kezdve az anysize csomag és a \marginsize parancs használata nem szükséges. A geometry beállításai között megadhatjuk a margókat az alábbi módon:
\usepackage[left=,bottom=,top=,right=]{geometry} Az egyenl˝oségjelek után a margókat milliméterben vagy centiméterben kell megadnunk. Egy A4-es dokumentum 2,5 centiméteres margókkal a geometry használatával tehát az alábbi módon nézne ki:
\usepackage[a4paper,left=25mm,bottom=25mm,top=25mm,right=25mm]{geometry} Egy másik viszonylag gyakori eset, hogy a LATEX által kínált alapvet˝o bet˝uméretekt˝ol szeretnénk eltérni. Természetesen erre is van megoldás, melyhez nincs szükség csomag betöltésére sem. Összesen 10 bet˝uméret közül választhatunk, de természetesen csomagok használatával ett˝ol is el tudunk térni. A méreteket a 2.2. táblázat szemlélteti. Az egyes bet˝uméretek használatára két módon nyílik lehet˝oségünk. Az egyik, hogy kapcsos zárójelek között a méret megadását követ˝oen beírjuk az egész szöveget, melyet az adott méretben szeretnénk viszontlátni. Egy példán keresztül bemutatva:
2.4 Egyedi formázási beállítások Méret tiny scriptsize footnotesize small normalsize large Large LARGE huge Huge
9 Minta tiny
scriptsize
footnotesize
small
normalsize
large
Large
LARGE
huge
Huge
Táblázat 2.2: Az alapból támogatott bet˝uméretek
{\LARGE Ez a mondat nagy bet¶kkel fog megjelenni.} Egy másik lehet˝oség, hogy a formázandó szöveget begin-end környezetben adjuk meg. Ennek egy példája:
\begin{small} Ez a mondat kis bet¶kb®l fog állni. \end{small} Ugyancsak lényeges pont lehet, hogy az angol gyakorlatban a mondatvégi írásjeleket követ˝oen nagyobb szóközt szokás hagyni. A magyar gyakorlat ett˝ol eltér, azonban a LATEX nem tudhatja, hogy a monitor el˝ott ül˝o szerz˝o a magyar szokásoknak megfelel˝oen kívánja elkészíteni a dokumentumot. Ez a probléma azonban a preambulumban az alábbi parancsot kiadva könnyedén megoldható:
\frenchspacing El˝ofordulhat az is, hogy egyes oldalak esetében eltér˝o margót szeretnénk beállítani, mint a dokumentum egészén. Ebben az esetben is a geometry csomag lesz a segítségünkre. A dokumentum bármely pontjától kezdve felülírhatjuk a korábban megadott margó méreteket az alábbi paranccsal:
\newgeometry{left=,bottom=,top=,right=} Természetesen az egyenl˝oségjelek után meg kell adnunk a margók méretét milliméterben vagy centiméterben. Ezt a dokumentum kés˝obbi pontján könnyedén visszaállíthatjuk az alapbeállításra az alábbi paranccsal:
\restoregeometry Fontos tulajdonsága a LATEX-nek, hogy érzéketlen a szóközök és enterek számára. Ha véletlenül 2-3 szóközt rakunk a szavak közé, fordításkor a létrehozott dokumentumban egyetlen szóközt kapunk vissza. Ugyancsak mindegy, hogy egyetlen entert ütünk, vagy több enterrel válaszjuk el bekezdéseinket, a hatás ugyanaz, a LATEX új bekezdést kezd. Az új bekezdések mindegyike esetében egységes nagyságú sorbehúzással találkozhatunk. Amennyiben azt szeretnénk, hogy az adott bekezdés esetében a LATEX ne húzza be a sort, a bekezdést az alábbi paranccsal kell kezdenünk:
\noindent Amennyiben nagyobb vagy kisebb behúzást szeretnénk alkalmazni, a dokumentum preambulumában megadhatjuk az általunk kívánt értéket az alábbi paranccsal:
\setlength\parindent{} A kapcsos zárójelek között természetesen meg kell adnunk a behúzás mértékét centiméterben.
2.5 A dokumentum tagolása, dokumentumtípusok
2.5
10
A dokumentum tagolása, dokumentumtípusok Mint azt a korábbi fejezetekben láthattuk, a dokumentumunk els˝o sorában meg kell határozni az általunk létrehozott dokumentum típusát. Ez azért fontos, mert az egyes típusok eltér˝o tagolási lehet˝oségeket tesznek lehet˝ové, így fontos, hogy az igényeinknek megfelel˝o típust válasszuk ki. Az egyes típusokat és azok használatát a 2.3. táblázat foglalja össze. Dokumentum típus article report book letter beamer
Jellemz˝o használata A leggyakrabban használt típus, közepes hosszúságú cikkek, tanulmányok Hosszabb, könyvekre tagolt dokumentumok, jelentések Valódi könyvekhez, több könyvre tagolható Levelekhez, semmilyen tagolása nincs LATEX-ben készült prezentációkhoz Táblázat 2.3: F˝obb dokumentumtípusok
Dokumentumainkat részekre, könyvekre, fejezetekre, alfejezetekre, al-alfejezetekre, bekezdésekre és albekezdésekre tagolhatjuk. Ezek mindegyikét nagyon ritkán használjuk, mivel rombolja a m˝uvek esztétikáját, ugyanakkor néhány tagolási szint alkalmazása elengedhetetlen az átláthatóság szempontjából, amennyiben hosszabb dokumentumokat hozunk létre. A tagolás szintjeit a 2.4. táblázat mutatja be. A fejezetek, alfejezetek címe a kapcsos zárójelbe kell, hogy kerüljön. A LATEX automatikusan Parancs \part{} \chapter{} \section{} \subsection{} \subsubsection{} \paragraph{} \subparagraph{}
Szint -1 0 1 2 3 4 5
Leírás Ritkán használt tagolás, több részre bontott dokumentumoknál Kizárólag book és report típusú dokumentumoknál használható Fejezet. Ezzel a szinttel célszer˝u kezdeni a tagolást Alfejezet Al-alfejezet Bekezdés. Ezt a tagolási szintet már nem szokás használni Albekezdés. Szinte soha nem használjuk
Táblázat 2.4: Tagolási szintek LATEX dokumentumok esetén elvégzi az egyes tagolási szintek számozását, és frissíti a tartalomjegyzéket (a tartalomjegyzékr˝ol egy kés˝obbi fejezetben lesz szó). Jelen könyvünk például egy book típusú dokumentum, melynek épp a 2. chapter 5. section részét olvassa az olvasó. A dokumentumok tagolását a mellékelt mintafájl mutatja be szemléletesen. Amennyiben egy adott fejezetet nem szeretnénk sorszámozni, egyszer˝uen megoldhatjuk. Ekkor az adott parancsot egy csillaggal kell ellátni, így az nem kerül sorszámozásra, például \section*{Ez a fejezet nem lesz sorszámozva}.
2.6
A matematikai mód használata A LATEX egyik legfontosabb funkciója az egyenletek írása. A LATEX használatával nyomdai min˝oségben könnyedén elkészíthetjük egyenleteinket, matematikai formuláinkat. Ebben a fejezetben bemutatjuk a matematikai mód használatát, illetve a több egyenletb˝ol álló rendszerek m˝uködését. A kés˝obbi fejezetekben számos megoldást mutatunk be, melyek fontosak lehetnek munkánk során. Az egyenleteket az úgynevezett matematikai módban kell elkészítenünk. A matematikai módba való átváltással jelezhetjük a LATEX számára, hogy matematikai karakterekkel teli részt szeretnénk a dokumentumunkba illeszteni. Ezek esetében a LATEX jól elkülöníthet˝o, eltér˝o formátumot használ. Matematikai módban nincs lehet˝oségünk ékezetes karakterek használatára, bár mint azt a kés˝obbiekben láthatjuk, igényünk szerint a matematikai módon belül lehet˝oségünk nyílik visszaváltani szöveges módba. Matem-
2.6 A matematikai mód használata
11
atikai formuláinkat dollárjelek között készíthetjük el. Két fontos környezetet különböztethetünk meg. Az els˝o az alábbi módon néz ki:
$ matematikai formula $ A másik a következ˝o:
$$ matematikai formula $$ A két megoldás között az a különbség, hogy két-két dollárjel alkalmazása esetén a képletünk egy különálló sorba, az oldal közepére igazítva jelenik meg, míg egy-egy dollárjel esetén a formulánk a szöveggel egy sorba kerül. A kett˝o közötti különbséget jól szemlélteti a fejezethez tartozó mintafájl. Amennyiben egymás alatt szeretnénk megadni több egyenletet is, arra az egyik megoldás, hogy egyenleteinket egymás után külön-külön két-két dollárjel között írjuk be. Ez azonban az egyenletek eltér˝o hossza esetén nem túl esztétikus. Egy csomag betöltésével ennél sokkal szebb megoldást is alkalmazhatunk. Ez a csomag az amsmath, melynek segítségével egyenleteinket egymár alá tudjuk igazítani. A csomag betöltéséhez a preambulumba helyezzük el az alábbi utasítást:
\usepackage{amsmath} Az amsmath betöltését követ˝oen egy új környezetet tudunk használni, melynek neve align. Amennyiben ezt használjuk, egyenleteink számozva jelennek meg egymás alatt, az általunk kijelölt helyen egymáshoz igazítva. Jellemz˝oen az egyenl˝oségjel el˝ott vagy után szokás ezt az igazítást megtenni, melyre az & jel kirakásával van lehet˝oségünk. Az egyenleteket \\ jellel kell elválasztani egymástól. Egy egyszer˝u példán keresztül az alábbi kód:
\begin{align} a &= b+c+d\\ c &= b+d \end{align} A következ˝o eredményt adja: a = b+c+d
(2.1)
c = b+d
(2.2)
Amennyiben egy adott egyenletet nem szeretnénk számozni, az egyenlet sorában a \\ jelet megel˝oz˝oen adjuk ki a \nonumber parancsot. Csak azokat az egyenleteket szokás számozni, melyekre a kés˝obbiekben hivatkozunk. A hivatkozás pontos módját egy kés˝obbi fejezetben mutatjuk be. Amennyiben egyik egyenletet sem szeretnénk számozni, nem kell minden egyes sor esetén külön-külön kiadni a \nonumber parancsot. Ilyenkor használható az align* környezet, mely esetében egyik egyenlet sem kerül számozásra. Példánkban ha a kód:
\begin{align*} a &= b+c+d\\ c &= b+d \end{align*} Az eredmény: a = b+c+d c = b+d Az amsmath csomag által nyújtott align és align* környezetekkel tehát esztétikus módon tudjuk egymás alatt elhelyezni az egyenleteinket. Ugyanerre számos más csomag is kínál megoldást, azonban az amsmath csomag használata javasolt, mivel ezt napjainkban is folyamatosan frissítik.
2.7 Alapvet˝ o matematikai kódok
2.7
12
Alapvet˝ o matematikai kódok Ebben a fejezetben áttekintjük, miként lehet a matematikai módban törteket, szummákat, különböz˝o m˝uveleti jeleket, mátrixokat és hasonló, a matematikai formulákban gyakran el˝oforduló elemeket létrehozni. Kezdjük az elején, néhány speciális jel kódjával. A LATEX esetében számos speciális karakter megjelenítésére nyílik lehet˝oségünk, azonban ezek beszúrása az esetek nagy részében a karakter kódjával történik. így például lehet˝oségünk van görög bet˝uk, speciális m˝uveleti jelek, stb. beszúrására. A használható görög karaktereket a 2.5. táblázat foglalja össze. A kés˝obbiekben további karaktertáblázatokat is Kód \alpha \epsilon \theta \lambda \pi \sigma \phi \omega \Lambda \Upsilon
Eredmény α ε θ λ π σ φ ω Λ ϒ
Kód \beta \varepsilon \vartheta \mu \varphi \varsigma \varphi \Gamma \Xi \Pi
Eredmény β ε ϑ µ ϕ ς ϕ Γ Ξ Π
Kód \gamma \zeta \iota \nu \rho \tau \chi \Delta \Phi \Psi
Eredmény γ ζ ι ν ρ τ χ ∆ Φ Ψ
Kód \delta \eta \kappa \xi \varrho \upsilon \psi \Theta \Sigma \Omega
Eredmény δ η κ ξ ρ υ ψ Θ Σ Ω
Táblázat 2.5: Görög karakterek összefoglaló táblázata
bemutatunk, azonban ezek ismeretében már szemléltethet˝o néhány alapvet˝o matematikai m˝uvelet. Az egyszer˝ubb m˝uveleti jelek (+, −, :) a matematikai módban tökéletesen m˝uködnek. Azonban a szorzás és osztás speciális kódokat is igényelhet. A szorzásjelet a \cdot kóddal tudjuk megadni. Amennyiben az osztást nem kett˝osponttal, hanem “per” jellel szeretnénk jelölni, a \backslash parancsra lesz szükségünk, melynek eredménye egy \ jel. Ugyanígy m˝uködik a \slash parancs is, melynek eredménye egy / jel. Azonban törtjeinket gyakran célszer˝ubb rendes tört alakban megadni, melynek környezete a következ˝o:
\frac{számláló}{nevez®} Ahol a számláló helyére értelemszer˝uen a tört számlálóját, a nevez˝o helyére a nevez˝ojét írjuk. Fontosak még a hatványok és indexek. Amennyiben egy kifejezést hatványozni szeretnénk, arra a ^{kitev®} paranccsal van lehet˝oségünk. Amennyiben alsó indexet szeretnénk, azt a _{index} paranccsal készíthetjük el. Ha kifejezetten egy m˝uveleti jel alá és fölé szeretnénk valamit írni, mint például szummák vagy produktumok esetén, a szükséges parancs az adott m˝uveleti jel után a \limits_{alsó kifejezés}^{fel s® kifejezés}. Mindezeket egy egyszer˝u példán szemléltetve a négyzetszámok reciprokösszegére vonatkozó összefüggés kétszeres szorzata az alábbiak szerint írható fel:
$$2 \cdot \sum\limits_{i=1}^{\infty} \frac{1}{i^{2}}=2 \cdot \frac{\pi^{2}}{6}$$ Melynek eredménye az alábbi: 1 π2 = 2· 2 6 i=1 i ∞
2· ∑
Ebben a példában korábban nem ismert m˝uveleti jeleket is felhasználtunk, mint a \sum vagy a \infty. Talán már a példából is látható, hogy a LATEX segítségével tényleg minden létez˝o matematikai jelet létre tudunk hozni, csupán a szükséges kód ismerete kell hozzá. Szánjunk hát néhány táblázatot a fontosabb, gyakran használt parancsok összefoglalására, a teljesség igénye nélkül. A használható karakterek listája számos helyen fellelhet˝o az interneten, egy 164 oldalas pdf dokumentum formájában. A fontosabb szummákat, produktumokat, integrálokat és egyéb, az egyenlet méretével változó m˝uveleti jeleket a 2.6. táblázat foglalja össze. Ezeken kívül természetesen számos fontos, a matematikában napi szinten használt jelölés van, melyek közül a leggyakoribbakat az 2.7. táblázat foglalja össze.
2.7 Alapvet˝ o matematikai kódok Kód \sum \iint \bigvee \bigsqcup \bigwedge
Eredmény ∑ RR W F V
13
Kód \prod \iiint \bigcap \bigodot \biguplus
Eredmény ∏ RRR T J U
Kód \int \oint \bigcup \bigotimes \bigoplus
Eredmény R H S N L
Táblázat 2.6: Az egyenlet méretével együtt változó méret˝u m˝uveleti jelek
Kód \lim
Minta lim
\partial \le \equiv \rightarrow \xleftarrow[a]{b}
∂ ≤ ≡ →
\supseteq \neq \nleqslant \mathbb{P} \mathbb{Q} \infty \ge \sim \cong
Kód \sqrt{n}
Minta √ n ... ≥ ≈ ←
← −
\dots \geq \approx \leftarrow \xrightarrow[a]{b}
⊇ 6 =
P Q ∞ ≥ ∼ ∼ =
\subseteq \not\equiv \ngeqslant \mathbb{N} \mathbb{R} \max \subset \exists \nless
⊆ 6 ≡ N R max ⊂ ∃ ≮
b a
b
→ − a
Kód \sqrt[k]{n}
\vdots \leq \simeq \ln \supset \forall \ngtr \therefore \mathbb{Z} \mathbb{C} \because \mathbb{I} \times \min
Minta √ k n .. . ≤ ' ln ⊃ ∀ ≯ ∴ Z C ∵ I × min
Táblázat 2.7: Fontosabb matematikai karakterek
A következ˝okben egy nagyon fontos elemr˝ol, a zárójelezésr˝ol ejtünk szót. A matematikai formulákban természetesen lehet˝oségünk van egyszer˝u zárójelek használatára, azonban ezek törtek esetében például nem adnak megfelel˝o eredményt. Ahhoz, hogy a zárójeleink magassága illeszkedjen a törtek magasságához, megfelel˝oen kell azokat kódolni. A zárójelezend˝o kifejezést a \left( és a \right) parancsok közé kell írni. Természetesen a hagyományos zárójelünket kicserélhetjük szögletes vagy kapcsos zárójelre is. Egy példán keresztül szemléltetve az alábbi parancsot kiadva:
$$(\frac{a}{b})$$ Az eredmény:
a ( ) b
Míg a fent leírt módszerrel:
$$\left(\frac{a}{b} \right)$$ Az eredmény:
a
b Munkánk során ugyancsak gyakran használunk mátrixokat. A mátrixoknak külön környezete van, azokat a \begin{pmatrix} és a \end{pmatrix} utasításpár között kell elkészítenünk. A mátrixot sorról sorra töltjük fel elemekkel, az egyes elemeket & jellel, míg a mátrix sorait \\ jellel választhatjuk el. Egy példán keresztül:
2.8 Listák és felsorolások
14
$$\begin{pmatrix} 1 & 2 & 3\\ 4 & 5 & 6\\ 7 & 8 & 9 \end{pmatrix}$$ Ennek eredménye az alábbi: 1 2 3 4 5 6 7 8 9 A mátrixot nem mindig hagyományos zárójelek között szeretnénk megadni. Szögletes zárójelhez a bmatrix környezetet, egyenes vonalakhoz a vmatrix, kapcsos zárójelekhez a Bmatrix környezetet kell használni. Ezek eredménye rendre az alábbi: 1 2 3 1 2 3 1 2 3 4 5 6 4 5 6 4 5 6 7 8 9 7 8 9 7 8 9 Ezen alapvet˝o ismeretek a legtöbb esetben elégségesek, de természetesen minden egyenlettípus megjelenítése megoldható, a megfelel˝o utasítások az internet számos pontján fellelhet˝ok.
2.8
Listák és felsorolások Dokumentumainkban gyakran szeretnénk különböz˝o felsorolásokat és listákat készíteni. Erre a LATEX nagyon egyszer˝u megoldást kínál. Számozott listát az enumerate környezetben hozhatunk létre, a lista minden egyes elemét a \item paranccsal jelölve. Egy egyszer˝u példán keresztül a m˝uködése az alábbi:
\begin{enumerate} \item alma \item körte \item barack \end{enumerate} Az eredmény: 1. alma 2. körte 3. barack Amennyiben nem számozni szeretnénk a felsorolásunkat, hanem például bet˝ukkel szeretnénk azt ellátni, be kell tölteni az enumerate csomagot. Ennek segítségével szinte bármilyen bet˝uzést vagy számozást megvalósíthatunk igényeink szerint. Ehhez a \begin{enumerate} parancs után szögletes zárójelben meg kell adni a felsorolás els˝o elemét, amelyben a csomag által felismert számozást folyamatosan elemr˝ol elemre növeli majd a csomag. A csomag számozni, római számozni és bet˝uzni tud, tehát az els˝o elemként az A, a, i, I, és 1 elemeket ismeri fel. Egy példa:
\begin{enumerate}[a) tétel:] \item alma \item körte \item barack \end{enumerate} Ennek eredménye: 1. alma 2. körte 3. barack
2.9 Ábrák, képek
15
Amennyiben nem számozni vagy bet˝uzni szeretnénk, az itemize környezet a megoldás. Az itemize alapértelmezés szerint pontozott listát hoz létre, de bármilyen, a LATEX által támogatott karaktert megadhatunk a listánkhoz. Ezt egy, a preambulumban elhelyezett paranccsal tehetjük meg, mellyel felül tudjuk írni a LATEX alap beállításait. Az alábbi parancsot kell ehhez kiadni a preambulumban:
\renewcommand{\labelitemi}{karakter} Például ha négyzeteket szeretnénk, a parancsunk:
\renewcommand{\labelitemi}{$\blacksquare$} Egymásba ágyazott listákat is létrehozhatunk, ha a felsorolásunkon belül egy újabb felsorolást kezdünk. Mindezt az alábbi példa szemlélteti:
\begin{enumerate}[a)] \item gyümölcsök \begin{itemize} \item Banán \item Mandarin \end{itemize} \item zöldségek \begin{itemize} \item Paprika \item Uborka \end{itemize} \end{enumerate} Ennek eredménye: 1. gyümölcsök • Banán • Mandarin 2. zöldségek • Paprika • Uborka Egyedi megoldásokhoz a pifont csomag dinglist környezetét ajánljuk, azonban ezt jelen jegyzetben annak viszonylag ritka használata miatt nem mutatjuk be részletesen.
2.9
Ábrák, képek Dokumentumainkban természetesen ábrákat, képeket is elhelyezhetünk, melyek méretét, elhelyezkedését a LATEX segítségével könnyen személyre szabhatjuk. Ebben a fejezetben áttekintjük a képek beszúrásának módját, valamint minden ehhez kapcsolódó fontos részletet. A képek beszúrásához szükség van egy újabb csomagra, melynek neve graphicx. A preambulumban a \usepackage{graphicx} parancsot elhelyezve be is tölt˝odik a csomag. A képek beszúrása innent˝ol igencsak egyszer˝u. A képeket célszer˝u az általunk létrehozott .tex fájl mappájába, vagy azon belül egy almappába helyezni, ugyanis a képek elérési útvonalát a .tex fájlhoz képest relatív módon kell megadni. A képeket a \includegraphics{} paranccsal szúrhatjuk be, ahol a kapcsos zárójelbe a kép elérési útját kell megadnunk karakterhelyesen. Kiegészít˝o opciókat is megadhatunk, például a kép méretére vonatkozóan. Az ilyen jelleg˝u beállításokat a kapcsos zárójelet megel˝oz˝oen egy szögletes zárójelben kell megadni. A képet a LATEX automatikusan átméretezi a kép arányainak megtartásával. Amennyiben a kép méretét szeretnénk szabályozni, két módon is megtehetjük. Az egyik, hogy a szélességet vagy a magasságot centiméterben adjuk meg. Ekkor a kódunk az alábbiak valamelyike lehet:
\includegraphics[width=xcm]{fájlnév.formátum} \includegraphics[height=xcm]{fájlnév.formátum}
2.10 Színek használata, szövegformázás
16
El˝obbi esetben a kép szélességét, utóbbi esetben a magasságát szabályoztuk. Amennyiben a kép szélességét szeretnénk meghatározni, azt megadhatjuk az általunk létrehozott dokumentum sorszélességének viszonylatában is. Például ha a sor hosszának felében szeretnénk meghatározni a képünk szélességét, a kód az alábbi lenne:
\includegraphics[width=0.5\linewidth]{fájlnév.formátum} Képeinket persze gyakran az oldal közepére szeretnénk igazítani, ilyenkor a megoldás az, hogy a képet egy center környezetben szúrjuk be. Például:
\begin{center} \includegraphics[width=0.9\linewidth]{fájlnév.formátum} \end{center} Publikációk, tudományos m˝uvek esetén ábráinkat gyakran el szeretnénk látni számozással, képaláírással. Ezt a LATEX segítségével egyszer˝uen, automatikusan számozva megtehetjük. S˝ot, a kés˝obbiekben ábráinkra könnyedén hivatkozhatunk is, és a LATEX az ábrajegyzékünket is automatikusan elkészíti. Utóbbiak használatát egy kés˝obbi fejezet mutatja be. Amennyiben számozott, aláírással ellátott ábrát szeretnénk létrehozni, a képet a figure környezetben kell elhelyeznünk, a képaláírást pedig a \caption{} paranccsal készíthetjük el. Egy példán keresztül:
\begin{figure} \begin{center} \includegraphics[width=0.9\linewidth]{fájlnév.formátum} \caption{Ez lesz a képaláírás} \end{center} \end{figure} A fent leírtakat szemléletesen is bemutatja a fejezethez tartozó mintafájl.
2.10
Színek használata, szövegformázás A különböz˝o színek használatára viszonylag ritkán van szükség, de természetesen erre is van lehet˝oségünk. A következ˝o fejezetben bemutatott táblázatok esetében például kifejezetten el˝onyös lehet a színek használata. Amennyiben szeretnénk élni a lehet˝oséggel, a color csomag használatára van szükségünk. Ezt a preambulumban a \usepackage[usenames,dvipsnames]{color} paranccsal tölthetjük be. Innent˝ol kezdve számos el˝ore definiált színnel tudunk dolgozni, de magunk is definiálhatunk színeket kedvünk szerint. Színes szövegek létrehozására az alábbi két parancs bármelyikével lehet˝oségünk van:
{\color{szín neve} Ide jön a színes szöveg} \textcolor{szín neve}{Ide jön a színes szöveg} A color csomag által kínált 68 alapértelmezett színt a 2.8. táblázat mutatja be. Természetesen az el˝ore definiált színekt˝ol el is térhetünk, és magunk is definiálhatunk színeket. Ezt a preambulumban tudjuk megtenni. A színek definiálására több mód is van, mi itt most az RGB színkódokkal való definiálást mutatjuk be. El˝oször is meg kell találni az általunk kívánt szín RGB kódját, melyet számos weblapon megtehetünk, de akár a Paint, vagy az Adobe Photoshop terméke is megadja az általunk kiválasztott szín RGB kódját. A preambulumban használatos parancs a következ˝o:
\definecolor{szín neve}{RGB}{vörös,zöld,kék} A parancsban természetesen a szín nevét az általunk a kés˝obbiekben használni kívánt névvel kell helyettesíteni, míg a vörös a zöld és a kék helyére a kiválaszott szín RGB kódja kerül, vagyia 0 és 255 közötti számokat kell beírnunk. A szövegek formázásának van néhány további, fontos eleme. Nyilván hiányoljuk a korábbi szövegszerkeszt˝onkben megszokott félkövér, d˝olt, és aláhúzott bet˝uket. Ezekre a megoldás ismét a megfelel˝o parancs ismerete. Félkövérnek szánt szövegeinket az alábbi módon jeleníthetjük meg:
2.10 Színek használata, szövegformázás Színkód Apricot Aquamarine Bittersweet Black Blue BlueGreen BlueViolet BrickRed Brown BurntOrange CadetBlue CarnationPink Cerulean Salmon SpringGreen Turquoise WildStrawberry
Szín
Színkód CornflowerBlue Cyan Dandelion DarkOrchid Emerald ForestGreen Fuchsia Goldenrod Green Gray GreenYellow JungleGreen Lavender SeaGreen Tan Violet Yellow
17 Szín
Színkód LimeGreen Magenta Mahogany Maroon Melon MidnightBlue Mulberry NavyBlue OliveGreen Orange OrangeRed Orchid Peach Sepia TealBlue VioletRed YellowGreen
Szín
Színkód Periwinkle PineGreen Plum ProcessBlue Purple RawSienna Red RedOrange RedViolet Rhodamine RoyalBlue RoyalPurple RubineRed SkyBlue Thistle White YellowOrange
Szín
Táblázat 2.8: A color csomag által támogatott színek
\textbf{ide jön a félkövér szöveg} A d˝olt bet˝uk esetében:
\textit{ide jön a d®lt szöveg} Végül de nem utolsósorban az aláhúzás:
\underline{ide jön az aláhúzott szöveg} Gyakran használunk még KISKAPITÁLIS bet˝uket, melyet az alábbi paranccsal érhetünk el:
\textsc{ide jön a kiskapitális szöveg} Fontos lehet még a szöveg balra-, jobbra- vagy középre igazítása is. Ahogy azt már megszokhattuk, erre is a megfelel˝o parancsok ismeretével nyílik lehet˝oségünk. A LATEX alapvet˝oen sorkizárt szövegeket hoz létre, a bekezdések utolsó sorait pedig balra zárja. Amennyiben balra szeretnénk zárni a szöveget, úgy a flushleft környezetet, jobbra záráshoz a flushright környezetet, míg középre záráshoz a center környezetet kell használni. Példán keresztül szemléltetve a balra zárást:
\begin{flushleft} Ez a szöveg balrazárt. \end{flushleft} A jobbrazárás esetén:
\begin{flushright} Ez a szöveg jobbrazárt. \end{flushright} És végül középre záráshoz:
\begin{center} Ez a szöveg középre zárt. \end{center}
2.11 Táblázatok
18
El˝ofordulhat, hogy paragrafuson belül mindenképpen új sort szeretnénk kezdeni, anélkül, hogy új paragrafust kezdenénk, és az els˝o sorokra vonatkozó behúzás érvényesülne. Ezt a \newline paranccsal oldhatjuk meg, melyet bárhol elhelyezve a szövegben a LATEX új sort kezd. Amennyiben oldaltörést szeretnénk valahol végrehajtani, azt a \pagebreak paranccsal tehetjük meg.
2.11
Táblázatok A táblázatok elkészítése LATEX környezetben els˝ore egy kicsit talán bonyolultnak t˝unhet, azonban id˝ovel berögzült rutinná válik, és nagyon könnyen létrehozhatjuk a dokumentumhoz ill˝o, automatikusan számozott és hivatkozható táblázatainkat. A táblázatokat minden esetben a table környezetben kell elkészítenünk. Ezzel jelezzük a LATEX számára, hogy a következ˝okben táblázatokat szeretnénk készíteni. A konkrét táblázat a tabular környezeten belülre kerül. Egy táblázat tehát alapvet˝oen az alábbi módon kell, hogy kinézzen:
\begin{table} \begin{tabular}{oszlopokra vonatkozó információk} \end{tabular} \end{table} Az oszlopokra vonatkozó információk helyén meg kell adnunk, hogy hány oszlopot szeretnénk, és azokon belül a tartalmat balra, középre vagy jobbra szeretnénk igazítani. Egy balra igazított oszlopot az l paranccsal, egy középre igazított oszlopot a c paranccsal, míg egy jobbra igazított oszlopot az r paranccsal hozhatunk létre. Egy három oszlopos táblázat, melynek els˝o oszlopa balra, második oszlopa középre, harmadik oszlopa jobbra igazított, az alábbi módon néz ki:
\begin{table} \begin{tabular}{lcr} \end{tabular} \end{table} Ezt követ˝oen sorról sorra el kell készítenünk a táblázatunkat. Soron belül a cellákat & jellel kell egymástól elválasztani, a sorokat pedig \\ jellel választjuk el egymástól. Egy egyszer˝u indexekre vonatkozó táblázat például az alábbi kóddal készíthet˝o el:
\begin{table} \begin{tabular}{lcr} & Ár & Volumen \\ Laspeyres & $\frac{\sum p_{1}q_{0}}{\sum p_{0}q_{0}}$ & $\frac{\sum p_{0}q_{1}}{\sum p_{0}q_{0}}$ \\ Paasche & $\frac{\sum p_{1}q_{1}}{\sum p_{0}q_{1}}$ & $\frac{\sum p_{1}q_{1}}{\sum p_{1}q_{0}}$ \end{tabular} \end{table} Ennek eredménye: Ár Laspeyres Paasche
∑ p1 q0 ∑ p0 q0 ∑ p1 q1 ∑ p0 q1
Volumen ∑ p0 q1 ∑ p0 q0 ∑ p1 q1 ∑ p1 q0
Nyilván ezzel még nem vagyunk teljesen elégedettek, hiszen szeretnénk a sorokat és oszlopokat vonalakkal elválasztani. Az oszlopok elválasztásához az oszlopok definiálásánál az egyes oszlopok közé rakott | jellel jelezhetjük, hogy ott vonalat szeretnénk húzni. A sorok között a sor végén kirakott \hline paranccsal húzhatunk vízszintes vonalat. Az alábbi módon például a sor- és oszlopf˝oket kett˝os vonallal választjuk el a táblázat többi elemét˝ol, míg mindenhol máshol egy vonallal választjuk el a tartalmat:
2.12 Címlap és jegyzékek
19
\begin{table} \begin{tabular}{|l||c|r|} \hline & Ár & Volumen \\ \hline \hline Laspeyres & $\frac{\sum p_{1}q_{0}}{\sum p_{0}q_{0}}$ & $\frac{\sum p_{0}q_{1}}{\sum p_{0}q_{0}}$ \\ \hline Paasche & $\frac{\sum p_{1}q_{1}}{\sum p_{0}q_{1}}$ & $\frac{\sum p_{1}q_{1}}{\sum p_{1}q_{0}}$ \\ \hline \end{tabular} \end{table} Ennek eredménye az alábbi táblázat: Ár Laspeyres Paasche
∑ p1 q0 ∑ p0 q0 ∑ p1 q1 ∑ p0 q1
Volumen ∑ p0 q1 ∑ p0 q0 ∑ p1 q1 ∑ p1 q0
A táblázatot középre is szeretnénk zárni az esetek többségében, valamint az el˝oz˝o fejezetben bemutatott színek felhasználásával esztétikusabbá szeretnénk azt tenni. A középre záráshoz a table környezeten belül, de még a tabular környezeten kívül létre kell hozni egy center környezetet. A színek alkalmazásánál meghatározhatjuk az egyes oszlopok, sorok, vagy cellák háttérszínét. Ehhez azonban szükségünk van egy csomagra, melynek neve colortbl. Ezt a preambulumban a
\usepackage{colortbl} \begin{table} \begin{center} \begin{tabular}{|>{\columncolor{LimeGreen}}l||c|r|} \hline \rowcolor{LimeGreen} & Ár & Volumen \\ \hline \hline Laspeyres & \cellcolor{YellowGreen} $\frac{\sum p_{1}q_{0}}{\sum p_{0}q_{0}}$ & \cellcolor{YellowGreen} $\frac{\sum p_{0}q_{1}}{\sum p_{0}q_{0}}$ \\ \hline Paasche & \cellcolor{YellowGreen} $\frac{\sum p_{1}q_{1}}{\sum p_{0}q_{1}}$ & \cellcolor{YellowGreen} $\frac{\sum p_{1}q_{1}}{\sum p_{1}q_{0}}$ \\ \hline \end{tabular} \end{center} \end{table} Ezt a táblázatot eredményezi: Ár Laspeyres Paasche
∑ p1 q0 ∑ p0 q0 ∑ p1 q1 ∑ p0 q1
Volumen ∑ p0 q1 ∑ p0 q0 ∑ p1 q1 ∑ p1 q0
Táblázatunkat természetesen meg is szeretnénk számozni, és aláírással szeretnénk ellátni. Ekkor még a table környezeten belül, de a tabular környezeten kívül, az ábrákhoz hasonlóan a \caption{} parancsot kell használnunk. Ennek m˝uködése már az ábrákra vonatkozó korábbi fejezetb˝ol ismert.
2.12
Címlap és jegyzékek Egy terjedelmes m˝unél egyértelm˝u, hogy szeretnénk készíteni címlapot, tartalomjegyzéket, ábrajegyzéket, esetleg a táblázatok jegyzékét. Ezek elkészítése a LATEX esetében automatikusan történik, és minden fordításkor frissül, így nem kell aggódnunk, hogy helyesen szerepelnek-e jegyzékeinkben az oldalszámok, vagy éppen címlapunkon a dátum.
2.13 Él˝ ofejek, él˝ olábak
20
A címlap elkészítéséhez a szövegtörzs elején kell megadnunk dokumentumunk alapvet˝o adatait, mint a szerz˝o, a cím, vagy a dátum. A szerz˝ot az alábbi paranccsal adhatjuk meg:
\author{ide jön a szerz® neve} A cím megadása az alábbi módon történik:
\title{ide jön a cím} A dátumot pedig az alábbi módon adhatjuk meg:
\date{ide jön a dátum} Amennyiben a dátumot nem adjuk meg, a LATEX automatikusan a fordítás napját helyettesíti be. Miután mindezzel megvagyunk, egy egyszer˝u paranccsal el is készíthetjük a címlapot. A szükséges parancs:
\maketitle Ezt a dokumentumon belül bárhol elhelyezve megjelenik a cím, a szerz˝o és a dátum. Ahhoz, hogy ez egy külön lapon történjen, a dokumentum többi részét egy oldaltöréssel tudjuk elválasztani. Tartalomjegyzékünk egyszer˝uen elkészíthet˝o a \tableofcontents paranccsal. Ekkor a LATEX automatikusan elkészíti a tartalomjegyzékünket az általunk meghatározott fejezetek, alfejezetek alapján. A tartalomjegyzék részletességét a preambulumban tudjuk szabályozni. Ehhez az alábbi parancs lesz a segítségünkre:
\setcounter{tocdepth}{mélység} A mélység helyére egy számnak kell kerülnie. A 2.4. táblázat bemutatta, hogy az egyes tagolási szintek milyen számmal jelölhet˝oek. Ennek megfelel˝oen be tudjuk állítani, hogy mit szeretnénk megjeleníteni a tartalomjegyzékünkben. Például ha csak chapter-ig szeretnénk megjeleníteni a tagolást, a mélység 0, míg ha az al-alfejezeteket is meg szeretnénk jeleníteni, a szükséges beállítás 3. Ábrajegyzékünket a \listoffigures paranccsal készíthetjük el. Az ábrajegyzék automatikusan frissül minden módosítás esetén. A táblázatok jegyzékének elkészítésére a \listoftables paranccsal nyílik lehet˝oségünk, mely a korábbiakhoz hasonlóan minden módosításnál automatikusan frissítésre kerül. Látható tehát, hogy a különböz˝o jegyzékek elkészítése a LATEX segítségével gyerekjáték, és nem kell aggódnunk azok helyességét illet˝oen. A címlappal kapcsolatban felmerülhet, hogy a hagyományos, LATEX által generált címlapokkal nem vagyunk megelégedve. Az interneten számos sablont találhatunk1 , de természetesen saját személyre szabott címlapunkat is elkészíthetjük, azonban erre annak összetettsége miatt most részletesebben nem térünk ki.
2.13
Él˝ ofejek, él˝ olábak A dokumentumunk él˝ofejének és él˝olábának elkészítésére a preambulumban van lehet˝oségünk. Egyes dokumentum típusok (mint a book vagy a report) automatikusan készítenek él˝ofejet, ugyanakkor ennek személyre szabására, valamint egyéb dokumentumtípusok esetén a megjelenítésére is lehet˝oségünk van. A legegyszer˝ubb megoldás erre a fancyhdr csomag használata. A preambulumban a
\usepackage{fancyhdr} paranccsal be is tölthetjük a csomagot. A csomag segítségével hat pozícióban helyezhetünk el különböz˝o tartalmakat. Az oldal tetején baloldalon, jobboldalon és középen, valamint az oldal alján is ugyanezen helyeken. Ehhez még a preambulumban az alábbi parancsokat kell kiadni: 1 Például
a http://www.latextemplates.com/cat/title-pages oldalon
2.14 Forráskódok, programkódok megjelenítése
21
\pagestyle{fancy} \lhead{Él®fej bal oldala} \chead{Él®fej közepe} \rhead{Él®fej jobb oldala} \lfoot{Él®láb bal oldala} \cfoot{Él®láb közepe} \rfoot{Él®láb jobb oldala} A megfelel˝o helyekre tetsz˝oleges szöveget is elhelyezhetünk, de gyakran szeretnénk inkább az oldalszámot viszontlátni. Ha valamelyik helyen az oldalszámot szeretnénk inkább látni, a \thepage parancsot kell az adott pozícióhoz behelyettesíteni. Ezen túl természetesen rengeteg lehet˝oség áll még rendelkezésünkre, az egyedi igények szinte mindegyikéhez találni megoldást az interneten.
2.14
Forráskódok, programkódok megjelenítése A dokumentumainkban lehet˝oségünk van forráskódok megjelenítésére is. Erre ebben a fejezetben két lehet˝oséget mutatunk be, az els˝o egy egyszer˝ubb megoldás, míg a második valamivel összetettebb. Jelen jegyzetben a LATEX kódok megjelenítésénél az egyszer˝ubb megoldást alkalmaztuk. Ehhez a verbatim csomag használata szükséges. Ezt a preambulumba írt \usepackage{verbatim} paranccsal tölthetjük be. Ez a csomag két lehet˝oséget kínál. Amennyiben egy rövid kódrészletet szeretnénk megjeleníteni a folyó szövegen belül, mint ahogy ezen bekezdésen belül a csomag neve vagy a csomag betöltésének módja szerepelt, a szövegben a \verb parancsot kell elhelyeznünk, majd két függ˝oleges vonal között az általunk megjeleníteni kívánt kódot. A csomag betöltésénél például az alábbi mondat áll jelen jegyzet forráskódjában:
Ezt a preambulumba írt \verb|\usepackage{verbatim}| paranccsal tölthetjük be. Amennyiben az imént látott, külön sorban elhelyezked˝o kódot szeretnénk kapni, úgy a verbatim környezetet kell használnunk. Ekkor egy \begin{verbatim} és egy \end{verbatim} parancs közé írhatjuk be a megjelenítend˝o kódot, amely akár több soros is lehet. Az ilyen módon megadott kódrészletet a LATEX automatikusan új sorban jeleníti meg. A másik megoldást jellemz˝oen összetettebb programkódok esetén használjuk. Ezt láthatjuk például a kés˝obbi fejezetekben a MATLAB kódok bemutatásánál. Ehhez a listings csomag használatára van szükség. Amennyiben MATLAB kódot szeretnénk megjeleníteni, kifejezetten hasznos ezen kívül az mcode csomag. Az mcode azonban nem érhet˝o el hagyományos módon, azt külön le kell töltenünk, és elhelyezni az általunk készített dokumentum mappájában. A csomag ide kattintva tölthet˝o le. A .zip fájlban megtalálható mcode.sty fájlt kell a mappánkba helyezni, és így máris be tudjuk tölteni a csomagot. A preambulumban adjuk ki a \usepackage{listings} parancsot, valamint a \usepackage{mcode} parancsot. Az mcode esetén számos beállítást alkalmazhatunk, a jellemz˝o beállítás az alábbi:
\usepackage[framed,numbered,autolinebreaks,useliterate]{mcode} Ezzel megadtuk, hogy a forráskódunkat keretes környezetben, sorait számozva és automatikusan megtörve, programelemeinket pedig a matlabban láthatóan színezve szeretnénk visszakapni. A programkódunkat egy lstlisting környezetben kell elhelyezni. Egy példán szemléltetve tekintsük az alábbi kódrészletet:
\begin{lstlisting} while 0>n(1) %Logikai feltetel. n(1)=input('Kerem, adjon meg egy indulo n erteket!'); %Muvelet end %Ciklus lezarasa. \end{lstlisting} Ennek eredménye az alábbi:
2.15 Hivatkozások és irodalomjegyzék 1 2 3
22
while 0>n(1) %Logikai feltetel. n(1)=input('Kerem, adjon meg egy indulo n erteket!'); %Muvelet end %Ciklus lezarasa.
Nagyon fontos, hogy a listings csomag nem kezeli az ékezetes karaktereket, így ezek használata nem megengedett. Ékezetes karaktereket tartalmazó kódot a verbatim csomag használatával javasolt megjeleníteni. Ugyancsak problémát jelenthet, hogy a listings csomag, bár nagyon esztétikus kimenetet eredményez, több csomaggal inkompatibilis, vagy legalábbis megfelel˝o sorrendben szükséges betölteni o˝ ket. Az egyik ilyen a már korábban bemutatott color csomag. Mivel a listings automatikusan betölti a hasonló funkciókkal rendelkez˝o xcolor csomagot, így a listings használata esetén az xcolor csomagot használjuk a color helyett. Az xcolor csomag esetén is elérhet˝oek a color csomag esetén bemutatott beállítások és parancsok.
2.15
Hivatkozások és irodalomjegyzék A LATEX egyik leghasznosabb funkciója a hivatkozások és a hivatkozásjegyzék készítése. Minderre a dokumentumunkban nagyon egyszer˝uen lehet˝oségünk nyílik. Els˝oként a táblázatokra és ábrákra való hivatkozás módját mutatjuk be, majd az egyéb dokumentumokra való hivatkozás módszerét ismertetjük. Amennyiben táblázatainkra, ábráinkra, egyenleteinkre a dokumentum kés˝obbi részében hivatkozni szeretnénk, egy kulccsal kell azokat ellátnunk, mely egyértelm˝uen azonosítja az adott táblázatot, ábrát, egyenletet. Ilyen kulcsot a \label{} paranccsal adhatunk meg. Ábrák esetén ezt a figure környezeten belül, a caption megadása után kell megtennünk. Táblázatok esetén a table környezeten belül, szintén a caption megadása után kell megtennünk. Egyenletek esetében hivatkozás használatára csak az align környezetben elhelyezett egyenleteink esetében van lehet˝oség, ilyenkor a label{} parancsot az adott egyenlet sorába, még a \\ lezárás el˝ott kell elhelyeznünk. A label{} kapcsos zárójelébe bármilyen egyedi kulcs kerülhet, azonban a kulcsok nem tartalmazhatnak ékezeteket. Az is problémát okozhat, ha kulcsként egy csomag vagy LATEX parancs nevét adjuk meg, így ezeket is kerüljük el. Miután a hivatkozandó egyenletet, ábrát, táblázatot elláttuk egy ilyen kulccsal, a hivatkozás a dokumentum bármely pontján lehetséges. Csak adjuk ki a \ref{kulcs} parancsot, és máris megjelenik a hivatkozott elem sorszáma. Amennyiben a preambulumban betöltjük a hyperref nev˝u csomagot, a hivatkozások a dokumentumon belül kattinthatóvá válnak, és kattintásra a dokumentum hivatkozott részére ugranak. Ugyancsak el˝ofordul, hogy küls˝o címekre, weboldalakra szeretnénk hivatkozni. Ilyenkor is a hyperref csomag a megoldás. Az egyik lehet˝oség, hogy a hivatkozásunkat a \url{} paranccsal oldjuk meg, ekkor a szövegben a teljes hiperlink megjelenik, és kattintásra átvisz az adott weboldalra. Például az alábbi parancs:
\url{http://makro.uni-corvinus.hu} Megnyitja a Makroökonómia Tanszék honlapját, és a következ˝o módon jelenik meg a dokumentumunkban: http://makro.uni-corvinus.hu. Amennyiben a konkrét url helyett egy alternatív szöveget szeretnénk megjeleníteni, úgy a \href{url}{szöveg} parancsot kell használni. Például az alábbi megoldással:
\href{http://makro.uni-corvinus.hu}{ide kattintva.} Elérhet˝o a Makroökonómia Tanszék honlapja ide kattintva. A legfontosabb talán mégis az, amikor küls˝o dokumentumokra, könyvekre, folyóiratcikkekre szeretnénk hivatkozni. Ilyenkor az els˝o dolgunk, hogy elkészítjük a hivatkozott dokumentumokról szóló információkat tartalmazó fájlunkat. Ennek a fájlnak egy különálló, .bib formátumú fájlnak kell lennie. Ezt akár a TeXworks-ben is elkészíthetjük és lementhetjük, de bármelyik egyszer˝u szövegszerkeszt˝ovel, például egy jegyzettömbbel is elkészíthetjük, a lényeg, hogy .bib formátumban mentsük el a fájlt. Ebben a fájlban fel kell sorolnunk az összes dokumentumot, amire hivatkozni szeretnénk. Minden egyes dokumentum esetében el˝oször meg kell határoznunk annak típusát, majd meg kell adnunk egy kulcsot, ezt követ˝oen pedig a dokumentum adatait kell felsorolnunk. Az alábbiakban rendre bemutatjuk, hogy milyen típusú
2.15 Hivatkozások és irodalomjegyzék
23
Szakdolgozat
Egyéb
Kiadatlan dokumentum
@mastersthesis{kulcs, author = "", title = "", school = "", %type = "", %address = "", year = "", %month = "", %note = "", }
@misc{kulcs, %author = "", %title = "", %howpublished = "", %year = "", %month = "", %note = "", }
@unpublished{kulcs, author = "", title = "", %year = "", %month = "", note = "", }
Folyóiratcikk
Könyv
Kiadvány
@article{kulcs, author = title = journal = %volume = %number = %pages = year = %month = %note = }
"", "", "", "", "", "", "", "", "",
@book{kulcs, author title publisher %volume %number %series %address %edition year %month %note }
= = = = = = = = = = =
"", "", "", "", "", "", "", "", "", "", "",
@booklet{kulcs, %author = "", title = "", %howpublished = "", %address = "", year = "", %month = "", %note = "", }
dokumentumokra tudunk hivatkozni, és azoknak milyen tulajdonságait tudjuk megadni. Azon mez˝oket, melyeket nem feltétlenül szükséges megadni, % jellel jelölünk. Ezeken kívül még létezik 8 egyéb dokumentum típus is, azonban azokat ritka használatuk miatt itt most nem mutatjuk be részletesen. Miután .bib fájlunkban az összes forrásunkat felsoroltuk, és a fájlt a .tex fájlunkkal egy mappába lementettük, visszatérhetünk az eredeti dokumentumunkhoz. Egyrészt meg szeretnénk vizsgálni, hogy miként tudunk szövegközi hivatkozásokat készíteni, másrészt bemutatjuk a hivatkozásjegyzék elkészítésének módját. Az els˝o és legfontosabb, hogy közvetlenül a dokumentum vége, tehát az \end{document} parancs el˝ott helyezzük el az alábbi kódot:
\bibliographystyle{stílus} \bibliography{fájlnév} A fájlnév helyére a .bib kiterjesztés˝u fájlunk nevét kell beírni karakterhelyesen. Ezzel be is töltöttük a .bib fájlt a dokumentumunkba, és elkészült a hivatkozásjegyzék. Ez azonban egészen addig nem tartalmaz egy dokumentumot sem, amíg ténylegesen nem történik arra hivatkozás a saját m˝uvünkön belül. Nagyon fontos továbbá, hogy a stílus felirat helyére az általunk választott formátum nevét helyettesítsük. A LATEX több formátumban is el tudja készíteni hivatkozásjegyzékünket. A leggyakrabban használt stílusok az authordate1, a plain, az apa illetve az alpha. Ezekr˝ol a fejezethez tartozó mintafájl ad áttekintést. Tekintsük most át azt, hogy miként hivatkozhatunk a dokumentumainkon belül a forrásainkra. Szövegközi hivatkozás esetén több parancs is rendelkezésünkre áll, melyeket a 2.9. táblázat foglal össze, N. Gregory Mankiw, David Romer és David N. Weil A Contribution to the Empirics of Economic Growth c. 1992-es cikkén keresztül (ahol a dokumentumhoz tartozó kulcs a mankiw). Ezeket az utasításokat bárhol elhelyezhetjük a dokumentumon belül, és máris visszakapjuk a megadott formátumú hivatkozást. Amennyiben egy dokumentumra hivatkozunk, az automatikusan be is kerül a hivatkozásjegyzékünkbe. Azonban csak olyan dokumentumok kerülnek a hivatkozásjegyzékbe, melyekre hivatkozunk is. A hyperref csomag használatával a szövegközi hivatkozásaink piros keretbe kerülnek,
2.15 Hivatkozások és irodalomjegyzék Parancs \citet{mankiw} \citep{mankiw} \citet*{mankiw} \citep*{mankiw} \citeauthor{mankiw} \citeauthor*{mankiw} \citeyear{mankiw} \citeyearpar{mankiw} \citealt{mankiw} \citealp{mankiw}
24 Minta Mankiw et al. (1992) (Mankiw et al., 1992) Mankiw, Romer és Weil (1992) (Mankiw, Romer és Weil, 1992) Mankiw et al. Mankiw, Romer és Weil 1992 (1992) Mankiw et al. 1992 Mankiw et al., 1992
Táblázat 2.9: Hivatkozási módok összefoglaló táblázata
és kattinthatóvá válnak, kattintásra pedig a hivatkozásjegyzék megfelel˝o részéhez ugrik a dokumentum. Amennyiben a csomag által alkalmazott kereteket el szeretnénk tüntetni, a hidelinks beállítást kell alkalmazni, tehát a csomag betöltésénél a \usepackage[hidelinks]{hyperref} paranccsal kell azt betölteni. Végül de nem utolsó sorban egy fontos dolgot nem hagyhatunk szó nélkül. Amennyiben lábjegyzetekkel szeretnénk ellátni dokumentumunkat, arra bármely ponton nagyon egyszer˝uen lehet˝oségünk nyílik. A \footnote{} parancsot kiadva azonnal elkészül a lábjegyzet, melyet a LATEX automatikusan számoz. A lábjegyzetet a kapcsos zárójelek közé kell írni. Ezzel át is tekintettük a szöveges dokumentumok legfontosabb elemeit. Természetesen többezer oldalt lehetne még írni a különböz˝o beállításokról és csomagokról, ezt egyes könyvek meg is teszik. Ugyanakkor jegyzetünk célja az alapvet˝o elemek ismertetése. Saját példánkból kiindulva hisszük, hogy akinek munkája során hasznos és szükséges lesz a kés˝obbiekben a LATEX, a további ismereteket már úgysem tankönyvekb˝ol sajátítja el, sokkal inkább az internet segítségével talál rá a számára szükséges megoldásokra. A következ˝o - immáron mondhatjuk - chapter-ben bemutatjuk a LATEX prezentáció készít˝o funkciójának, a beamer-nek a m˝uködését.
3 — LATEX-A Beamer használata 3.1
A Beamer dokumentumok szerkezeti felépítése A beamer a LATEXprezentáció-készít˝o funkciója, mely segítségével kiváló min˝oség˝u szakmai prezentációs anyagokat készíthetünk. Ennek használata során lehet˝oségünk van a szöveges dokumentumok esetében látott összes funkció használatára. Az egyetlen dolog, ami eltér, a dokumentumok szerkezeti felépítése, valamint azok megjelenésének szabályozása. A következ˝o fejezetekben ennek megfelel˝oen kizárólag ezekre térünk ki, a korábbiakban bemutatott funkciók beamerben való megvalósításának kipróbálását az olvasóra bízzuk. A beamer dokumentumok szerkezeti felépítése a két f˝o szerkezeti egységet tekintve (preambulum és szövegtörzs) megegyezik a szöveges dokumentumok felépítésével. A preambulumban azonban a dokumentum típusát mindenképp beamer-ként kell definiálni, tehát minden LATEXsegítségével készített prezentáció els˝o sora az alábbi:
\documentclass{beamer} Magát a prezentációt - a dokumentumokhoz hasonlóan - a \begin{document} és a \end{document} páros között kell elkészítenünk. A prezentációnk természetesen diákból épül fel. Minden diát külön-külön kell elkészítenünk. A diák létrehozására az alábbi paranccsal van lehet˝oségünk:
\begin{frame}{Dia címe} Dia tartalma \end{frame} A dia címe és tartalma természetesen tetsz˝olegesen megadható. A cím esetében használható az összes korábbi szövegformázási beállítás, de akár matematikai formulákat is elhelyezhetünk a dia címében. A dia tartalma esetében is egészen nyugodtan használható minden korábbi eszköz, matematikai formula, táblázat, képek és ábrák, felsorolások, stb. Ezek használatához értelemszer˝uen a korábbiakban bemutatott módon a szükséges csomagokat be kell tölteni. Mindezek diákon való használatát bemutatja a fejezethez tartozó mintafájl. A következ˝okben bemutatjuk, hogy miként szabhatjuk személyre diáink stílusát, hogyan végezhetünk azokon módosításokat.
3.2
A beamer diák stílusa Számos el˝ore definiált stílus áll rendelkezésünkre, melyek közül kedvünk szerint válogathatunk. Egy adott stílus alkalmazásához a preambulumban kell kiadnunk az alábbi parancsot:
\usetheme{Stílus neve}
3.3 Néhány beamer-specifikus utasítás
26
Összesen 26 különböz˝o el˝ore definiált stílus közül válogathatunk, melyek számos színárnyalatban rendelkezésre állnak. Amennyiben az alapértelmezett színösszeállítást módosítani szeretnénk, arra a preambulumban az alábbi paranccsal van lehet˝oségünk:
\usecolortheme{Szín elnevezése} Az összes stílus és szín példákkal illusztrálva megtekinthet˝o ezen a weboldalon. Miután kiválasztottuk a számunkra szimpatikus stílus- és színkombinációt, már csak el kell készítenünk prezentációnkat a korábban bemutatott eszközök segítségével. Természetesen lehet˝oségünk van egyedi diastílusok készítésére is, ugyanakkor ezt jelen jegyzetben annak komplexitása miatt nem mutatjuk be.
3.3
Néhány beamer-specifikus utasítás Ebben a fejezetben bemutatunk néhány olyan utasítást, melyek kifejezetten a beamer használata esetén lehetnek hasznosak, és csak beamer használata esetén m˝uködnek. Egy viszonylag gyakran használt, hasznos parancs a [plain] beállítás, melyet a \begin{frame} után helyezhetünk el. Ennek hatására az adott dia esetében nem kerül alkalmazásra az általunk korábban beállított stílus, hanem egy egyszer˝u, fehér diát kapunk. Ez kifejezetten hasznos lehet, amennyiben például a diánkon egy egyszer˝u képet szeretnénk megjeleníteni, és nem szeretnénk, ha a képet a dia többi eleme zavarná. Egy másik hasznos dolog az itemize és az enumerate alkalmazása esetén jelenik meg. El˝ofordulhat, hogy a felsorolások egyes elemeit nem szeretnénk rögtön megjeleníteni, csak kattintásra, 1 diával odébb. Felsorolások esetén lehet˝oségünk van megadni azt, hogy az adott elem a felsorolást tartalmazó diák közül hányadikon jelenjen meg. Például az alábbi utasítás esetén a LATEXgenerál egy diát, melyen csak a felsorolás els˝o pontja szerepel, egyet amelyen már az els˝o két pont, és egyet, melyen már mind a három pont szerepel:
\begin{enumerate} \item<1-> Els® elem \item<2-> Második elem \item<3-> Harmadik elem \end{enumerate} Természetesen mindezt tetsz˝olegesen szabályozhatjuk, el˝ofordulhat az is, hogy a felsorolás els˝o és harmadik elemét jelenítjük meg az els˝o diától, és csak a másodikat a második diától kezdve, ezt lehet˝oségünk van saját magunk szabályozni. Mindezekre számos példát tartalmaz a fejezethez tartozó mintafájl.
4 — Alapszámítások, vektorok, mátrixok
1. Feladat
Adja meg az A mátrix inverzét az inv() utasítás használata nélkül! 1 2 3 A = 4 10 6 7 8 9 Megoldás
Els˝o lépésként definiáljuk A mátrixot. 1 2 3 4
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése A=[1 2 3; 4 10 6; 7 8 9]; %A mátrix definiálása
Következ˝o lépésként fel kell használnunk, hogy bármely invertálható A ∈ Rn×n mátrix esetében igaz az, hogy A · A−1 = In , ahol In az n × n-es egységmátrix. Ez egyben azt is jelenti, hogy jelen esetben I3 és A hányadosaként megkapjuk A mátrix inverzét. Generáljuk le a 3 × 3-as egységmátrixot, majd végezzük el az osztást. 1 2
I=eye(3,3); %I mátrix, egy 3x3−as egységmátrix definiálása Ainv=I/A %Az inverz el˝ oállítása és kiíratása
A teljes programkód az alábbi: 1 2 3 4 5 6
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése A=[1 2 3; 4 10 6; 7 8 9]; %A mátrix definiálása I=eye(3,3); %I mátrix, egy 3x3−as egységmátrix definiálása Ainv=I/A %Az inverz el˝ oállítása és kiíratása
Ez alapján
−0, 7 −0, 1 0, 3 −0, 1 A−1 = −0, 1 0, 2 ˙ 0, 633 −0, 1 −0, 033˙
28 2. Feladat
Határozza meg az alábbi változók értékét, legalább 10 tizedesjegy pontossággal! π a = sin + cos (0, 2) 3 b = e−i·π 22 −π c= 7 2 1 d = ln 5 − 4 8 Megoldás
Mivel a MATLAB az i és a pi kifejezéseket ismeri, így a megoldás során ezekkel nem lesz problémánk. Az a változó esetében a kódunk: 1 2 3 4 5
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése format long %Hosszabb eredmények kiíratása a=sin(pi/3)+cos(0.2) %a értékének kiszámítása
A b változó értékének kiszámítása során e értékének megadása az exp() függvénnyel történik: 1
b=exp(1)^(−i*pi) %b értékének kiszámítása
A c változó kiszámítása: 1
c=22/7−pi %c értékének kiszámítása
Végül d értéke az alábbi: 1
d=log(5)−det([2 1;4 8]) %d értékének kiszámítása
Végül ne felejtsük el a korábban átállított számformátumot az eredetire visszaállítani: 1
format short %számformátum visszaállítása
A teljes kód az alábbi: 1 2 3 4 5 6 7 8 9
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése format long %Hosszabb eredmények kiíratása a=sin(pi/3)+cos(0.2) %a értékének kiszámítása b=exp(1)^(−i*pi) %b értékének kiszámítása c=22/7−pi %c értékének kiszámítása d=log(5)−det([2 1;4 8]) %d értékének kiszámítása format short %számformátum visszaállítása
Ez alapján a keresett értékek: a = 1, 846091981625680 b = −1 c = 0, 001264489267350 d = −10, 390562087565900
29 3. Feladat
Határozzuk meg az els˝o 1000 négyzetszám reciprokösszegét! Megoldás
El˝oször hozzunk létre egy vektort, megy 1-t˝ol 1000-ig tartalmazza a számokat, nevezzük ezt x-nek. 1 2 3 4
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése x=[1:1:1000]; %1−t˝ ol 1000−ig a számokat tartalmazó vektor
Ezt követ˝oen helyettesítsük a vektor minden tagját annak reciprokával: 1
x=1./x; %Számok reciprokainak kiszámítása
Szorozzuk meg a kapott vektort saját transzponáltjával. Vegyük észre, hogy ezzel pont a keresett értéket kapjuk, hiszen minden szám reciprokának négyzetét (amely ugyanaz, mint négyzetének reciproka) összeadjuk. 1
reciprok=x*x' %Eredmény kiszámítása
A teljes kód az alábbi: 1 2 3 4 5 6
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése x=[1:1:1000]; %1−t˝ ol 1000−ig a számokat tartalmazó vektor x=1./x; %Számok reciprokainak kiszámítása reciprok=x*x' %Eredmény kiszámítása
Ez alapján megállapíthatjuk, hogy: 1000
∑
i=1
1 = 1, 6439 i2
4. Feladat
Határozzuk meg az alábbi összeget! 1000
∑
n=1
n · (n + 1) 6
Megoldás
Els˝oként definiáljunk két vektort, melyek egyike (x) 1-t˝ol 1000-ig, míg a másik (y) 2-t˝ol 1001-ig tartalmazzák a számokat. 1 2 3 4 5
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése x=[1:1:1000]; %x vektor definiálása y=[2:1:1001]; %y vektor definiálása
Vegyük észre, hogy ekkor a keresett értéket megkaphatjuk az alábbi m˝uvelet eredményeként: 1000
∑
n=1
n · (n + 1) x · yT = 6 6
Számítsuk ki a végeredményt, és írassuk is ki. A teljes program az alábbi:
30 1 2 3 4 5 6
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése x=[1:1:1000]; %x vektor definiálása y=[2:1:1001]; %y vektor definiálása eredmeny=x*y'/6 %Végeredmény kiszámítása és kiíratása
A keresett összeg ez alapján: 1000
∑
n=1
n · (n + 1) = 55722333, 3˙ 6
5. Feladat
Számítsuk ki A·B, A B, AT ·B, 2·A+3·B értékét, valamint F mátrixot, amennyiben Fi j = Ai j +Ai j · Vizsgáljuk meg, szinguláris-e F mátrix, határozzuk meg sajátértékeit és sajátvektorait! −1 0, 5 4 1 A= B= 1 1 16 0 Megoldás
Els˝oként definiáljuk A és B mátrixokat: 1 2 3 4 5
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése A=[−1 0.5; 1 1]; %A mátrix definiálása B=[4 1; 16 0]; %B mátrix definiálása
Számítsuk ki a kért mátrixokat: 1 2 3 4
AB=A*B %A*B kiszámítása AoB=A.*B %AoB kiszámítása AtB=A'*B %A transzponált B kiszámítása KetAHaromB=2*A+3*B %A szorzatösszeg kiszámítása
Határozzuk meg F mátrixot: 1
F=A+A.*(B.^(0.5)); %F mátrix kiszámítása
Ellen˝orizzük a szingularitást: 1 2 3 4 5
if det(F)==0 %Ha a mátrix determinánsa 0, szinguláris disp('F mátrix szinguláris!') %Kiíratjuk else disp('F mátrix nem szinguláris!') %Ha nem 0, nem szinguláris end
Végül számítsuk ki a sajátvektorokat és sajátértékeket: 1
[S1 S2]=eig(F) %Sajátvektorok (S1) és sajátértékek (S2) számítása
p Bi j .
31 A teljes program az alábbi: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése A=[−1 0.5; 1 1]; %A mátrix definiálása B=[4 1; 16 0]; %B mátrix definiálása AB=A*B %A*B kiszámítása AoB=A.*B %AoB kiszámítása AtB=A'*B %A transzponált B kiszámítása KetAHaromB=2*A+3*B %A szorzatösszeg kiszámítása F=A+A.*(B.^(0.5)); %F mátrix kiszámítása if det(F)==0 %Ha a mátrix determinánsa 0, szinguláris disp('F mátrix szinguláris!') %Kiíratjuk else disp('F mátrix nem szinguláris!') %Ha nem 0, nem szinguláris end [S1 S2]=eig(F) %Sajátvektorok (S1) és sajátértékek (S2) számítása
Az eredményeink az alábbiak:
4 A·B = 20 −4 A B = 16 12 AT · B = 18 10 2·A+3·B = 50 −3 F= 5 F mátrix nem szinguláris, sajátvektorai: −0, 7071 S1 = 0, 7071
−1 1
0, 5 0 −1 0, 5 4 2 1 1
−0, 1961 S2 = −0, 9806
A keresett sajétértékek pedig −4 és 2. 6. Feladat
5 Budapesti lakásról ismertek az alábbi adatok: Becsüljük meg az árra vonatkozóan a lineáris regresszió Ár 11 Mft 7 Mft 12 Mft 10 Mft 9 Mft
Alapterület 64m2 40m2 70m2 63m2 55m2
Szobák száma 2 1 2,5 2 1,5
paramétereit! Megoldás
A lineáris regresszió paraméterei az alábbi módon állíthatók el˝o: −1 T β = XT · X ·X ·y Els˝o lépésként hozzuk létre X mátrixot és y vektort:
32 1 2 3 4 5
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése X=[1 64 2; 1 40 1; 1 70 2.5; 1 63 2; 1 55 1.5]; %X mátrix definiálása y=[11;7;12;10;9]; %y vektor definiálása
Ezt követ˝oen határozzuk meg a lineáris regresszió paramétereit: 1
beta=(X'*X)^(−1)*X'*y %Béta vektor becslése
A teljes program az alábbi: 1 2 3 4 5 6
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése X=[1 64 2; 1 40 1; 1 70 2.5; 1 63 2; 1 55 1.5]; %X mátrix definiálása y=[11;7;12;10;9]; %y vektor definiálása beta=(X'*X)^(−1)*X'*y %Béta vektor becslése
A kapott paraméterek alapján a becsl˝ofüggvényünk: Ár = 2, 0054 + 0, 0817 · Alapterület + 1, 6806 · Szobaszám 7. Feladat
Tegyük fel, hogy a dollár spot árfolyama 220 Ft, az euró spot árfolyama 310 Ft, míg a jüan árfolyama 37 forint. Számítsuk ki az összes keresztárfolyamot! Megoldás
Els˝o lépésként definiáljunk egy vektort, mely tartalmazza az árfolyamokat. 1 2 3 4
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése arfolyam=[220 310 37]; %Árfolyamokat tartalmazó vektor
Ezt követ˝oen számítsuk ki a keresztárfolyamokat tartalmazó mátrixot. Vegyük észre, hogy amennyiben az ar f olyam vektor transzponáltját megszorozzuk egy annak elemenkénti reciprokait tartalmazó vektorral, egy olyan mátrixhoz jutunk, mely a keresett keresztárfolyamokat tartalmazza. 1
keresztarfolyam=arfolyam'*(1./arfolyam); %Keresztárfolyamok mátrixa
A teljes program az alábbi: 1 2 3 4 5
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése arfolyam=[220 310 37]; %Árfolyamokat tartalmazó vektor keresztarfolyam=arfolyam'*(1./arfolyam); %Keresztárfolyamok mátrixa
Ez alapján a keresztárfolyamok az alábbiak: USD EUR CNY USD 1 0, 7097 5, 9459 EUR 1, 4091 1 8, 3789 CNY 0, 1682 0, 1194 1
33 8. Feladat
Egy üzletben ajándékkosarak készítésével foglalkoznak. Minden ajándékkosárba kávé, csokoládé és bor kerül, de eltér˝o mennyiségben. Ismert, hogy egy olyan ajándékkosár, mely 2 csomag kávét, 1 csokoládét és 1 üveg bort tartalmaz, összesen 2696 Forintba kerül. Az a kosár, amelyben 1 kávé, 3 csokoládé és 2 bor van 3594 Forintba kerül. Egy olyan kosár, amely minden termékb˝ol kett˝ot tartalmaz, 3994 Forintba kerül. Mennyi a csokoládé, a kávé és a bor ára külön-külön? Megoldás
Amennyiben az árakat rendre p1 , p2 és p3 jelöli, a probléma felírható az alábbi formában: 2 1 1 p1 2696 1 3 2 · p2 = 3594 2 2 2 p3 3994 Els˝o lépésként definiáljuk az együtthatókat tartalmazó mátrixot, valamint az értékeket tartalmazó vektort. 1 2 3 4 5
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése egyutthato=[2 1 1; 1 3 2; 2 2 2]; %Együttható mátrix osszeg=[2696;3594;3994]; %Érték mátrix
Ezt követ˝oen a mátrix inverze és a vektor szorzataként könnyedén kiszámíthatók a keresett árak. A teljes program: 1 2 3 4 5 6
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése egyutthato=[2 1 1; 1 3 2; 2 2 2]; %Együttható mátrix osszeg=[2696;3594;3994]; %Érték mátrix p=inv(egyutthato)*osszeg %Árak kiszámítása
Ez alapján egy kávé ára 699 Forint, egy csokoládé 299 Forintba, míg egy üveg bor 999 Forintba kerül. 9. Feladat
Egy gazdaságban négy terméket állítanak el˝o. Ezek árait és termelési mennyiségeit az alábbi táblázat tartalmazza: Termék A B C D
Ár 500 264 223 11
Mennyiség 1347 943 9221 32577753
Az alábbi táblázat bemutatja, hogy az oszlopban szerepl˝o termék egy egységének el˝oállításához hány egységet kell felhasználni a sorban szerepl˝o termékb˝ol:
A B C D
A 2
B 0,1 0,5 1
C 1
Számítsuk ki az adott gazdaságban a nominális GDP értékét!
D -
34 Megoldás
Els˝o lépésként definiáljunk egy p vektort, mely az árakat tartalmazza, valamint egy q vektort, mely a termelési mennyiségeket tartalmazza. Ezen felül az input-output koefficienseket tartalmazó mátrixot is definiáljuk, ez legyen COEFF mátrix. 1 2 3 4 5 6
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése p=[500 264 223 11]; %Az árak vektora q=[1347 943 9221 32577753]; %A mennyiségek vektora COEFF=[0 0.1 0 0;0 0 0 0;0 0.5 0 0;2 1 1 0]; %Koefficiens mátrix
Ezt követ˝oen számítsuk ki a bruttó termelést az árak és a mennyiségek szorzatösszegeként: 1
brutto=p*q'; %Bruttó termelés kiszámítása
A következ˝o lépés a folyó termel˝o felhasználás értékének meghatározása. Vegyük észre, hogy COEFF mátrix és a mennyiségek vektorának transzponáltjának szorzataként megkapjuk, hogy az egyes termékekb˝ol hány darabot használtunk fel összesen gyártás során. Ezt a vektort balról az árakkal megszorozva adódik a folyó termel˝o felhasználás értéke. 1
FTF=p*(COEFF*q'); %Folyó termel˝ o felhasználás
A GDP a bruttó termelés és a folyó termel˝o felhasználás különbségeként adódik: 1
GDP=brutto−FTF %GDP kiszámítása
A teljes program az alábbi: 1 2 3 4 5 6 7 8 9
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése p=[500 264 223 11]; %Az árak vektora q=[1347 943 9221 32577753]; %A mennyiségek vektora COEFF=[0 0.1 0 0;0 0 0 0;0 0.5 0 0;2 1 1 0]; %Koefficiens mátrix brutto=p*q'; %Bruttó termelés kiszámítása FTF=p*(COEFF*q'); %Folyó termel˝ o felhasználás GDP=brutto−FTF %GDP kiszámítása
A GDP értéke ez alapján 361040285,5. 10.Feladat
Generáljunk egy olyan 50 × 100-as mátrixot, mely 0 és 70 közötti véletlen egész számokat tartalmaz. Ezt követ˝oen generáljunk egy ugyanolyan méret˝u mátrixot, mely véletlenszer˝uen tartalmaz 1-eseket és 0-kat. Végül számítsuk ki az els˝o mátrix azon elemeinek átlagát, melyek esetében a másodikként generált mátrix megegyez˝o helyén 1-es szerepel. Megoldás
Els˝oként generáljuk le a véletlen egészeket tartalmazó X mátrixot. Ehhez egy [0, 1[ intervallumon véletlen számokat tartalmazó mátrixot 71-gyel megszorzunk, majd vesszük minden elem alsó egészrészét, így tényleg 0 és 70 közötti egészeket fogunk kapni.
35 1 2 3 4
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése X=floor(rand(50,100)*71); %50*100 véletlen szám a [0,71[ intervallumon, majd ... annak alsó egészrésze
Ezt követ˝oen legeneráljuk Y mátrixot az el˝oz˝o logika alapján, azonban ennek csak 1-eseket és 0-kat szabad tartalmaznia. 1
Y=floor(rand(50,100)*2); %50*100 véletlen szám a [0,2[ intervallumon, majd ... annak alsó egészrésze
Végül kiszámoljuk a megfelel˝o elemek átlagát. Vegyük észre, hogy elemenkénti szorzás segítségével a nem szükséges elemek értékét nullázni tudjuk, így ha ezen m˝uvelet után adjuk össze a mátrix elemeit, tényleg csak az átlagolandó elemeket adjuk össze. Ezt Y mátrix összegével leosztva megkapjuk a szükséges elemek átlagát. 1
atlag=sum(X.*Y)/sum(Y) %Elemenkénti szorzat összege, majd elemszámmal való osztás
A teljes program az alábbi: 1 2 3 4
5
6
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése X=floor(rand(50,100)*71); %50*100 véletlen szám a [0,71[ intervallumon, majd ... annak alsó egészrésze Y=floor(rand(50,100)*2); %50*100 véletlen szám a [0,2[ intervallumon, majd ... annak alsó egészrésze atlag=sum(X.*Y)/sum(Y) %Elemenkénti szorzat összege, majd elemszámmal való osztás
A megoldás egy 35-höz viszonylag közeli szám kell hogy legyen. 11. Feladat
Öt magyar város (Budapest, Gy˝or, Veszprém, Pannonhalma, Szombathely) közötti vasúti közlekedésre igazak az alábbiak: • Budapestr˝ol közvetlen járattal el lehet jutni Gy˝orbe, Veszprémbe és Szombathelyre • Gy˝orb˝ol és Veszprémb˝ol mindenhová van közvetlen járat • Pannonhalmáról csak Gy˝orbe vagy Veszprémbe lehet eljutni • Szombathelyr˝ol Pannonhalma kivételével mindenhová el lehet jutni. Hányféleképpen juthatunk el pontosan 1 átszállással Veszprémb˝ol Budapestre? Megoldás
Az els˝o lépés, hogy készítünk egy mátrixot, mely a lehetséges útvonalakat tartalmazza. A mátrixnak ennek megfelel˝oen az alábbi módon kell kinéznie:
B Gy V P Sz
B Gy V 0 1 1 1 0 1 1 1 0 0 1 1 1 1 1
P Sz 0 1 1 1 1 1 0 0 0 0
A mátrixban 1-es jelöli azokat az útvonalakat, ahol jár vonat, és 0 azokat, ahol nem jár vonat. Mindez MATLAB-ban:
36 1 2 3 4
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése vonat=[0 1 1 0 1;1 0 1 1 1;1 1 0 1 1;0 1 1 0 0;1 1 1 0 0]; %Járatok megadása
Amennyiben ezt a mátrixot négyzetre emeljük, pont azt kapjuk meg, hogy az egyes célállomások között hányféleképpen tudunk pontosan egy átszállással eljutni. Gondoljuk csak végig! Minden egyes elem kiszámításánál az adott sor és oszlop elemeinek szorzatösszegét vesszük. Ezen szorzatok csak akkor adnak 1-es értéket, ha mindkét szám a szorzatban egy. Mit is jelent ez? Tekintsük például a PannonhalmaBudapest útvonalat. A mátrix adott elemének értéke az alábbi módon alakul: 0·0+1·1+1·1+0·0+1·0 Az els˝o 0 · 0 szorzat annyit jelent, hogy Pannonhalmáról nem lehet Budapestre közvetlenül eljutni, és Budapestr˝ol Budapestre sem, így 1 átszállással nem tudunk eljutni Pannonhalmáról Budapestre. A következ˝o 1 · 1 szorzat azt mutatja nekünk, hogy Pannonhalma és Gy˝or között, valamint Gy˝or és Budapest között is van közvetlen kapcsolat, így ezen az útvonalon egy átszállással el tudnunk jutni Budapestre. Ugyanilyen logika alapján belátható, hogy a mátrix négyzete tényleg a keresett kérdésre ad választ. Következ˝o lépésként tehát emeljük négyzetre a mátrixot, majd válasszuk ki ennek Budapest-Veszprém elemét. 1 2
atszallas=(vonat^2); %Átszállási lehet˝ oségek számítása bpvp=atszallas(3,1) %Megoldás kiíratása
A teljes kód az alábbi: 1 2 3 4 5 6
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése vonat=[0 1 1 0 1;1 0 1 1 1;1 1 0 1 1;0 1 1 0 0;1 1 1 0 0]; %Járatok megadása atszallas=(vonat^2); %Átszállási lehet˝ oségek számítása bpvp=atszallas(3,1) %Megoldás kiíratása
Veszprém és Budapest között pontosan 1 átszállással összesen 2 útvonalat választhatunk.
5 — Függvények, elágazások és ciklusok
1. Feladat
Határozzuk meg a Fibonacci-sor els˝o 20 elemét! Megoldás
A Fibonacci-sor els˝o két eleme 1, az utána következ˝o elemek pedig a megel˝oz˝o két elem összegeként adódnak. Definiáljuk a Fibonacci vektort, melynek els˝o két eleme 1. 1 2 3 4 5
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése Fibonacci(1)=1; %A vektor els˝ o eleme 1 Fibonacci(2)=1; %A vektor második eleme 1
Ezt követ˝oen a következ˝o 18 elemet egy ciklus segítségével számíthatjuk ki. 1 2
3
for i=3:20 %3−20. elemeket szeretnénk kiszámítani Fibonacci(i)=Fibonacci(i−1)+Fibonacci(i−2); %A következ˝ o elem az el˝ oz˝ o ... kett˝ o összege end
Végül az eredményt is kiírathatjuk. A teljes program az alábbi: 1 2 3 4 5 6 7
8 9
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése Fibonacci(1)=1; %A vektor els˝ o eleme 1 Fibonacci(2)=1; %A vektor második eleme 1 for i=3:20 %3−20. elemeket szeretnénk kiszámítani Fibonacci(i)=Fibonacci(i−1)+Fibonacci(i−2); %A következ˝ o elem az el˝ oz˝ o ... kett˝ o összege end Fibonacci %Megoldás kiíratása
A megoldás az alábbi vektor: Fibonacci = [1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765]
38 2. Feladat 2
Határozzuk meg, hogy hány négyzetszám reciprokát kell összeadni ahhoz, hogy π6 (a négyzetszámok reciprokösszege) 0,1 0,01 0,001 0,0001 0,00001 0,000001 vagy 0,0000001 sugarú környezetébe kerüljünk! Megoldás
Els˝o lépésként definiáljunk egy for ciklust, hiszen összesen 7 feladatra kell választ találnunk. 1 2 3 4 5
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése for j=1:7 %10^(−1) és 10^(−7) között szeretnénk vizsgálódni end 2
Második lépésként a ciklusmagban definiáljuk x változót, melynek kezdeti értéke pontosan π6 , ezt fogjuk egészen addig csökkenteni, amíg a keresett értéknél kisebb számot nem kapunk. Definiáljunk ezen kívül egy i változót, mely azt számolja, hogy összesen hányszor léptünk be a következ˝okben létrehozott ciklus magjába. 1 2 3 4 5 6 7 8
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése for j=1:7 %10^(−1) és 10^(−7) között szeretnénk vizsgálódni x=pi^2/6; %változó definiálása és induló érték adása i=0; %számláló változó definiálása end megoldas %Megoldás kiíratása
Hozzunk létre egy while ciklust, mely egészen addig növeli i értékét, amíg az adott négyzetszám reciprokát a korábbi eredményb˝ol kivonva el nem jutunk egy 10− j -nél kisebb számhoz. Ez a megoldásunk, ezt tároljuk el a megoldas nev˝u vektor j. elemeként. A legvégén írassuk ki a vektort. A teljes program ez alapján az alábbi: 1 2 3 4 5 6 7
8 9 10 11 12 13
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése for j=1:7 %10^(−1) és 10^(−7) között szeretnénk vizsgálódni x=pi^2/6; %változó definiálása és induló érték adása i=0; %számláló változó definiálása while x>10^(−j) %A ciklus addig fut, amíg nem lesz a különbözet ... 10^(−j)−nél kisebb i=i+1; %Beléptünk a ciklusmagba x=x−1/i^2; %kivonjuk az adott szám négyzetének reciprokát end megoldas(j)=i; %A megoldást egy vektor j. elemeként tároljuk end megoldas %Megoldás kiíratása
Megoldásként az alábbi vektort kapjuk: [10
100
1000
10000
100000
1000000
10000000]
39 3. Feladat
Készítsünk egy olyan mátrixot, mely tartalmazza az 1 − 10 éves diszkontfaktorokat 1 − 5%-os éves hozam mellett. Megoldás
Definiáljunk a hozam vektort, mely a hozamokat tartalmazza 1 és 5 százalék között. 1 2 3 4
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése hozam=[0.01:0.01:0.05] %Hozamokat tartalmazó vektor
A diszkontfaktorok az alábbi képlet segítségével számíthatók: DF(t, r) =
1 (1 + r)t
Látható, hogy a kétéves diszkontfaktor pontosan az egyéves négyzete, a hároméves a köbe, stb. Ennek megfelel˝oen célszer˝u a hozamokból létrehozni az egyéves diszkontfaktorokat: 1
DF1=1./(1+hozam); %1 éves diszkontfaktorok
Ezt követ˝oen egy egyszer˝u for ciklus segítségével létrehozhatjuk a diszkontfaktor-mátrixunkat. 1 2 3
for i=1:10 %1−10 év DFmatrix(i,:)=DF1.^i; %Az egész sor az egyéves DF adott hatványa end
A teljes profram az alábbi: 1 2 3 4 5 6 7 8
close all; %Nyitott ablakok bezárása clear all; %Korábban definiált változók törlése clc; %Command Window tartalmának törlése hozam=[0.01:0.01:0.05]; %Hozamokat tartalmazó vektor DF1=1./(1+hozam); %1 éves diszkontfaktorok for i=1:10 %1−10 év DFmatrix(i,:)=DF1.^i; %Az egész sor az egyéves DF adott hatványa end
40 4. Feladat
Írjunk egy olyan programot, mely bekér a felhasználótól egy pozitív egész számot, és a Pascal-háromszög adott sorát adja vissza vektorként! Megoldás
Írjuk meg a program környezetét, melyben a teljes programot elhelyezzük. Ennek keretében ellen˝orizzük, hogy a beadott változók száma 1-e, valamint hogy pozitív egész számot írt-e be a felhasználó. Ha nem, akkor megfelel˝o hibaüzenet mellett kilépünk a programból. Ha ezen hibák egyike sem áll fenn, lefuthat a program. 1 2 3 4 5 6 7 8 9 10 11
function[sor]=pascalhsz(n) %A függvény kimen˝ o változója a sor, inputváltozója n if nargin~=1 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 1, jelezzük return %Majd lépjünk ki a programból. elseif (logical(n>0)*(mod(n,1)+1))~=1 %Ha a szám 0 vagy kisebb vagy nem egész disp('A megadott szám nem pozitív egész') %Kiírjuk a hibát return %Majd kilépünk else %Ha minden rendben, indulhat a program %IDE ÍRJUK MAJD A PROGRAMOT end end
A programot az elágazás else ágára írjuk, vagyis akkor fut majd le, ha semmilyen hiba nem történt. A pascal háromszög els˝o sora 1, második sora 1-1, a harmadik sortól pedig a két széls˝o elem mindig egy, középen pedig a megel˝oz˝o sor megfelel˝o elemeinek összegei szerepelnek. Érdemes ezért három részre bontani a feladatot. Ha a beadott szám 1, ha a beadott szám 2, illetve ha az 3 vagy nagyobb. Az els˝o két eset, illetve a szükséges elágazás: 1 2 3 4 5 6 7
if n==1 %Ha az inputváltozó 1 sor=1; %Az eredmény 1 elseif n==2 %Ha az inputváltozó 2 sor=[1 1]; %Az eredmény 1−1 else %Ide jön az n>2 eset end
Ha 2-nél nagyobb számú sor kell, azt egy ciklus segítségével tudjuk létrehozni. A ciklus minden esetben 1-gyel növeli egy vektor hosszát, az els˝o és az utolsó elemeként 1-et ad meg, a köztes elemeket pedig (egy újabb ciklussal) kiszámítja. Ehhez vezessük be a v1 és v2 ideiglenesen használt vektorokat. A ciklus az alábbi: 1 2 3 4 5 6 7
v1=[1 1]; %A pascal háromszög 2. sora for j=3:n %A 3−n. sorig szeretnénk számolni. v2(1)=1; %Az új vektor els˝ o eleme 1 v2(j)=1; %Az új vektor j. eleme is 1 %IDE JÖN A PROGRAMKÓD, MELY A KÖZTES ELEMEKET SZÁMOLJA v1=v2; %A következ˝ o ciklus kiinduló vektora a most létrehozott vektor end
Már csak azt a ciklust kell megírnunk, mely a köztes vektorelemeket kiszámítja. Ilyen elemekb˝ol mindig egészen pontosan ( j − 2) darab van. Ennek megfelel˝oen a ciklus az alábbi:
41 1
for i=1:(j−2) v2(1+i)=v1(i)+v1(1+i); %A 2. elemt˝ ol kezdve minden elem a ... vele azonos számú, és az adott elemet eggyel megel˝ oz˝ o ... szám összegeként számítható
2
3
end
Természetesen a legküls˝o elágazás végén még a kimen˝o változó értékét egyenl˝ové kell tenni v1 vektorral. A teljes program így az alábbi: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
20 21 22 23 24 25 26
function[sor]=pascalhsz(n) %A függvény kimen˝ o változója a sor, inputváltozója n if nargin~=1 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 1, jelezzük return %Majd lépjünk ki a programból. elseif (logical(n>0)*(mod(n,1)+1))~=1 %Ha a szám 0 vagy kisebb vagy nem egész disp('A megadott szám nem pozitív egész') %Kiírjuk a hibát return %Majd kilépünk else %Ha minden rendben, indulhat a program if n==1 %Ha az inputváltozó 1 sor=1; %Az eredmény 1 elseif n==2 %Ha az inputváltozó 2 sor=[1 1]; %Az eredmény 1−1 else v1=[1 1]; %A pascal háromszög 2. sora for j=3:n %A 3−n. sorig szeretnénk számolni. v2(1)=1; %Az új vektor els˝ o eleme 1 v2(j)=1; %Az új vektor j. eleme is 1 for i=1:(j−2) v2(1+i)=v1(i)+v1(1+i); %A 2. elemt˝ ol kezdve minden elem a ... vele azonos számú, és az adott elemet eggyel megel˝ oz˝ o ... szám összegeként számítható end v1=v2; %A következ˝ o ciklus kiinduló vektora a most létrehozott vektor end sor=v1; %Az eredmény v1 vektor. end end end
5. Feladat
Írjunk egy olyan függvényt, mely kiszámolja a Fibonacci-sor els˝o n elemének összegét! Megoldás
A Fibonacci-sor els˝o két eleme 1, az összes többi a megel˝oz˝o két elem összegeként adódik. A függvényünk értelemszer˝uen egy inputváltozóval rendelkezik, ezt jelölje n, illetve ez a szám egy pozitív egész kell hogy legyen. A program kerete az alábbi: 1
2 3 4 5 6 7 8 9 10 11
function[osszeg]=fibszum(n) %A függvény kimen˝ o változója az osszeg, ... inputváltozója n if nargin~=1 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 1, jelezzük return %Majd lépjünk ki a programból. elseif (logical(n>0)*(mod(n,1)+1))~=1 %Ha a szám 0 vagy kisebb vagy nem egész disp('A megadott szám nem pozitív egész') %Kiírjuk a hibát return %Majd kilépünk else %Ha minden rendben, indulhat a program %IDE JÖN A PROGRAM end end
42 Bontsuk a feladatot 3 részre. Ha az input 1, akkor az összeg 1. Ha az input 2, akkor az összeg 2. Ha az input 3 vagy nagyobb, akkor számítsuk ki a sor elemeit egészen n-ig, majd adjuk o˝ ket össze. Ezt az alábbi módon tehetjük meg: 1
if n==1 osszeg=1; elseif n==2 osszeg=2; else fib=[1 1]; %A sor els˝ o két eleme for i=3:n %kiszámítjuk a 3−n. elemeket fib(i)=fib(i−1)+fib(i−2); %Az adott elem az el˝ oz˝ o kett˝ o összege end osszeg=sum(fib); %A vektor tagjainak összege a keresett érték
2 3 4 5 6 7 8 9 10 11
end
A teljes program: 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
function[osszeg]=fibszum(n) %A függvény kimen˝ o változója az osszeg, ... inputváltozója n if nargin~=1 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 1, jelezzük return %Majd lépjünk ki a programból. elseif (logical(n>0)*(mod(n,1)+1))~=1 %Ha a szám 0 vagy kisebb vagy nem egész disp('A megadott szám nem pozitív egész') %Kiírjuk a hibát return %Majd kilépünk else %Ha minden rendben, indulhat a program if n==1 osszeg=1; elseif n==2 osszeg=2; else fib=[1 1]; %A sor els˝ o két eleme for i=3:n %kiszámítjuk a 3−n. elemeket fib(i)=fib(i−1)+fib(i−2); %Az adott elem az el˝ oz˝ o kett˝ o összege end osszeg=sum(fib); %A vektor tagjainak összege a keresett érték end end end
6. Feladat
Írjunk egy olyan programot, melynek inputváltozója egy valós szám, kimenete pedig egy kételem˝u vektor, mely a szám egész- és törtrészét tartalmazza. Megoldás
Készítsük el a program keretét, mely ellen˝orzi, hogy tényleg egy input van-e. 1
2 3 4 5 6 7 8
function[megoldas]=egesztort(x) %A függvény kimen˝ o változója a megoldas, ... inputváltozója x if nargin~=1 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 1, jelezzük return %Majd lépjünk ki a programból. else %Ha minden rendben, indulhat a program %IDE JÖN A PROGRAM end end
43 Els˝oként válasszunk szét két esetet, ha x negatív illetve ha x nemnegatív. Ha negatív számról van szó, az egész rész az adott számhoz legközelebbi, nála nagyobb szám. Ha nem negatív, akkor az adott számhoz legközelebbi, nála kisebb számra vagyunk kíváncsiak. A tört rész az eredeti szám és az egészrész különbségeként kiszámítható. 1 2 3 4 5 6 7 8
if x<0 %negatív számok esetén egeszresz=ceil(x); %Fels˝ o egész tortresz=x−egeszresz; %tört rész else egeszresz=floor(x); %Alsó egész tortresz=x−egeszresz; %tört rész end megoldas=[egeszresz tortresz];
A teljes program az alábbi: 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15
function[megoldas]=egesztort(x) %A függvény kimen˝ o változója a megoldas, ... inputváltozója x if nargin~=1 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 1, jelezzük return %Majd lépjünk ki a programból. else %Ha minden rendben, indulhat a program if x<0 %negatív számok esetén egeszresz=ceil(x); %Fels˝ o egész tortresz=x−egeszresz; %tört rész else egeszresz=floor(x); %Alsó egész tortresz=x−egeszresz; %tört rész end megoldas=[egeszresz tortresz]; end end
7. Feladat
Írjunk egy olyan programot, amelynek egy pozitív egész inputváltozója van, n, és kiszámolja az alábbi összeget: n i+2 ∑ i! i=1 Megoldás
Els˝oként ellen˝orizzük, hogy egy inputváltozónk van-e, illetve az pozitív egész-e. Ha nem, megfelel˝o hibaüzenetet követ˝oen lépjünk ki. 1
2 3 4 5 6 7 8 9 10 11
function[osszeg]=sorosszeg(n) %A függvény kimen˝ o változója az osszeg, ... inputváltozója n if nargin~=1 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 1, jelezzük return %Majd lépjünk ki a programból. elseif (logical(n>0)*(mod(n,1)+1))~=1 %Ha a szám 0 vagy kisebb vagy nem egész disp('A megadott szám nem pozitív egész') %Kiírjuk a hibát return %Majd kilépünk else %Ha minden rendben, indulhat a program %IDE JÖN A PROGRAM end end
44 A definiáljunk egy szum nev˝u változót, melyben eltároljuk az elemek összegét. Ezt követ˝oen egy for ciklus segítségével kiszámíthatjuk a keresett összeget. 1 2 3 4
szum=0; %Az összeg kezdeti értéke 0 for i=1:n szum=szum+(i+2)/factorial(i); %Mindig a következ˝ o tag értékével növeljük end
Végül a kimen˝o változó értékeként szum-ot adunk meg. 1
osszeg=szum; %A kimenet szum
A teljes program az alábbi: 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15
function[osszeg]=sorosszeg(n) %A függvény kimen˝ o változója az osszeg, ... inputváltozója n if nargin~=1 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 1, jelezzük return %Majd lépjünk ki a programból. elseif (logical(n>0)*(mod(n,1)+1))~=1 %Ha a szám 0 vagy kisebb vagy nem egész disp('A megadott szám nem pozitív egész') %Kiírjuk a hibát return %Majd kilépünk else %Ha minden rendben, indulhat a program szum=0; %Az összeg kezdeti értéke 0 for i=1:n szum=szum+(i+2)/factorial(i); %Mindig a következ˝ o tag értékével növeljük end osszeg=szum; %A kimenet szum end end
8. Feladat
Írj egy olyan programot, melynek három inputváltozója van, egy id˝oszak szám, egy hozam, illetve egy összeg, melyekb˝ol a program kiszámolja az egy év múlva kezd˝od˝o, t id˝oszakos, r hozamú annuitás jelenértékét! Megoldás
Els˝oként ellen˝orizzük, hogy tényleg három inputváltozónk van-e, hogy az id˝oszakok száma pozitív egész-e illetve hogy a megadott hozam 0 és 1 közötti érték-e. Ezt egy elágazással oldhatjuk meg. 1
2 3 4 5
6
7 8 9 10 11
function[jelen]=annuitas(C,t,r) %A program inputjai C (összeg), t (id˝ oszak ... szám) és r (hozam) if nargin~=3 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 3, jelezzük return %Majd lépjünk ki a programból. elseif (logical(r>0)*logical(le(r,1))*(mod(t,1)+1)*logical(t>0))~=1 %A hozam ... 0 és 1 közötti kell, hogy legyen, valamint az id˝ oszakok száma egész és ... pozitív kell hogy legyen disp(['A megadott inputok hibásak! A hozamnak 0 és 1 között kell lennie! ... Az id˝ oszakok száma csak pozitív egész lehet!']) %Ha nem teljesül, ... akkor hibaüzenetet írunk ki return %Majd kilépés a programból else %Ha nincs hiba, indulhat a program %IDE JÖN A PROGRAM end end
45 Magát a programot már nem nehéz elkészíteni, hiszen egy egy id˝oszak múlva kezd˝od˝o annuitás jelenértéke az alábbi módon számítható: 1 1 PV (C,t, r) = C · 1− r (1 + r)t Ez alapján a program maga az alábbi sorból áll: 1
jelen=C*(1/r)*(1−1/((1+r)^t)); %Jelenérték számítása
A teljes program tehát az alábbi: 1
2 3 4 5
6
7 8 9 10 11
function[jelen]=annuitas(C,t,r) %A program inputjai C (összeg), t (id˝ oszak ... szám) és r (hozam) if nargin~=3 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 3, jelezzük return %Majd lépjünk ki a programból. elseif (logical(r>0)*logical(le(r,1))*(mod(t,1)+1)*logical(t>0))~=1 %A hozam ... 0 és 1 közötti kell, hogy legyen, valamint az id˝ oszakok száma egész és ... pozitív kell hogy legyen disp(['A megadott inputok hibásak! A hozamnak 0 és 1 között kell lennie! ... Az id˝ oszakok száma csak pozitív egész lehet!']) %Ha nem teljesül, ... akkor hibaüzenetet írunk ki return %Majd kilépés a programból else %Ha nincs hiba, indulhat a program jelen=C*(1/r)*(1−1/((1+r)^t)); %Jelenérték számítása end end
9. Feladat
Írjunk egy olyan programot, melynek bemenete egy mátrix, valamint két pozitív egész szám. A program outputja ugyancsak egy mátrix, melyben az inputként megadott mátrix két - a másik két input által meghatározott sora fel van cserélve. Megoldás
Els˝oként ellen˝orizzük, hogy tényleg 3 input van-e megadva, valamint hogy a felcserélend˝o sorok pozitív egészek-e, és nem haladják-e meg a mátrix dimenzióit. 1
2 3 4 5 6
7
8 9 10 11 12
function[megoldas]=sorcsere(matrix,sor1,sor2) %A program inputjai egy mátrix, ... valamint két sor if nargin~=3 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 3, jelezzük return %Majd lépjünk ki a programból. elseif (logical(sor1>0)*logical(le(sor1,size(matrix,1)))*logical(sor2>0)*... logical(le(sor2,size(matrix,1)))*(mod(sor1,1)+1)*(mod(sor2,1)+1))~=1 %A ... soroknak pozitív egésznek kell lenniük, és nem haladhatják meg a mátrix ... dimenzióit disp(['A megadott inputok hibásak! A sorok csak pozitív egészek lehetnek, ... és nem haladhatják meg a mátrix dimenzióit!']) %Ha nem teljesül, ... akkor hibaüzenetet írunk ki return %Majd kilépés a programból else %Ha nincs hiba, indulhat a program %IDE JÖN A PROGRAM end end
Következ˝o lépésként végrehajtjuk a sorcserét. A mátrix [sor1 sor2] sorai helyére a [sor2 kerülnek.
sor1] sorok
46 1 2
matrix([sor1 sor2],:)=matrix([sor2 sor1],:); %Felcseréljük a mátrix sorait megoldas=matrix; %A megoldás az így el˝ oállított mátrix
A teljes program az alábbi: 1
2 3 4 5 6
7
8 9 10 11 12 13
function[megoldas]=sorcsere(matrix,sor1,sor2) %A program inputjai egy mátrix, ... valamint két sor if nargin~=3 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 3, jelezzük return %Majd lépjünk ki a programból. elseif (logical(sor1>0)*logical(le(sor1,size(matrix,1)))*logical(sor2>0)*... logical(le(sor2,size(matrix,1)))*(mod(sor1,1)+1)*(mod(sor2,1)+1))~=1 ... %A soroknak pozitív egésznek kell lenniük, és nem haladhatják meg ... a mátrix dimenzióit disp(['A megadott inputok hibásak! A sorok csak pozitív egészek lehetnek, ... és nem haladhatják meg a mátrix dimenzióit!']) %Ha nem teljesül, ... akkor hibaüzenetet írunk ki return %Majd kilépés a programból else %Ha nincs hiba, indulhat a program matrix([sor1 sor2],:)=matrix([sor2 sor1],:); %Felcseréljük a mátrix sorait megoldas=matrix; %A megoldás az így el˝ oállított mátrix end end
10. Feladat
Írjunk egy olyan programot, mely egy háromszög három oldalának megadását követ˝oen visszaadja annak területét! Megoldás
Els˝o lépésben ellen˝orizzük, hogy a bemen˝o változók száma három-e, valamint azt, hogy a megadott oldal adatok lehetnek-e egy háromszög oldalai. A háromszög oldalaira mindig teljesül, hogy bármely oldal hossza kisebb, mint a másik két oldal hosszának összege. Egy elágazásban ellen˝orizzük, hogy minden feltétel teljesül-e, amennyiben nem, megfelel˝o hibaüzenet mellett lépjünk ki. 1 2 3 4 5 6 7
8 9 10 11 12
function[terulet]=hszogter(a,b,c) %A program inputjai a, b és c if nargin~=3 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 3, jelezzük return %Majd lépjünk ki a programból. elseif logical(a
A háromszög területét a három oldal ismeretében legegyszer˝ubben a Hérón-képlet segítségével számolhatjuk ki. Ez alapján p T = s(s − a)(s − b)(s − c) ahol s a háromszög félkerülete. Írjuk meg a programot, mely ezt a számítást elvégzi. 1 2
s=(a+b+c)/2; %Félkerület kiszámítása terulet=(s*(s−a)*(s−b)*(s−c))^(0.5); %Hérón−képlet alkalmazása
A teljes program az alábbi:
47 1 2 3 4 5 6 7
8 9 10 11 12 13
function[terulet]=hszogter(a,b,c) %A program inputjai a, b és c if nargin~=3 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 3, jelezzük return %Majd lépjünk ki a programból. elseif logical(a
11. Feladat
Írjunk egy olyan programot, mely egy pozitív egész szám megadását követ˝oen egy olyan vektort ad eredményül, mely az adott szám prímtényez˝oit tartalmazza! Megoldás
Az input esetében mindenképp ellen˝oriznünk kell, hogy az egy egynél nagyobb pozitív egész-e. Amennyiben ez teljesül, indulhat a program. Ha nem, akkor megfelel˝o hibaüzenet mellett lépjünk ki. 1 2 3 4 5 6 7 8 9 10 11
function[primvektor]=primtenyezo(n) %A program inputja n, outputja primvektor if nargin~=1 disp('Nem megfelel˝ o a változók száma.') return elseif logical(n>1)*(mod(n,1)+1)~=1 disp('A program csak egynél nagyobb pozitív egészekkel m˝ uködik!') return else %IDE JÖN A PROGRAM end end
A programot úgy írjuk meg, hogy egy változóban eltároljuk n értékét, majd elkezdjük leosztani nála kisebb számokkal, egészen addig, amíg az osztási maradék 0 nem lesz. Ha az osztási maradék 0, akkor n és az adott szám hányadosa megadja az egyik prímtényez˝ot. Ezt követ˝oen addig ismételjük az egész folyamatot, amíg ez a bizonyos osztó szám 1 nem lesz. Ha már csak 1-gyel osztható, megtaláltuk az utolsó prímtényez˝ot is. Mivel a megoldásokat egy vektorban szeretnénk eltárolni, definiálunk egy változót ( j), amely azt mutatja meg, hogy a vektornak hányadik elemét tároljuk el éppen. 1 2 3 4 5
6 7 8 9 10 11 12 13
x=n; %x változóba eltároljuk a megadott számot i=x−1; %Kezd˝ o értéket adunk az osztó számnak j=1; %Els˝ oként a vektor els˝ o elemét adjuk majd meg while i>=1 %A program addig fut, amíg az osztószám legalább egy while mod(x,i)~=0 %Addig ismételjük i csökkentését, amíg az osztási ... maradék nem 0 i=i−1; end megoldas(j)=x/i; %A prímtényez˝ o kiszámítása x=i; %Új kiindulóérték x−nek i=i−1; %Új kiindulóérték i−nek j=j+1; %Új vektorelemet számolunk end primvektor=megoldas; %Az ourput a megoldas vektor
A teljes program az alábbi:
48 1 2 3 4 5 6 7 8 9 10 11 12 13
14 15 16 17 18 19 20 21 22 23
function[primvektor]=primtenyezo(n) %A program inputja n, outputja primvektor if nargin~=1 disp('Nem megfelel˝ o a változók száma.') return elseif logical(n>1)*(mod(n,1)+1)~=1 disp('A program csak egynél nagyobb pozitív egészekkel m˝ uködik!') return else x=n; %x változóba eltároljuk a megadott számot i=x−1; %Kezd˝ o értéket adunk az osztó számnak j=1; %Els˝ oként a vektor els˝ o elemét adjuk majd meg while i>=1 %A program addig fut, amíg az osztószám legalább egy while mod(x,i)~=0 %Addig ismételjük i csökkentését, amíg az osztási ... maradék nem 0 i=i−1; end megoldas(j)=x/i; %A prímtényez˝ o kiszámítása x=i; %Új kiindulóérték x−nek i=i−1; %Új kiindulóérték i−nek j=j+1; %Új vektorelemet számolunk end primvektor=megoldas; %Az ourput a megoldas vektor end end
12. Feladat
Írjunk egy olyan programot, mely egy vektorból kiszámítja a vektor elemeinek számtani, mértani, harmonikus vagy négyzetes átlagát a felhasználó választása szerint! Megoldás
A programnak két paramétere lesz, egy vektor, valamint egy változó, mely megadja, hogy melyik típusú átlagot szeretnénk számolni. Ellen˝orizzük, hogy két változó van-e, valamint azt, hogy típusként az 1-2-3-4 számok valamelyike van-e megadva. Ezen kívül (mivel a programnak mind a négy átlagot tudnia kell számolni) ellen˝oriznünk kell azt is, hogy minden szám pozitív-e, ugyanis 0 esetén a harmonikus, míg negatív számok esetén a mértani közép nem számolható megfelel˝oen. 1
2 3 4 5 6 7 8 9 10 11 12 13
function[atlag]=atlagolo(vektor,tipus) %A függvény outputja az atlag, inputja ... egy vektor és az átlag típusa if nargin~=2 %Ellen˝ orizzük az inputok számát disp('Nem megfelel˝ o inputok. Két input megadása szükséges') return elseif logical(sum(logical(vektor>0))==length(vektor))... *(logical(tipus==1)+logical(tipus==2)+logical(tipus==3)... +logical(tipus==4))~=1 %Ellen˝ orizzük, hogy pozitív számok vannak−e disp('A program csak pozitív számokkal m˝ uködik!') return else %IDE JÖN A PROGRAM end end
A program m˝uködése során 1 kódolja a számtani, 2 a mértani, 3 a harmonikus és 4 a négyzetes közepet. Amennyiben minden rendben az inputokkal, a programot egy egyszer˝u switch-csel készíthetjük el.
49 1 2 3 4 5 6 7 8 9 10
switch tipus case 1 atlag=sum(vektor)/length(vektor); case 2 atlag=prod(vektor)^(1/length(vektor)); case 3 atlag=length(vektor)/sum(1./vektor); case 4 atlag=sqrt(sum(vektor.^2)/length(vektor)); end
A teljes program az alábbi: 1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
function[atlag]=atlagolo(vektor,tipus) %A függvény outputja az atlag, inputja ... egy vektor és az átlag típusa if nargin~=2 %Ellen˝ orizzük az inputok számát disp('Nem megfelel˝ o inputok. Két input megadása szükséges') return elseif logical(sum(logical(vektor>0))==length(vektor))... *(logical(tipus==1)+logical(tipus==2)+logical(tipus==3)... +logical(tipus==4))~=1 %Ellen˝ orizzük, hogy pozitív számok vannak−e disp('A program csak pozitív számokkal m˝ uködik!') return else switch tipus case 1 atlag=sum(vektor)/length(vektor); case 2 atlag=prod(vektor)^(1/length(vektor)); case 3 atlag=length(vektor)/sum(1./vektor); case 4 atlag=sqrt(sum(vektor.^2)/length(vektor)); end end end
6 — 2D és 3D ábrázolások
1. Feladat
Rajzoljuk ki a
ln(x) x
függvényt 0, 1 és 5 között!
Megoldás
El˝oször zárjuk be a nyitott ablakokat, töröljük a változókat és a Command Window tartalmát. Definiáljuk x értékeit. Ügyeljünk rá, hogy megfelel˝oen kis léptékközt határozzunk meg, így ábránk pontosabb lesz. 1 2 3 4
close all; %Nyitott ablakok bezárása clear all; %Korábbi változók törlése clc; %Command window törlése x=[0.1:0.05:5]; %x értékeinek definiálása
Ezt követ˝oen számítsuk ki a függvény értékeit. 1
fx=log(x)./x; %Függvényértékek kiszámítása
Rajzoljuk ki a függvényt, majd nevezzük el a tengelyeket, és adjunk hozzá jelmagyarázatot. 1 2 3 4
plot(x,fx) %A függvény kirajzolása xlabel('x'); ylabel('f(x)'); legend('Az ln(x)/x függvény')
A teljes kódsor a következ˝o: 1 2 3 4 5 6 7 8 9
close all; %Nyitott ablakok bezárása clear all; %Korábbi változók törlése clc; %Command window törlése x=[0.1:0.05:5]; %x értékeinek definiálása fx=log(x)./x; %Függvényértékek kiszámítása plot(x,fx) %A függvény kirajzolása xlabel('x'); ylabel('f(x)'); legend('Az ln(x)/x függvény')
51 A MATLAB az alábbi ábrát készíti: 5 Az ln(x)/x függvény 0
f(x)
−5
−10
−15
−20
−25 0
0.5
1
1.5
2
2.5 x
3
Ábra 6.1: A MATLAB által kirajzolt
3.5 ln(x) x
4
4.5
5
függvény
2. Feladat
Rajzoljuk ki a négy alapvet˝o szögfüggvényt egy ábrára, eltér˝o színekkel, −5 és 5 között. A szinusz és koszinusz függvényeket folytonos vonallal, míg a tangens és kotangens függvényeket pontokkal ábrázoljuk! Megoldás
Els˝o lépésként definiáljuk x vektort, mely a vizsgált értelmezési tartományt tartalmazza. 1 2 3 4
close all %Összes ablak bezárása clear all %Korábban deklarált változók törlése clc %Command window tartalmának törlése x=[−5:0.01:5];
Els˝o lépésként egy 2 × 2-es osztott ábra els˝o negyedébe kirajzoljuk a szinusz függvényt. Ezt a MATLAB alapértelmezés szerint kék színnel fogja elkészíteni. Ügyeljünk arra, hogy a tengelyeknek legyen megnevezése, valamint az ábránk is legyen elnevezve. 1 2 3 4 5
subplot(2,2,1); %2x2−es osztott ábra els˝ o eleme plot(x,sin(x)); %szinusz függvény kirajzolása xlabel('x'); %x tengely elnevezése ylabel('sin(x)'); %y tengely elnevezése title('A sin(x) függvény'); %Ábra címe
Következ˝o lépésként a második negyedben kirajzoljuk a koszinusz függvényt piros színnel. A piros színt egy vektor segítségével adjuk meg, melyben 0 és 1 közötti értékek szerepelnek, rendre a vörös, kék és zöld mértékét megadva. Itt is ügyeljünk az elnevezésekre!
52 1 2 3 4 5
subplot(2,2,2); %2x2−es osztott ábra második eleme plot(x,cos(x),'color',[1 0 0]); %koszinusz függvény kirajzolása piros színnel xlabel('x'); %x tengely elnevezése ylabel('cos(x)'); %y tengely elnevezése title('A cos(x) függvény'); %Ábra címe
Harmadik lépésként elkészítjük a tangens függvényt is. Itt egyrészt a plot parancs kiadásakor ügyelni kell arra, hogy pontokkal szeretnénk ábrázolni. Másrészt a felvett értékeket le kell korlátozni, hogy ábránk szemléletes legyen. 1 2 3 4 5 6
subplot(2,2,3); %2x2−es osztott ábra harmadik eleme plot(x,tan(x),'o','color',[0 1 0]); %szinusz függvény kirajzolása zöld színnel xlabel('x'); %x tengely elnevezése ylabel('tan(x)'); %y tengely elnevezése ylim([−10 10]); %Ábrázolt értékkészlet lekorlátozása title('A tan(x) függvény'); %Ábra címe
Végül ugyanilyen logika alapján elkészítjük kotangens függvényünket is. 1 2
3 4 5 6
subplot(2,2,4); %2x2−es osztott ábra negyedik eleme plot(x,cot(x),'o','color',[0 0.5 0.5]); %szinusz függvény kirajzolása ... zöldeskék színnel xlabel('x'); %x tengely elnevezése ylabel('cot(x)'); %y tengely elnevezése ylim([−10 10]); %Ábrázolt értékkészlet lekorlátozása title('A cot(x) függvény'); %Ábra címe
A teljes kódsor a következ˝o: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
23 24 25 26
close all %Összes ablak bezárása clear all %Korábban deklarált változók törlése clc %Command window tartalmának törlése x=[−5:0.01:5]; %Értelmezési tartomány definiálása subplot(2,2,1); %2x2−es osztott ábra els˝ o eleme plot(x,sin(x)); %szinusz függvény kirajzolása xlabel('x'); %x tengely elnevezése ylabel('sin(x)'); %y tengely elnevezése title('A sin(x) függvény'); %Ábra címe subplot(2,2,2); %2x2−es osztott ábra második eleme plot(x,cos(x),'color',[1 0 0]); %koszinusz függvény kirajzolása piros színnel xlabel('x'); %x tengely elnevezése ylabel('cos(x)'); %y tengely elnevezése title('A cos(x) függvény'); %Ábra címe subplot(2,2,3); %2x2−es osztott ábra harmadik eleme plot(x,tan(x),'o','color',[0 1 0]); %szinusz függvény kirajzolása zöld színnel xlabel('x'); %x tengely elnevezése ylabel('tan(x)'); %y tengely elnevezése ylim([−10 10]); %Ábrázolt értékkészlet lekorlátozása title('A tan(x) függvény'); %Ábra címe subplot(2,2,4); %2x2−es osztott ábra negyedik eleme plot(x,cot(x),'o','color',[0 0.5 0.5]); %szinusz függvény kirajzolása ... zöldeskék színnel xlabel('x'); %x tengely elnevezése ylabel('cot(x)'); %y tengely elnevezése ylim([−10 10]); %Ábrázolt értékkészlet lekorlátozása title('A cot(x) függvény'); %Ábra címe
53 A MATLAB az alábbi ábrát készíti: A cos(x) függvény 1
0.5
0.5 cos(x)
sin(x)
A sin(x) függvény 1
0 −0.5
−0.5
0 x A tan(x) függvény
−1 −5
5
10
10
5
5 cot(x)
tan(x)
−1 −5
0
0 −5 −10 −5
0 x A cot(x) függvény
5
0 x
5
0 −5
0 x
5
−10 −5
Ábra 6.2: A MATLAB által kirajzolt szögfüggvények
3. Feladat
Írjunk egy olyan függvényt, melynek három inputváltozója egy háromszög három oldala, a program pedig kirajzolja a háromszöget úgy, hogy annak a oldala az x tengelyen helyezkedjen el, az origóból kiindulva. Megoldás
Els˝o lépésként ellen˝orizzük, hogy a felhasználó valóban megadta-e mindhárom inputot, valamint azt, hogy azok lehetnek-e egy háromszög oldalai. 1 2 3 4 5 6 7
8 9 10 11 12
function abcplot(a,b,c) %A program inputjai a, b és c if nargin~=3 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 3, jelezzük return %Majd lépjünk ki a programból. elseif logical(a0)... *logical(b>0)*logical(c>0)~=1 %Lehetnek−e egy háromszög oldalai? disp('A megadott oldalhosszok nem tartozhatnak egy háromszöghöz') %Ha ... nem, jelezzük return else %Ha nincs hiba, indulhat a program %IDE JÖN A PROGRAM end end
A háromszöget három csúcsával tudjuk definiálni. Mivel az a oldal az x tengelyen fekszik, így két pontot biztos ismerünk. Az egyik az origó, a másik pont x koordinátája éppen a oldal hossza, y koordinátája pedig 0. A harmadik csúcsot könnyedén kiszámíthatjuk. Amennyiben a harmadik csúcs x koordinátáját x, y koordinátáját y jelöli, úgy a háromszög a oldalhoz tartozó magasságvonalát behúzva az alábbi
54 összefüggésekhez jutunk (a kialakult derékszög˝u háromszögek alapján): x2 + y2 = b2 2
2
2
(a − x) + y = c
(1) (2)
Az egyenletek megoldásával megkapjuk a keresett koordinátákat. Az egyenletek rendezését követ˝oen az alábbiak adódnak: a2 + b2 − c2 p 2a y = b2 − x 2
x=
Ez alapján már a program is ki tudja számítani a harmadik x és y koordinátákat. 1 2
harmadikx=(a^2+b^2−c^2)/2/a; %Számítsuk ki a harmadik csúcs x koordinátáját harmadiky=(b^2−harmadikx^2)^(0.5);%Számítsuk ki az y koordinátát is
Következ˝o lépésként definiáljuk az x koordinátákat valamint az y koordinátákat tartalmazó vektort. Ügyeljünk arra, hogy az origó szerepeljen 4. elemként is, mivel csak így lesz zárt a háromszögünk. 1 2
x=[0 a harmadikx 0] %Definiáljuk az x koordináták vektorát y=[0 0 harmadiky 0] %Definiáljuk az y koordináták vektorát
Következ˝o lépésként rajzoltassuk ki az ábrát, valamint adjunk neki címet. A címadásnál használjuk fel a változók értékeit, azokat a num2str paranccsal változtassuk string típusúvá. 1 2
plot(x,y) %Készítsük el az ábrát title(['Az a=' num2str(a) ', b=' num2str(b), ', c=' num2str(c) ' oldalú ... háromszög']) %Adjunk címet az ábrának
Végül az arányos, szemléletes ábra készítése érdekében állítsunk be egyenl˝o lépték˝u tengelyeket. 1
axis equal %Egyenl˝ o beosztású tengelyek
A teljes programkód az alábbi: 1 2 3 4 5 6 7
8 9 10 11 12 13 14 15
16 17 18
function abcplot(a,b,c) %A program inputjai a, b és c if nargin~=3 %Ellen˝ orizzük a bemen˝ o változók számát disp('A megadott változók száma nem megfelel˝ o') %Ha nem 3, jelezzük return %Majd lépjünk ki a programból. elseif logical(a0)... *logical(b>0)*logical(c>0)~=1 %Lehetnek−e egy háromszög oldalai? disp('A megadott oldalhosszok nem tartozhatnak egy háromszöghöz') %Ha ... nem, jelezzük return else %Ha nincs hiba, indulhat a program harmadikx=(a^2+b^2−c^2)/2/a; %Számítsuk ki a harmadik csúcs x koordinátáját harmadiky=(b^2−harmadikx^2)^(0.5);%Számítsuk ki az y koordinátát is x=[0 a harmadikx 0] %Definiáljuk az x koordináták vektorát y=[0 0 harmadiky 0] %Definiáljuk az y koordináták vektorát plot(x,y) %Készítsük el az ábrát title(['Az a=' num2str(a) ', b=' num2str(b), ', c=' num2str(c) ' oldalú ... háromszög']) %Adjunk címet az ábrának axis equal %Egyenl˝ o beosztású tengelyek end end
55 Egy, a program által készített 10, 5 illetve 6 egység oldalhosszúságú háromszög ábrája az alábbi: Az a=10, b=6, c=5 oldalú háromszög 5 4 3 2 1 0 −1 −2
0
1
2
3
4
5
6
7
8
9
10
Ábra 6.3: A MATLAB által kirajzolt háromszög
4. Feladat
Készítsünk egy függvényt, melynek inputváltozója egy olyan vektor, mely különböz˝o lejáratú kamatszelvény nélküli államkötvények árfolyamát tartalmazza. Készítsünk ez alapján hozamgörbét! Megoldás
Els˝o lépésben készítsük el a függvény keretét. Az egyetlen input egy vektor, mely az árfolyamokat tartalmazza. 1 2
function hozamgorbe(arfolyam) end
A hozamokat kiszámíthatjuk, amennyiben a névértéket (100%) leosztjuk a jelenlegi árfolyammal, majd az id˝oszak számának megfelel˝o gyököt vonunk, s végül az egészb˝ol kivonunk egyet. r 1 t r= −1 PV
1
hozam=((1./arfolyam).^(1./[1:length(arfolyam)])−1); %A hozamokat tartalmazó ... vektor kiszámítása
Ezt ki is rajzoltathatjuk. Az ábránkon a pontokat körrel jelöljük, és azokat zöld szaggatott vonallal kötjük össze. 1
plot([1:length(arfolyam)],hozam,'−−go'); %A hozamgörbe kirajzolása
56 Végül elnevezzük magát az ábrát, illetve a tengelyeket is. 1 2 3
title('Hozamgörbe'); %Az ábra címe xlabel('Lejárat'); %Az x tengely felirata ylabel('Éves hozam'); %Az y tengely felirata
A teljes program ennek megfelel˝oen a következ˝o: 1 2
3 4 5 6 7
function hozamgorbe(arfolyam) hozam=((1./arfolyam).^(1./[1:length(arfolyam)])−1); %A hozamokat tartalmazó ... vektor kiszámítása plot([1:length(arfolyam)],hozam,'−−go'); %A hozamgörbe kirajzolása title('Hozamgörbe'); %Az ábra címe xlabel('Lejárat'); %Az x tengely felirata ylabel('Éves hozam'); %Az y tengely felirata end
Amennyiben az egyéves diszkontkincstárjegyek árfolyama 97%, a kétéveseké 93%, a hároméveseké 88%, a négyéveseké 82% míg az ötéveseké 75%, az alábbi normális hozamgörbéhez jutunk: Hozamgörbe 0.06
0.055
Éves hozam
0.05
0.045
0.04
0.035
0.03
1
1.5
2
2.5
3 Lejárat
3.5
4
Ábra 6.4: A MATLAB által kirajzolt hozamgörbe
5. Feladat
Rajzoltassunk ki egy megadott középpontú és kerület˝u kört!
4.5
5
57 Megoldás
Els˝o lépésként definiáljuk magát a függvényt, illetve számítsuk ki a kör kerületéb˝ol annak sugarát! 1 2 3
function korplot(x,y,ker) r=ker/2/pi; %Számítsuk ki a kör sugarát end
Ezt követ˝oen számítsuk ki egy origó középpontú kör pontjait, melyet a kés˝obbiekben majd eltolunk. Használjuk a linspace utasítást, és a pontok számát tegyük függ˝ové a sugártól, így mindig megfelel˝o mennyiség˝u pontunk lesz egy korrekt min˝oség˝u ábrához. 1
2 3
xvektor=linspace(−r,r,r*100); %Definiáljuk egy origó középpontú kör é... rtelmezési tartományát yvektor1=(r^2−xvektor.^2).^(0.5); %Számítsuk ki a kör pozitív felének pontjait yvektor2=−yvektor1; %Számítsuk ki a negatív pontokat
Toljuk el az x illetve y értékeket a megadott középpontnak megfelel˝oen! 1 2
3
plothozx=xvektor+x; %Toljuk el xvektort a megadott középpontnak megfelel˝ oen plothozy1=yvektor1+y; %Toljuk el a kör pozitív oldalát a megadott ... középpontnak megfelel˝ oen plothozy2=yvektor2+y; %Toljuk el a kör negatív oldalát a megadott ... középpontnak megfelel˝ oen
Rajzoltassuk ki a kört! Ügyeljünk arra, hogy a MATLAB alapbeállítás szerint különböz˝o színnel rajzolná a kör alsó és fels˝o részét, így állítsuk be annak színét egységesen zöldre. 1
plot(plothozx,plothozy1,'g−',plothozx,plothozy2,'g−'); %Rajzoltassuk ki a ... kört zöld színnel
Végül állítsunk be azonos tengelybeosztást, valamint adjunk címet az ábránknak. 1 2
axis equal %Állítsunk be azonos tengelybeosztást title(['Az x=' num2str(x) ' és y=' num2str(y) ' középpontú, ' num2str(ker) ' ... kerület˝ u kör']) %Adjunk címet az ábrának
A teljes program az alábbi: 1 2 3
4 5 6 7
8
9
10 11
12
function korplot(x,y,ker) r=ker/2/pi; %Számítsuk ki a kör sugarát xvektor=linspace(−r,r,r*100); %Definiáljuk egy origó középpontú kör é... rtelmezési tartományát yvektor1=(r^2−xvektor.^2).^(0.5); %Számítsuk ki a kör pozitív felének pontjait yvektor2=−yvektor1; %Számítsuk ki a negatív pontokat plothozx=xvektor+x; %Toljuk el xvektort a megadott középpontnak megfelel˝ oen plothozy1=yvektor1+y; %Toljuk el a kör pozitív oldalát a megadott ... középpontnak megfelel˝ oen plothozy2=yvektor2+y; %Toljuk el a kör negatív oldalát a megadott ... középpontnak megfelel˝ oen plot(plothozx,plothozy1,'g−',plothozx,plothozy2,'g−'); %Rajzoltassuk ki a ... kört zöld színnel axis equal %Állítsunk be azonos tengelybeosztást title(['Az x=' num2str(x) ' és y=' num2str(y) ' középpontú, ' num2str(ker) ' ... kerület˝ u kör']) %Adjunk címet az ábrának end
58 Egy x=100 y=200 középpontú 10 kerület˝u kört kirajzoltatva az alábbi ábrát kapjuk: Az x=100 és y=200 középpontú, 10 kerületû kör 201.5
201
200.5
200
199.5
199
198.5 98
98.5
99
99.5
100
100.5
101
101.5
102
Ábra 6.5: A MATLAB által kirajzolt kör
6. Feladat
Mérjük le, hogy mennyi id˝o a MATLAB számára kiszámítani az els˝o 2n szám összegét n függvényében, majd rajzoltassuk is ki! Megoldás
Els˝o lépésként készítsünk egy ciklust, mely 1 és 30 között definiálja n értékeit. Ennél nagyobb értéket nem célszer˝u megadni, mert nagyon megnöveli a számítási id˝ot. A számítógép kapacitásától függ˝oen már 30-ig kiszámítani is igencsak id˝oigényes lehet, így annak függvényében módosítsuk ezt az értéket. A cikluson belül indítsuk el az id˝o mérését, majd definiáljuk magát az összeget, ami kezdetben nulla. Az összeadást egy újabb ciklus segítségével végezzük el. Az összeadás végeztével az eltelt id˝ot egy vektor megfelel˝o elemeként tároljuk el. 1 2 3 4 5 6 7 8 9 10 11
close all %Összes ablak bezárása clear all %Korábban deklarált változók törlése clc %Command window tartalmának törlése for n=1:30 %n értéke 1 és 30 között változzon tic %Id˝ omérés indítása szum=0; %Kezdetben az összeg 0 for i=1:(2^n) %Összeadás 1 és 2^n között szum=szum+i; %Összeadás elvégzése end %Ciklus lezárása ido(n)=toc %Az eltelt id˝ o eltárolása egy vektor elemeként end %Ciklus lezárása
Ezt követ˝oen rajzoltassuk ki a számítási id˝ot. Mivel az x tengely beosztása egységnyi, így elég az y értékeket megadnunk a plot parancson belül. Nevezzük el a tengelyeket, valamint adjunk címet az
59 ábrának! 1 2 3 4
plot(ido) %A számítási id˝ ot tartalmazó vektor kirajzoltatása xlabel('n') %x tengely elnevezése ylabel('t (másodperc)') %y tengely elnevezése title('Számítási id˝ o') %Ábra címe
A teljes program az alábbi: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
close all %Összes ablak bezárása clear all %Korábban deklarált változók törlése clc %Command window tartalmának törlése for n=1:30 %n értéke 1 és 30 között változzon tic %Id˝ omérés indítása szum=0; %Kezdetben az összeg 0 for i=1:(2^n) %Összeadás 1 és 2^n között szum=szum+i; %Összeadás elvégzése end %Ciklus lezárása ido(n)=toc %Az eltelt id˝ o eltárolása egy vektor elemeként end %Ciklus lezárása plot(ido) %A számítási id˝ ot tartalmazó vektor kirajzoltatása xlabel('n') %x tengely elnevezése ylabel('t (másodperc)') %y tengely elnevezése title('Számítási id˝ o') %Ábra címe
A MATLAB a következ˝o ábrát készíti: Számítási idõ 7
6
t (másodperc)
5
4
3
2
1
0 0
5
10
15 n
20
25
Ábra 6.6: A MATLAB számítási idejének ábrázolása
30
60 7. Feladat
n
2 Mutassuk be ábrán, hogy a ∑ (−1)i · 1,1 i sor Leibnitz-típusú, konvergens. i=1
Megoldás
Számítsuk ki a sor összegét megfelel˝oen nagy n értékig. Az összegeket kirajzoltatva látszik majd, hogy a sor összege egy meghatározott értékhez konvergál. Els˝o lépésként definiáljunk egy változót, mely az összegeket el fogja tárolni. 1 2 3 4
close all %Összes ablak bezárása clear all %Korábban deklarált változók törlése clc %Command window tartalmának törlése szum=0; %Kezdeti összeg definiálása
Következ˝o lépésként számítsuk ki a sor összegét az els˝o 100 n-re, és ezeket az összegeket tároljuk el egy vektorban. 1 2
3 4
for i=1:100 %Az els˝ o 100 értéket számítjuk ki szum=szum+(−1)^(i)*2/1.1^(i); %Az összeg az el˝ oz˝ o összeg, plusz a sor ... következ˝ o eleme abra(i)=szum; %Egy vektorban eltároljuk az aktuális összeget end %Lezárjuk a ciklust
Végül de nem utolsó sorban rajzoltassuk ki az ábrát, adjunk neki címet, valamint nevezzük el a tengelyeket. Az ábra címét LATEX kóddal készítsük el! 1 2
3
plot(abra) %Kirajzoltatjuk az összeget title('$\sum\limits_{i=1}^{n} (−1)^{i} \cdot ... \frac{2}{1,1^{i}}$','interpreter','latex') %Címet adunk az ábrának xlabel('n') %Elnevezzük x tengelyt
A teljes kódsor a következ˝o: 1 2 3 4 5 6
7 8 9 10
11
close all %Összes ablak bezárása clear all %Korábban deklarált változók törlése clc %Command window tartalmának törlése szum=0; %Kezdeti összeg definiálása for i=1:100 %Az els˝ o 100 értéket számítjuk ki szum=szum+(−1)^(i)*2/1.1^(i); %Az összeg az el˝ oz˝ o összeg, plusz a sor ... következ˝ o eleme abra(i)=szum; %Egy vektorban eltároljuk az aktuális összeget end %Lezárjuk a ciklust plot(abra) %Kirajzoltatjuk az összeget title('$\sum\limits_{i=1}^{n} (−1)^{i} \cdot ... \frac{2}{1,1^{i}}$','interpreter','latex') %Címet adunk az ábrának xlabel('n') %Elnevezzük x tengelyt
A MATLAB által készített ábrából látható, hogy a sor összege tényleg konvergens. 8. Feladat
Rajzoltassuk ki a sin(y) · ln(x) függvényt! Megoldás
Els˝o lépésként definiáljuk x és y értékeit. A minta megoldásban x 0,1 és 20 között mozog, a lényeg, hogy a logaritmusfüggvény miatt csak nullánál nagyobb értékeknek megadásának van értelme. Ugyancsak szabadon megválaszthatjuk y értékeit, példánkban -8 és 8 közötti értékeket vizsgálunk.
61 n P
(−1)i ·
i=1
2 1,1 i
0 −0.2 −0.4 −0.6 −0.8 −1 −1.2 −1.4 −1.6 −1.8 −2 0
10
20
30
40
50 n
60
70
80
90
100
Ábra 6.7: A sor összege különböz˝o n értékek mellett
1 2 3 4 5
close all %Összes ablak bezárása clear all %Korábban deklarált változók törlése clc %Command window tartalmának törlése x=[0.1:0.2:20]; %x értékeinek megadása y=[−8:0.2:8]; %y értékeinek megadása
Következ˝o lépésként megfelel˝o mátrixm˝uvelettel minden x − y kombináció mellett kiszámítjuk a függvény értékét! 1
f=sin(y')*log(x); %Függvényértékek kiszámítása
Ezt követ˝oen kirajzoltatjuk magát a függvényt, amely így egy felszín lesz. 1
surf(x,y,f); %Felszín kirajzoltatása
Végül elnevezzük a tengelyeket és az ábrát. 1 2 3 4
xlabel('x'); %x tengely elnevezése ylabel('y'); %y tengely elnevezése zlabel('log(x)*sin(y)'); %z tengely elnevezése title('A log(x)*sin(y) függvény') %Az ábra címe
62 A teljes kódsor a következ˝o: 1 2 3 4 5 6 7 8 9 10 11
close all %Összes ablak bezárása clear all %Korábban deklarált változók törlése clc %Command window tartalmának törlése x=[0.1:0.2:20]; %x értékeinek megadása y=[−8:0.2:8]; %y értékeinek megadása f=sin(y')*log(x); %Függvényértékek kiszámítása surf(x,y,f); %Felszín kirajzoltatása xlabel('x'); %x tengely elnevezése ylabel('y'); %y tengely elnevezése zlabel('log(x)*sin(y)'); %z tengely elnevezése title('A log(x)*sin(y) függvény') %Az ábra címe
A MATLAB által készített ábra: A log(x)*sin(y) függvény
3
log(x)*sin(y)
2 1 0 −1 −2 −3 10 5
20 15
0
10
−5 y
5 −10
0
x
Ábra 6.8: A sin(y) · ln(x) függvény
9. Feladat
Szimbolikus változók felhasználásával rajzoltassuk ki a −x · y · e−x Megoldás
Els˝o lépésként definiáljuk a két szimbolikus változónkat! 1 2 3 4 5
close all %Minden nyitott ablak bezárása clear all %Korábban definiált változók törlése clc %Command Window tartalmának törlése syms x %x szimbolikus változó definiálása syms y %y szimbolikus változó definiálása
2 −y2
függvényt!
63 Ezt követ˝oen készítsük el a szimbolikus függvényünket. 1
f=−x*y*exp(−x^2−y^2) %a függvény definiálása
Rajzoltassuk ki a függvényt, majd nevezzük el a tengelyeket és adjunk címet az ábrának. 1 2 3 4 5
ezsurf(f) %a függvény kirajzoltatása xlabel('x') %x tengely elnevezése ylabel('y') %y tengely elnevezése zlabel('z') %z tengely elnevezése title('$z=−x \cdot y \cdot e^{−x^2−y^2}$','interpreter','latex') %Az ábra címe
A teljes kódsor az alábbi: 1 2 3 4 5 6 7 8 9 10 11
close all %Minden nyitott ablak bezárása clear all %Korábban definiált változók törlése clc %Command Window tartalmának törlése syms x %x szimbolikus változó definiálása syms y %y szimbolikus változó definiálása f=−x*y*exp(−x^2−y^2) %a függvény definiálása ezsurf(f) %a függvény kirajzoltatása xlabel('x') %x tengely elnevezése ylabel('y') %y tengely elnevezése zlabel('z') %z tengely elnevezése title('$z=−x \cdot y \cdot e^{−x^2−y^2}$','interpreter','latex') %Az ábra címe
A MATLAB által készített ábra: 2
2
z = −x · y · e−x −y
0.2
z
0.1
0
−0.1
−0.2 2 2
0
0 −2
−2
y
Ábra 6.9: A −x · y · e−x
x 2 −y2
függvény
64 10. Feladat
Írjunk egy programot, mely megadott munkaer˝oállomány, α érték, amortizációs ráta és megtakarítási határhajlandóság mellett kirajzolja egy népességnövekedés és technológiai haladás nélküli Solow-modell parciális termelési függvényét, az amortizálódó t˝okejavak szintjét, a beruházások értékét, valamint az egyensúlyi pontot. Megoldás
Els˝o lépésként definiáljuk a függvény keretét, valamint számítsuk ki az egyensúlyi t˝okeállományt. Mivel a gazdaság akkor van egyensúlyban, amikor az amortizálódó t˝okejavak szintje megegyezik a beruházások nagyságával, az egyensúlyi t˝okeállományt az alábbi módon számíthatjuk ki: s ·Y = δ · K α 1−α
s·K L = δ ·K r 1−α 1−α s · L =K δ
1 2
3
function solowplot(L,alpha,delta,s) egyensuly=(s*L^(1−alpha)/delta)^(1/(1−alpha)); %Egyensúlyi t˝ okeállomány ... kiszámítása end
Következ˝o lépésként definiáljuk a t˝okeállományt (x tengely) tartalmazó vektort. Ahhoz, hogy az egyensúlyi pont is szemléletes legyen, maximum értékként az egyensúlyi érték többszörösét (példánkban 1,2-szeresét) válasszuk! Ezt követ˝oen számítsuk ki a t˝okeállomány adott szintjei mellett a kibocsátást, a beruházásokat illetve az amortizálódó t˝okejavak szintjét! 1 2 3 4
K=[0:0.1:egyensuly*1.2]; %K vektor definiálása Y=K.^alpha*L^(1−alpha); %A parciális termelési függvény értékei I=s*Y; %A beruházások értékei amort=delta*K; %Az amortizálódó t˝ okejavak szintje
Készítsük el az ábránkat. Az egyensúlyi pontot cián árnyalatú kör jelölje! Az ábrához készítsünk jelmagyarázatot is. 1 2
plot(K,Y,K,I,K,amort,egyensuly,delta*egyensuly,'co'); %Az ábra elkészítése legend('Kibocsátás','Beruházás','Amortizálódó t˝ okejavak','Egyensúlyi pont'); ... %Jelmagyarázat készítése
Az egyensúlyi pontba húzzunk be egy vízszintes és egy függ˝oleges vonalat, ugyancsak cián árnyalattal. 1
2
line([0 egyensuly],[delta*egyensuly delta*egyensuly],'color',[0 1 1]); %Az ... egyensúlyi pontba vonal rajzolása line([egyensuly egyensuly],[0 delta*egyensuly],'color',[0 1 1]); %Az ... egyensúlyi pontba vonal rajzolása
Végül nevezzük el a tengelyeket és az ábrát! 1 2 3
xlabel('K') %x tengely elnevezése ylabel('Y, I, amortizáció') %y tengely elnevezése title('Solow modell és egyensúly') %Az ábra címe
A teljes program az alábbi:
65 1 2
3 4 5 6 7 8
9
10
11 12 13 14
function solowplot(L,alpha,delta,s) egyensuly=(s*L^(1−alpha)/delta)^(1/(1−alpha)); %Egyensúlyi t˝ okeállomány ... kiszámítása K=[0:0.1:egyensuly*1.2]; %K vektor definiálása Y=K.^alpha*L^(1−alpha); %A parciális termelési függvény értékei I=s*Y; %A beruházások értékei amort=delta*K; %Az amortizálódó t˝ okejavak szintje plot(K,Y,K,I,K,amort,egyensuly,delta*egyensuly,'co'); %Az ábra elkészítése legend('Kibocsátás','Beruházás','Amortizálódó t˝ okejavak','Egyensúlyi pont'); ... %Jelmagyarázat készítése line([0 egyensuly],[delta*egyensuly delta*egyensuly],'color',[0 1 1]); %Az ... egyensúlyi pontba vonal rajzolása line([egyensuly egyensuly],[0 delta*egyensuly],'color',[0 1 1]); %Az ... egyensúlyi pontba vonal rajzolása xlabel('K') %x tengely elnevezése ylabel('Y, I, amortizáció') %y tengely elnevezése title('Solow modell és egyensúly') %Az ábra címe end
Hívjuk meg a következ˝o paranccsal: 1
solowplot(100,0.3,0.1,0.2)
A MATLAB az alábbi ábrát készíti:
Solow modell és egyensúly 150 Kibocsátás Beruházás Amortizálódó tõkejavak Egyensúlyi pont
Y, I, amortizáció
100
50
0
0
50
100
150
200
250
300
350
K
Ábra 6.10: A megadott paraméterek melletti Solow-modell ábrája
11. Feladat
Írjunk egy olyan programot, mely az exogén változók adott értékei mellett kirajzolja az IS és az LM görbét, valamint jelöli azok egyensúlyi értékét!
66 Megoldás
Az IS görbe az alábbi módon írható fel általános alakban: Y = C0 + MPC(Y − T + Tr) + I0 − b · r + G Ezt r-re átrendezve az alábbi kifejezéshez jutunk: r=
C0 + MPC(−T + Tr) + I0 + G (1 − MPC)Y − b b
Az LM görbe általános alakja: M = αY − β r P Ezt r-re rendezve: r=
α M Y− β βP
Ezek ábrázolása során már csak arra kell figyelni, hogy az egyensúlyi pont mindenképpen szerepeljen az ábránkon. Ennek megfelel˝oen els˝o lépésben kiszámoljuk a feladat megoldását, majd ennek megfelel˝oen végezzük el az ábrázolást. Az egyensúlyi kibocsátás a fenti két egyenlet megoldásaként adódik: C0 + MPC(−T + Tr) + I0 + G (1 − MPC)Y α M − = Y− b b β βP C0 + MPC(−T + Tr) + I0 + G M α 1 − MPC + =Y · + b βP β b C0 +MPC(−T +Tr)+I0 +G b 1−MPC α b β +
+ βMP
=Y
Ha ezt visszahelyettesítjük az LM görbe átrendezett alakjába, megkapjuk az egyensúlyi kamatlábat: C0 +MPC(−T +Tr)+I0 +G M + α M b βP r= − α 1−MPC β β P b β + A program els˝o lépésben ellen˝orizze a bemen˝o változók számát, illetve azt, hogy MPC 0 és 1 közötti érték-e. Ha nem, megfelel˝o hibaüzenet mellett lépjen ki. 1 2 3 4 5 6 7 8 9 10 11
function[r Y]=islmplot(C0,MPC,T,TR,I0,alpha,beta,b,G,M,P) if nargin~=11 disp('Nem megfelel˝ o a megadott változók száma') return elseif logical(MPC<0)+logical(MPC>1)==1 disp('MPC értéke 0 és 1 közötti lehet!') return else %IDE JÖN A PROGRAM end end
A program els˝o lépésként számolja ki az egyensúlyi kamatlábat és kibocsátást! 1 2
Y=((C0+MPC*(−T+TR)+I0+G)/(b)+(M)/(beta*P))/(alpha/beta+(1−MPC)/b); r=alpha/beta*Y−M/beta/P;
Ezt követ˝oen készítsük el az ábránkat. Az ábrát úgy készítsük el, hogy azon látszódjon az egyensúlyi pont. Erre jó megoldást jelent, ha az egyensúlyi kibocsátás 1,2-szereséig számoljuk ki a függvények értékeit. Definiáljuk Y értékeit, valamint az IS és LM görbe r értékeit:
67 1 2 3
Yvektor=0:0.1:(Y*1.2); IS=(C0+MPC*(−T+TR)+I0+G)/(b)−(1−MPC)/b.*Yvektor; LM=alpha/beta.*Yvektor−M/beta/P;
Következ˝o lépésként rajzoltassuk ki ezen két görbét, illetve az egyensúlyi pontot. Az egyensúlyi pontot piros kör jelölje! Ügyeljünk arra, hogy az IS és LM görbéknek kizárólag a nem-negatív szakaszait rajzoltassuk ki. 1
plot(Yvektor(IS>0),IS(IS>0),Yvektor(LM>0),LM(LM>0),Y,r,'ro');
Rajzoljunk még be két piros vonalat, mely a tengelyeket az egyensúlyi ponttal kötik össze. Ehhez használjuk a hold funkciót. 1 2 3
hold on line([Y Y],[0 r],'color',[1 0 0]); line([0 Y],[r r],'color',[1 0 0]);
Készítsünk egy jelmagyarázatot, mely szemléletesen megmutatja az IS és az LM görbéket, valamint az egyensúlyi pontot. 1
legend('IS görbe','LM görbe','Egyensúlyi pont')
Nevezzük el a tengelyeket! 1 2
xlabel('Y'); ylabel('r');
Végezetül ne felejtsük el kikapcsolni a hold funkciót. 1
hold off
A teljes program az alábbi: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
function[r Y]=islmplot(C0,MPC,T,TR,I0,alpha,beta,b,G,M,P) if nargin~=11 disp('Nem megfelel˝ o a megadott változók száma') return elseif logical(MPC<0)+logical(MPC>1)==1 disp('MPC értéke 0 és 1 közötti lehet!') return else Y=((C0+MPC*(−T+TR)+I0+G)/(b)+(M)/(beta*P))/(alpha/beta+(1−MPC)/b); r=alpha/beta*Y−M/beta/P; Yvektor=0:0.1:(Y*1.2); IS=(C0+MPC*(−T+TR)+I0+G)/(b)−(1−MPC)/b.*Yvektor; LM=alpha/beta.*Yvektor−M/beta/P; plot(Yvektor(IS>0),IS(IS>0),Yvektor(LM>0),LM(LM>0),Y,r,'ro'); hold on line([Y Y],[0 r],'color',[1 0 0]); line([0 Y],[r r],'color',[1 0 0]); legend('IS görbe','LM görbe','Egyensúlyi pont'); xlabel('Y'); ylabel('r'); hold off end end
68 Gy˝oz˝odjünk is meg a program helyes m˝uködésér˝ol! Az általáunk vizsgált gazdaságban a fogyasztók mindenkori elkölthet˝o jövedelmük 80 százalékát kívánják fogyasztásra fordítani. Ez kiegészül 100 egységnyi autonóm fogyasztással is. A kormányzat tevékenységét jellemz˝o adatok: T = G = 500. A kormányzat a magánszektornak 750 egység transzfert nyújt. A beruházási függvény I = 1200 − 200r alakban írható fel. A gazdaságban a nominális pénzkínálat 19000 egység, az árszínvonal pedig 2 egység. A reálpénzkeresletet az L = 2Y − 100r függvény írja le. Ebben az esetben a függvényt helyesen az alábbi kóddal hívhatjuk meg: 1
[r Y]=islmplot(100,0.8,500,750,1200,2,100,200,500,19000,2)
A kamatlábra 5-nek, míg egyensúlyi kibocsátásként 5000-nek kell adódnia. A MATLAB által kirajzolt ábra az alábbi:
25 IS görbe LM görbe Egyensúlyi pont 20
r
15
10
5
0
0
1000
2000
3000 Y
4000
5000
6000
Ábra 6.11: Az IS és LM görbék, valamint az egyensúlyi pont
12. Feladat
Írjunk egy olyan programot, melynek inputja egy x-t˝ol függ˝u szimbolikus függvény. A program rajzolja ki magát a függvényt, illetve annak els˝o deriváltját. Megoldás
Els˝o lépésként hozzuk létre a függvény deriváltját, melyet jelöljön g. 1 2 3
function szimbplot(f) g=diff(f); end
Következ˝o lépésként rajzoljuk ki magát a függvényt.
69 1
ezplot(f);
A hold funkció bekapcsolását követ˝oen rajzoljuk ki a függvény deriváltját is. Ezt egy külön objektumként hozzuk létre, így a kés˝obbiekben be tudjuk majd állítani a színét is. 1 2
hold on h=ezplot(g);
Állítsuk át a derivált függvény színét zöldre, így elkülönül majd az eredeti függvényt˝ol (melyet a MATLAB alapbeállítás szerint kék színnel ábrázol). 1
set(h, 'Color', [0 1 0]);
Készítsük el a jelmagyarázatot. A jelmagyarázatban kiíratjuk magát az ábrázolt függvényt is. Ehhez a szimbolikus függvényeink tartalmát stringgé konvertáljuk, majd vektoriálisan adjuk meg a kiírandó szöveget. 1
legend([char(f) ' függvény'],[char(g) ' függvény']);
Nevezzük el az y tengelyt. Mivel a tengelyen függvényértékek láthatók, így célszer˝uen f (x) jelölést kap a tengely. 1
ylabel('f(x)');
Végül nevezzük el magát az ábrát, valamint kapcsoljuk ki a hold funkciót! 1 2
title('A megadott függvény és deriváltja'); hold off
A teljes program az alábbi: 1 2 3 4 5 6 7 8 9 10 11
function szimbplot(f) g=diff(f); ezplot(f); hold on h=ezplot(g); set(h, 'Color', [0 1 0]); legend([char(f) ' függvény'],[char(g) ' függvény']); ylabel('f(x)'); title('A megadott függvény és deriváltja'); hold off end
Próbáljuk is ki a programot az x2 + sin(x) függvénnyel. Ehhez az alábbi utasításokra van szükség: 1 2 3 4
clear all %Összes korábbi változó törlése syms x %x szimbolikus változó definiálása fv=x^2+sin(x) %A függvény definiálása szimbplot(fv) %A program indítása
A MATLAB az alábbi ábrát adja eredményül:
70
A megadott függvény és deriváltja 15
sin(x) + x2 függvény 2*x + cos(x) függvény
10
f(x)
5
0
−5
−10
−6
−4
−2
0 x
2
Ábra 6.12: Az x2 + sin(x) függvény és deriváltja
4
6
7 — Diszkrét dinamikus modellek
1. feladat Egy populáció a következ˝o növekedési folyamat szerint növekedik: nt+1 =
1.1 · nt 1 + nt
Kérjen be a felhasználótól egy 0 és 1 közé es˝o kezd˝o n értéket (Ezt a program ellen˝orizze!), majd rajzolja ki a populáció változását 100 id˝oszakon keresztül. A reláció megenged˝o minden esetben! Megoldás Els˝o lépésben meg kell oldanunk a változó kezd˝oértéknek, azaz az n1 skalárnak a bekérését: 1 2 3 4
clear all; % Meglevo deklaralt valtozok megszuntetese. close all; % Nyitott ablakok bezarasa. clc; % Kepernyo tartalmanak torlese. n(1)=input('Kerem, adjon meg egy indulo n erteket!') ; % Kezdoertek magadasa.
Második lépésben meg kell vizsgálni azt, hogy az érték ne legyen 0 alatti érték, és abban az esetben, ha ez nem teljesül új értéket kell bekérni. (Azaz nem szigorú relációt feltételezünk.) 1 2 3
while 0>n(1) %Logikai feltetel. n(1)=input('Kerem, adjon meg egy indulo n erteket!'); %Adat bekeres end %Ciklus lezarasa.
Harmadik lépésben meg kell vizsgálni azt, hogy az érték ne legyen 1 fölötti érték, és abban az esetben, ha ez nem teljesül új értéket kell bekérni. (Azaz nem szigorú relációt feltételezünk.) 1 2 3
while n(1)>1 %Logikai feltetel n(1)=input('Kerem, adjon meg egy indulo n erteket!'); %Adat bekeres end %Ciklus lezarasa
Ekkor megírhatóvá válik a ciklus magja, ahol a t indexelést használjuk: 1 2 3
for t=1:99 n(t+1)=((1.1*n(t))/(1+n(t))); % A konkret idosori folyamat end
72 Ekkor az id˝oindexet is létre lehet hozni, amely függvényében az állomány n értékei ábrázolhatóak lesznek. A vektor hossza 100 egység, és a természetes számokat tartalmazza 1 és 100 között: 1
t=[1:1:100]; % Az idovektor
Az id˝o függvényében ábrázolhatjuk a kapott n vektort: 1 2
plot(t,n); % A plot kiiratasa legend('Az allomany alakulasa') % A plot cimkeje
A teljes programkódunk ekkor így néz ki, minden egyes elemével együtt: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
clear all; % Meglevo deklaralt valtozok megszuntetese. close all; % Nyitott ablakok bezarasa. clc; % Kepernyo tartalmanak torlese. n(1)=input('Kerem, adjon meg egy indulo n erteket!') ; % Kezdoertek magadasa. while 0>n(1) %Logikai feltetel. n(1)=input('Kerem, adjon meg egy indulo n erteket!'); %Adat bekeres end %Ciklus lezarasa. while n(1)>1 %Logikai feltetel n(1)=input('Kerem, adjon meg egy indulo n erteket!'); %Adat bekeres end %Ciklus lezarasa for t=1:99 n(t+1)=((1.1*n(t))/(1+n(t))); % A konkret idosori folyamat end t=[1:1:100]; % Az idovektor plot(t,n); % A plot kiiratasa legend('Az allomany alakulasa') % A plot cimkeje
n értékei
0.3
0.2
0.1 0
10
20
30
40
50 60 Az id˝ovektor
70
80
Ábra 7.1: Az 1. feladatban megadott folyamat alakulása n = 0.33 mellett
90
100
73 2. feladat Egy populáció a következ˝o növekedési folyamat szerint növekedik: nt+1 = nt · e0.1·(1−nt ) Kérjen be a felhasználótól egy 0 és 1 közé es˝o kezd˝o n értéket (Ezt a program ellen˝orizze!), majd rajzolja ki a populáció változását 100 id˝oszakon keresztül. A reláció megenged˝o minden esetben! Megoldás Els˝o lépésben meg kell oldanunk a változó kezd˝oértéknek, azaz az n1 skalárnak a bekérését: 1 2 3 4
clear all; % Meglevo deklaralt valtozok megszuntetese. close all; % Nyitott ablakok bezarasa. clc; % Kepernyo tartalmanak torlese. n(1)=input('Kerem, adjon meg egy indulo n erteket!') ; % Kezdoertek magadasa.
Második lépésben meg kell vizsgálni azt, hogy az érték ne legyen 0 alatti érték, és abban az esetben, ha ez nem teljesül új értéket kell bekérni. (Azaz nem szigorú relációt feltételezünk.) 1 2 3
while 0>n(1) %Logikai feltetel. n(1)=input('Kerem, adjon meg egy indulo n erteket!'); %Adat bekeres end %Ciklus lezarasa.
Harmadik lépésben meg kell vizsgálni azt, hogy az érték ne legyen 1 fölötti érték, és abban az esetben, ha ez nem teljesül új értéket kell bekérni. (Azaz nem szigorú relációt feltételezünk.) 1 2 3
while n(1)>1 %Logikai feltetel n(1)=input('Kerem, adjon meg egy indulo n erteket!'); %Adat bekeres end %Ciklus lezarasa
Ekkor megírhatóvá válik a ciklus magja, ahol a t indexelést használjuk: 1 2 3
for t=1:99 n(t+1)=n(t)*exp(0.1*(1−n(t))); % A konkret idosori folyamat end
Ekkor az id˝oindexet is létre lehet hozni, amely függvényében az állomány n értékei ábrázolhatóak lesznek. A vektor hossza 100 egység, és a természetes számokat tartalmazza 1 és 100 között: 1
t=[1:1:100]; % Az idovektor
Az id˝o függvényében ábrázolhatjuk a kapott n vektort: 1 2
plot(t,n); % A plot kiiratasa legend('Az allomany alakulasa') % A plot cimkeje
A teljes programkódunk ekkor így néz ki, minden egyes elemével együtt: 1 2 3 4 5 6 7
clear all; % Meglevo deklaralt valtozok megszuntetese. close all; % Nyitott ablakok bezarasa. clc; % Kepernyo tartalmanak torlese. n(1)=input('Kerem, adjon meg egy indulo n erteket!') ; % Kezdoertek magadasa. while 0>n(1) %Logikai feltetel. n(1)=input('Kerem, adjon meg egy indulo n erteket!'); %Adat bekeres end %Ciklus lezarasa.
74 1 2 3 4 5 6 7 8 9
while n(1)>1 %Logikai feltetel n(1)=input('Kerem, adjon meg egy indulo n erteket!'); %Adat bekeres end %Ciklus lezarasa for t=1:99 n(t+1)=n(t)*exp(0.1*(1−n(t)));% A konkret idosori folyamat end t=[1:1:100]; % Az idovektor plot(t,n); % A plot kiiratasa legend('Az allomany alakulasa') % A plot cimkeje
n értékei
1
0.8
0.6
0
10
20
30
40
50 60 Az id˝ovektor
70
80
90
100
Ábra 7.2: A 2. feladatban megadott folyamat alakulása n = 0.45 mellett 3. feladat Egy populáció a következ˝o növekedési folyamat szerint növekedik: nt+1 = 4 · nt · (1 − nt ) Kérjen be a felhasználótól egy 0 és 1 közé es˝o kezd˝o n értéket (Ezt a program ellen˝orizze!), majd rajzolja ki a populáció változását 100 id˝oszakon keresztül. A reláció megenged˝o minden esetben! Megoldás Els˝o lépésben meg kell oldanunk a változó kezd˝oértéknek, azaz az n1 skalárnak a bekérését: 1 2 3 4
clear all; % Meglevo deklaralt valtozok megszuntetese. close all; % Nyitott ablakok bezarasa. clc; % Kepernyo tartalmanak torlese. n(1)=input('Kerem, adjon meg egy indulo n erteket!') ; % Kezdoertek magadasa.
Második lépésben meg kell vizsgálni azt, hogy az érték ne legyen 0 alatti érték, és abban az esetben, ha ez nem teljesül új értéket kell bekérni. (Azaz nem szigorú relációt feltételezünk.) 1 2 3
while 0>n(1) %Logikai feltetel. n(1)=input('Kerem, adjon meg egy indulo n erteket!'); %Adat bekeres end %Ciklus lezarasa.
Harmadik lépésben meg kell vizsgálni azt, hogy az érték ne legyen 1 fölötti érték, és abban az esetben, ha ez nem teljesül új értéket kell bekérni. (Azaz nem szigorú relációt feltételezünk.) 1 2 3
while n(1)>1 %Logikai feltetel n(1)=input('Kerem, adjon meg egy indulo n erteket!'); %Adat bekeres end %Ciklus lezarasa
75 Ekkor megírhatóvá válik a ciklus magja, ahol a t indexelést használjuk: 1 2 3
for t=1:99 n(t+1)=4*n(t)*(1−n(t)); % A konkret idosori folyamat end
Ekkor az id˝oindexet is létre lehet hozni, amely függvényében az állomány n értékei ábrázolhatóak lesznek. A vektor hossza 100 egység, és a természetes számokat tartalmazza 1 és 100 között: 1
t=[1:1:100]; % Az idovektor
Az id˝o függvényében ábrázolhatjuk a kapott n vektort: 1 2
plot(t,n); % A plot kiiratasa legend('Az allomany alakulasa') % A plot cimkeje
A teljes programkódunk ekkor így néz ki, minden egyes elemével együtt: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
clear all; % Meglevo deklaralt valtozok megszuntetese. close all; % Nyitott ablakok bezarasa. clc; % Kepernyo tartalmanak torlese. n(1)=input('Kerem, adjon meg egy indulo n erteket!') ; % Kezdoertek magadasa. while 0>n(1) %Logikai feltetel. n(1)=input('Kerem, adjon meg egy indulo n erteket!'); %Adat bekeres end %Ciklus lezarasa. while n(1)>1 %Logikai feltetel n(1)=input('Kerem, adjon meg egy indulo n erteket!'); %Adat bekeres end %Ciklus lezarasa for t=1:99 n(t+1)=4*n(t)*(1−n(t)); % A konkret idosori folyamat end t=[1:1:100]; % Az idovektor plot(t,n); % A plot kiiratasa legend('Az allomany alakulasa') % A plot cimkeje
n értékei
1
0.5
0 0
10
20
30
40
50 60 Az id˝ovektor
70
80
Ábra 7.3: A 3. feladatban megadott folyamat alakulása n = 0.78 mellett
90
100
76 4. feladat Adott egy kötvény, amelyért a kibocsátáskor 200 dollárt kell fizetni, a kötvény az els˝o 10 évben 12 százalékos kupont fizet. A kés˝obbiekben a 11. és 20. évben évi 14 százalékos kupont fizet. A kötvény az utolsó évbeny egyben törleszti a t˝okét. A diszkontáláshoz használt kamatláb nagysága 11 százalék. Mekkora lenne a kötvény jelenértéke (PV ) a kibocsátáskor? Mekkora a kötvény nettó jelenértéke (NPV ) kibocsátáskor? Mekkora a kötvény jelenértéke a 12. év elején? Megoldás A megoldáshoz mindenképpen fel kell írni a kötvény pénzáramlásait az évekre (Ct ), amelyek így fognak adódni sorban: ha t = 1, . . . , 10 Ct = 24 Pénzáramlások Ct = 28 ha t = 11, . . . , 19 Ct = 200 + 28 ha t = 20 A pénzáramlások ismeretében meghatározható a kötvény jelenértéke már, els˝o lépésben definiáljuk a diszkont kamatlábat: 1
r=0.11 ;% A megadott kamatlab
A következ˝o lépésben megadjuk azt, hogy milyen áramlások várhatóak majd: 1 2 3
C(1:10)=24;% Az elso 10 idoszakra az aramlas C(11:19)=28;% A 11. es 19. idoszak kozotti aramlasok C(20)=228;% A 20. idoszaki aramlas
A különböz˝o áramlások diszkontált értékei így adódnak: PVt =
Ct (1 + r)t
A diszkontált áramlások számolását egy f or ciklus is el tudja végezni az alábbi módon: 1 2 3
for t=1:20 % Ciklus kezdete PV(t)=C(t)/(1+r)^t; % Ciklus magja end %Ciklus lezarasa
A teljes kötvény jelenértéke így adódik: 20
PV = ∑ PVt = 409.4271 $ t=1
Ez így adódik egyszer˝uen: 1
Jelenertek=sum(PV) % A jelenertek reszletek osszegzese
A nettó jelenérték így adódik: NPV = PV −C0 = 209.4271 $
1
NPV=Jelenertek−200 % A netto jelenertek
77 A teljes program ekkor: 1 2 3 4 5 6 7 8 9
r=0.11 ;% A megadott kamatlab C(1:10)=24;% Az elso 10 idoszakra az aramlas C(11:19)=28;% A 11. és 19. idoszak kozotti aramlasok C(20)=228;% A 20. idoszaki aramlas for t=1:20 % Ciklus kezdete PV(t)=C(t)/(1+r)^t; % Ciklus magja end %Ciklus lezarasa Jelenertek=sum(PV) % A jelenertek reszletek osszegzese NPV=Jelenertek−200 % A netto jelenertek
A 12. id˝oszak elején így adódnak a hátralév˝o pénzáramlások: ( Ct = 28 ha t = 12, . . . , 19 Pénzáramlások Ct = 200 + 28 ha t = 20 A pénzáramlások ismeretében meghatározható a kötvény jelenértéke már, els˝o lépésben definiáljuk a diszkont kamatlábat: 1
r=0.11 ;% A megadott kamatlab
A következ˝o lépésben megadjuk azt, hogy milyen áramlások várhatóak majd: 1 2
C(1:8)=28;% A 12. és 19. idoszak kozotti aramlasok C(9)=228;% A 20. idoszaki aramlas
A különböz˝o áramlások diszkontált értékei így adódnak: PVt =
Ct (1 + r)t
A diszkontált áramlások számolását egy f or ciklus is el tudja végezni az alábbi módon, a ciklusban a diszkontálás azonban az új id˝oszemlélet szerint adódik már: 1 2 3
for t=1:9 % Ciklus kezdete PV(t)=C(t)/(1+r)^t; % Ciklus magja end %Ciklus lezarasa
A teljes kötvény jelenértéke így adódik: 9
PV = ∑ PVt = 233.2223 $ t=1
Ez így adódik egyszer˝uen: 1
Jelenertek=sum(PV) % A jelenertek reszletek osszegzese
A nettó jelenérték így adódik: NPV = PV −C0 = 33.2223 $
1
NPV=Jelenertek−200 % A netto jelenertek
78 5. feladat Adott egy kötvény, amelyért a kibocsátáskor 1000 dollárt kell fizetni, a kötvény az els˝o 5 évben 15 százalékos kupont fizet. A kés˝obbiekben a 6. és 30. évben évi 10 százalékos kupont fizet. A 31. és 40. év között 8 százalékos kupont fizet a 39. és 40. évben fele-fel arányban törlesztik a t˝okét. A diszkontáláshoz használt kamatláb nagysága 9 százalék. Mekkora lenne a kötvény jelenértéke (PV ) a kibocsátáskor? Mekkora a kötvény nettó jelenértéke (NPV ) kibocsátáskor? Megoldás A megoldáshoz mindenképpen fel kell írni a kötvény pénzáramlásait az évekre (Ct ), amelyek így fognak adódni sorban: Ct = 150 ha t = 1, . . . , 5 ha t = 6, . . . , 30 Ct = 100 Pénzáramlások Ct = 80 ha t = 31, . . . , 38 Ct = 500 + 80 ha t = 39 Ct = 500 + 40 ha t = 40 A pénzáramlások ismeretében meghatározható a kötvény jelenértéke már, els˝o lépésben definiáljuk a diszkont kamatlábat: 1
r=0.09 ;% A megadott kamatlab
A következ˝o lépésben megadjuk azt, hogy milyen áramlások várhatóak majd: 1 2 3 4 5
C(1:5)=150;% Az elso 5 idoszakra az aramlas C(6:30)=100;% A 6. és 30. idoszak kozotti aramlasok C(31:38)=80;% A 31. és 38. idoszak kozotti aramlasok C(39)=580; % Aramlas a 39. idoszakra C(40)=540;% Aramlas a 40. idoszakra
A különböz˝o áramlások diszkontált értékei így adódnak: PVt =
Ct (1 + r)t
A diszkontált áramlások számolását egy for ciklus is el tudja végezni az alábbi módon: 1 2 3
for t=1:40 % Ciklus kezdete PV(t)=(C(t))/(1+r)^t; % Ciklus magja end %Ciklus lezarasa
A teljes kötvény jelenértéke így adódik: 40
PV = ∑ PVt = 1292.5412$ t=1
Ez így adódik egyszer˝uen: 1
Jelenertek=sum(PV) % A jelenertek reszletek osszegzese
A nettó jelenérték így adódik: NPV = PV −C0 = 292.5412$
1
NPV=Jelenertek−1000 % A netto jelenertek
79 6. feladat Egy reprezentatív, az életpálya hasznosságát maximalizáló fogyasztó optimális döntését vizsgáljuk. A fogyasztó célfüggvénye: ∞
U = ∑ β t−1 · lnCt t=1
A gazdasági szerepl˝o minden id˝oszakban Yt = 78.9833 jövedelmet realizál, és megtakarításait egy vagyonkezel˝onél 1 + rt+1 = 1.03 kamatláb mellett helyezheti el, de ugyanezen kamatláb mellett hiteleket is felvehet. A β paraméter értéke 0.99. Mekkora lesz a fogyasztó 1. id˝oszaki fogyasztásának nagysága ezen feltételek mellett? Ábrázolja a fogyasztás nagyságát az els˝o 100 id˝oszakra, emellett ábrázolja a jövedelmet szintén az els˝o 100 id˝oszakra! Megoldás Els˝o lépésben a jövedelem jelenértékére van szükségünk, amely ebben az esetben így adódik: ∞
Yt t−1 t=1 (1 + r)
PV (Y ) = ∑
A sor összegét egy végtelen összegét egy mértani sor összegeként is felírhatnánk, azonban ett˝ol most eltekintünk. El˝oször deklaráljuk az exogén változókat (ebben az esetben a kamatlábat és a jövedelmet): 1 2 3 4 5
clear all; close all; clc; r=0.03; % Kamatlab megadasa Y=78.9833; %Exogen jovedelem megadasa
Mivel nem sort összegzünk, ezért választunk egy rendkívül magas id˝oindexet, ahol a jelenérték részletek nagysága már elhanyagolható lesz. Esetünkben ez a t index a t = 10000 lesz. Ekkor a jövedelemfolyam diszkontált értéke így adódik: 1 2 3
for i=1:10000 PV(i)=Y/(1+r)^(i−1); %Jovedelem jelenertek reszletek end
Az így kapott részletek összegezhet˝oek: 1
PVY=sum(PV); % A teljes jovedelemfolyam jelenerteke
Azaz azt kaptuk, hogy: PV (Y ) = 2711.7599 Az adott id˝oszaki fogyasztás meghatározható az alábbi módon: Ct = PV (Y ) · (1 − β ) · β t−1 · (1 + r)t−1 Mindez természetesen ciklusba rendezhet˝o abban az esetben, hogyha a türelmetlenségi paramétert, és a jövedelemfolyam jelenértékét meghatároztuk: 1 2
beta=0.99; % Turelmetlensegi parameter r=0.03; % Kamatláb deklaralasa
80 Ekkor a ciklus az els˝o 100 id˝oszakra megírható már: 1 2 3
for t=1:100 C(t)=PVY*(1−beta)*beta^(t−1)*(1+r)^(t−1); % Fogyasztas erteke end
Ekkor adódik, hogy: C1 = 27.1176. Az ábrázoláshoz szükségünk van egy 100 hosszúságú sorvektorra, amely tartalmazza, az exogén jövedelemfolyam értékeit, illetve egy 100 hosszúságú sorvektorra, amely függvényében a fogyasztás és jövedelem ábrázolható. 1 2
Y(1:100)=78.9833; % Jovedelem vektor t=[1:100]; % Ido vektor
Ekkor az ábra elkészíthet˝o: 1 2
plot(t,Y,t,C); % A plot kiiratasa legend('A fogyasztas alakulasa') % A plot cimkeje
A teljes programkódunk: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
C és Y értékei
18
clear all; close all; clc; r=0.03; % Kamatlab megadasa Y=78.9833; %Exogen jovedelem megadasa beta=0.99; % Turelmetlensegi parameter for i=1:10000 PV(i)=Y/(1+r)^(i−1); %Jovedelem jelenertek reszletek end PVY=sum(PV); for t=1:100 C(t)=PVY*(1−beta)*beta^(t−1)*(1+r)^(t−1); % Fogyasztas erteke end Y(1:100)=78.9833; % Jovedelem vektor t=[1:100]; % Ido vektor plot(t,Y,t,C); % A plot kiiratasa legend('A jovedelemfolyam') % A plot cimkeje legend('A fogyasztas alakulasa') % A plot cimkeje
150
100
50 0
10
20
30
40
50 60 Az id˝ovektor
70
80
Ábra 7.4: A fogyasztás (piros) és jövedelem (kék) alakulása
90
100
81 7. feladat Egy reprezentatív, az életpálya hasznosságát maximalizáló fogyasztó optimális döntését vizsgáljuk. A fogyasztó célfüggvénye: ∞
U = ∑ β t−1 · lnCt t=1
A gazdasági szerepl˝o minden id˝oszakban Yt = 55.43 jövedelmet realizál, és megtakarításait egy vagyonkezel˝onél 1 + rt+1 = 1.03 kamatláb mellett helyezheti el, de ugyanezen kamatláb mellett hiteleket is felvehet. A β paraméter értéke 0.96. Mekkora lesz a fogyasztó 7. id˝oszaki fogyasztásának nagysága ezen feltételek mellett? Ábrázolja a fogyasztás nagyságát az els˝o 100 id˝oszakra, emellett ábrázolja a jövedelmet szintén az els˝o 100 id˝oszakra! Megoldás Els˝o lépésben a jövedelem jelenértékére van szükségünk, amely ebben az esetben így adódik: ∞
Yt t−1 t=1 (1 + r)
PV (Y ) = ∑
A sor összegét egy végtelen összegét egy mértani sor összegeként is felírhatnánk, azonban ett˝ol most eltekintünk. El˝oször deklaráljuk az exogén változókat (ebben az esetben a kamatlábat és a jövedelmet): 1 2 3 4 5
clear all; close all; clc; r=0.02; % Kamatlab megadasa Y=55.43; %Exogen jovedelem megadasa
Mivel nem sort összegzünk, ezért választunk egy rendkívül magas id˝oindexet, ahol a jelenérték részletek nagysága már elhanyagolható lesz. Esetünkben ez a t index a t = 10000 lesz. Ekkor a jövedelemfolyam diszkontált értéke így adódik: 1 2 3
for i=1:10000 PV(i)=Y/(1+r)^(i−1); %Jovedelem jelenertek reszletek end
Az így kapott részletek összegezhet˝oek: 1
PVY=sum(PV); % A teljes jovedelemfolyam jelenerteke
Azaz azt kaptuk, hogy: PV (Y ) = 2826.9299 Az adott id˝oszaki fogyasztás meghatározható az alábbi módon: Ct = PV (Y ) · (1 − β ) · β t−1 · (1 + r)t−1 Mindez természetesen ciklusba rendezhet˝o abban az esetben, hogyha a türelmetlenségi paramétert, és a jövedelemfolyam jelenértékét meghatároztuk: 1 2
beta=0.96; % Turelmetlensegi parameter r=0.02; % Kamatláb deklaralasa
82 Ekkor a ciklus az els˝o 100 id˝oszakra megírható már: 1 2 3
for t=1:100 C(t)=PVY*(1−beta)*beta^(t−1)*(1+r)^(t−1); % Fogyasztas erteke end
Ekkor adódik az is, hogy C7 = 99.6789. Az ábrázoláshoz szükségünk van egy 100 hosszúságú sorvektorra, amely tartalmazza, az exogén jövedelemfolyam értékeit, illetve egy 100 hosszúságú sorvektorra, amely függvényében a fogyasztás és jövedelem ábrázolható. 1 2
Y(1:100)=55.43; % Jovedelem vektor t=[1:100]; % Ido vektor
Ekkor az ábra elkészíthet˝o: 1 2
plot(t,Y,t,C); % A plot kiiratasa legend('A fogyasztas alakulasa') % A plot cimkeje
A teljes programkódunk: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
clear all; close all; clc; r=0.02; % Kamatlab megadasa Y=55.43; %Exogen jovedelem megadasa beta=0.96; % Turelmetlensegi parameter for i=1:10000 PV(i)=Y/(1+r)^(i−1); %Jovedelem jelenertek reszletek end PVY=sum(PV); for t=1:100 C(t)=PVY*(1−beta)*beta^(t−1)*(1+r)^(t−1); % Fogyasztas erteke end Y(1:100)=55.43; % Jovedelem vektor t=[1:100]; % Ido vektor plot(t,Y,t,C); % A plot kiiratasa legend('A jovedelemfolyam') % A plot cimkeje legend('A fogyasztas alakulasa') % A plot cimkeje
C és Y értékei
100
50
0
10
20
30
40
50 60 Az id˝ovektor
70
80
Ábra 7.5: A fogyasztás (piros) és jövedelem (kék) alakulása
90
100
83 8. feladat Egy reprezentatív, az életpálya hasznosságát maximalizáló fogyasztó optimális döntését vizsgáljuk. A fogyasztó célfüggvénye: ∞
U = ∑ β t−1 · lnCt t=1
A β paraméter értéke β = 0.99. A fogyasztó minden id˝oszakban exogén jövedelemben részesül, amelynek értéke : ( 10, ha t = 1, . . . , 10 Yt = 5, ha t = 11, . . . , ∞ További lehet˝osége van minden periódusban arra, hogy egy el˝ore meghatározott 1 + r = β1 kamat mellett egy vagyonkezel˝ot˝ol hitelt vegyen fel, illetve a vagyonkezel˝onél betétet helyezzen el. A fogyasztó kezdeti vagyonállománya nulla. Mekkora lesz a fogyasztó fogyasztása a 4873. periódusban? Megoldás Els˝o lépésben deklaráljuk az exogén változókat és a paramétereket: 1 2 3 4
beta=0.99; % A turelmetlensegi parameter r=1−1/beta; % A kamatlab Y(1:10)=10; % Az elso 10 idoszak jovedelme Y(11:10000)=5; %A kesobbi jovedelem
Tudjuk, hogy a teljes jövedelem folyam jelenértéke így adódik: ∞
Yt (1 + r)t−1 t=1
PV (Y ) = ∑
Ezt azonban egy f or ciklus segítségével már ki tudjuk számolni: 1 2 3
for i=1:10000 PV(i)=Y(i)/(1+r)^(i−1); %Jovedelem jelenertek reszletek end
Az így kapott részletek összegezhet˝oek: 1
PVY=sum(PV); % A teljes jovedelemfolyam jelenerteke
Az adott id˝oszaki fogyasztás meghatározható az alábbi módon: Ct = PV (Y ) · (1 − β ) · β t−1 · (1 + r)t−1 t−1 1 t−1 Ct = PV (Y ) · (1 − β ) · β · β Ct = PV (Y ) · (1 − β ) Azaz a fogyasztás kisimul. Ekkor a fogyasztás értéke: 1
C=PVY*(1−beta); % A teljes jovedelemfolyam jelenerteke
C4873 = 28.2693
84 9. feladat Egy reprezentatív, az életpálya hasznosságát maximalizáló fogyasztó optimális döntését vizsgáljuk. A fogyasztó célfüggvénye: ∞
U = ∑ β t−1 · lnCt t=1
A β paraméter értéke β = 0.92. A fogyasztó minden id˝oszakban exogén jövedelemben részesül, amelynek értéke : 187, ha t = 1, . . . , 10 Yt = 401, ha t = 11, . . . , 40 294, ha t = 41, . . . , ∞ További lehet˝osége van minden periódusban arra, hogy egy el˝ore meghatározott 1 + r = β1 kamat mellett egy vagyonkezel˝ot˝ol hitelt vegyen fel, illetve a vagyonkezel˝onél betétet helyezzen el. 1. A fogyasztó kezdeti vagyonállománya nulla. Mekkora lesz a fogyasztó fogyasztása a 16. periódusban? 2. Mekkora lesz a fogyasztó megtakarítása, vagy mennyi hitelt vesz fel a fogyasztó a 10. periódusban? 3. A gazdaságot pozitív jövedelmi hatás éri a 30. periódusban, így a fogyasztó jövedelme életének 30. és 40. periódusa között nem 401, hanem 421 lesz. A fogyasztó a gazdasági eseményr˝ol a 25. periódus legelején szerez tudomást. Mekkora lesz a fogyasztása a 30. periódusban? Megoldás, 1. rész Els˝o lépésben deklaráljuk az exogén jövedelem folyam értékét, a kamatlábat és a türelmetlenségi paramétert: 1 2 3 4 5 6
clear all; Y(1:1:10)=187; % Elso 10 idoszak exogen jovedelme Y(11:1:40)=401; % A 11. − 40. idoszak exogen jovedelme Y(41:1:10000)=294; % 41. idoszak utani exogen jovedelmek beta=0.92; % A turelmetlensegi parameter r=(1/beta)−1; % A kamatlab
A jövedelem jelenértéke így adódik: ∞
Yt t−1 t=1 (1 + r)
PV (Y ) = ∑
A jövedelem jelenértéke az alábbi MATLAB kóddal közelíthet˝o: 1 2 3 4
for i=1:1:10000 resz(i)=Y(i)/((1+r)^(i−1)); % A ciklus magja, amely jelenerteket szamol end PV=sum(resz); % A jelenertekek osszegzese
A MATLAB Output alapján a jövedelem jelenértéke: PV (Y ) = 3451.9 A speciális kamatláb1 miatt az alábbi fog állni minden esetben: 1 1 = β · (1 + rt+1 ) · Ct Ct+1 1 1 1 =β· · Ct β Ct+1 11 + r
=
1 β
85 1 1 = Ct Ct+1 Ct+1 = Ct Ekkor elegend˝o az els˝o id˝oszaki fogyasztást kiszámítani, és adódik a 16. id˝oszaki fogyasztás is: Ci = (1 − β ) · PV (Y ) Ez így kódolható le: 1
C=PV*(1−beta); % A konkret idosori folyamat
Ekkor az els˝o id˝oszaki fogyasztás: C1 = (1 − β ) · PV (Y ) C1 = (1 − 0.92) · 3451.9 C1 = 276.1494 A teljes programkód tehát: 1 2 3 4 5 6 7 8 9 10 11
clear all; Y(1:1:10)=187; % Elso 10 idoszak exogen jovedelme Y(11:1:40)=401; % A 11. − 40. idoszak exogen jovedelme Y(41:1:10000)=294; % 41. idoszak utani exogen jovedelmek beta=0.92; % A turelmetlensegi parameter r=(1/beta)−1; % A kamatlab for i=1:1:10000 resz(i)=Y(i)/((1+r)^(i−1)); % A ciklus magja, amely jelenerteket szamol end PV=sum(resz); % A jelenertekek osszegzese C=PV*(1−beta); % A fogyasztas erteke
Megoldás, 2. rész A fogyasztó költségvetési korlátja az els˝o id˝oszakban így fog kinézni: Y1 = C1 + B2 Ez így rendezhet˝o át, ha meg akarjuk kapni a kötvények, vagy hitelek értékét: Y1 −C1 = B2 A második id˝oszaki költségvetési korlát: Y2 + (1 + r2 ) · B2 = C2 + B3 Ez így rendezhet˝o át, ha meg akarjuk kapni a kötvények, vagy hitelek értékét: Y2 + (1 + r2 ) · B2 −C2 = B3 A kés˝obbi átrendezett korlátok már ezzel analóg módon adódnak: Y2 + (1 + r2 ) · B2 −C2 = B3 Y3 + (1 + r3 ) · B3 −C3 = B4 Y4 + (1 + r4 ) · B4 −C4 = B5 .. . Yt + (1 + rt ) · Bt −Ct = Bt+1 Az exogén jövedelem és endogén fogyasztás értékek ismerete alapján iteratív módon tehát meghatározható az egyes id˝oszaki kötvények vagy hitelek értéke egy for ciklussal. Feltételezve, hogy a korábban számolt értékeket nem töröltük.
86 Az els˝o 100 id˝oszakra a fogyasztást egy vektorba berendezzük: 1 2 3 4
c=(1−beta)*PV; % Elso idoszaki fogyasztas for i=1:1:100 C(i)=c; % Elso 100 idoszaki fogyasztas end
Meghatározzuk az els˝o id˝oszakban vásárolt kötvény mennyiséget: 1
B(1)=Y(1)−C(1); % Elso kotveny vagy hitel meghatarozasa
Majd meghatározzuk a maradék 99 id˝oszakra is: 1 2 3
for i=2:100; B(i)=Y(i)+B(i−1)*(1+r)−C(i); % Kovetkezo 99 idoszaki kotveny lekerdezes end
Ebben a modellben a B11 változó értéke a B vektor 10. eleme lesz: B11 = -1334.9 Azaz a fogyasztó hitelt vesz fel. Megoldás, 3. rész A fogyasztó költségvetési korlátja az új optimalizációs pálya els˝o id˝oszakban (25. id˝oszak) így fog kinézni: Y25 + (1 + r25 ) · B25 = C25 + B26 Az új els˝o id˝oszaki jövedelem, így értelmezhet˝o a megörökölt adósság állományból és az exogén jövedelemb˝ol áll: Y1∗ = Y25 + (1 + r25 ) · B25 1 Y1∗ = 401 + · (−1111.7) 0.92 Y1∗ = −807.3696 A további exogén jövedelmek a 25. id˝oszakból, mint új optimalizációs id˝oszakból nézve így foghatóak fel: 401 ha t = 2, . . . , 5 Yt = 421 ha t = 6, . . . , 16 294 ha t = 17, . . . , ∞ A speciális kamatláb2 miatt az alábbi fog állni minden esetben: 1 1 = β · (1 + r) · Ct Ct+1 1 1 1 =β· · Ct β Ct+1 1 1 = Ct Ct+1 Ct+1 = Ct 21 + r
=
1 β
87 Ekkor elegend˝o az els˝o id˝oszaki (25. id˝oszaki) fogyasztást kiszámítani, és adódik a 30. id˝oszaki fogyasztás is: C1 = (1 − β ) · PV (Y ) A jövedelem jelenértéke így adódik: ∞
Yt t−1 t=1 (1 + r)
PV (Y ) = ∑ Az örökölt hitel: 1 2 3
beta=0.92; % Turelmetlensegi paramtere megadasa r=(1/beta)−1; % Kamat megadasa orokolt=B(24) % Orokolt hitel
Az exogén jövedelem folyam: 1 2 3 4
Y(1)=orokolt*(1/beta)+401; %25. Jovedelem Y(2:5)=401; %26. 27. 28. 29. Exogen jov. Y(6:16)=421 % 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. Y(17:1:10000)=294; % Exogen jov.
Exogen jov.
A teljes jövedelem jelenértéke: 1 2 3 4
for i=1:1:10000 resz(i)=Y(i)/((1+r)^(i−1));% A ciklus magja, amely jelenerteket szamol end PV=sum(resz); % A jelenertekek osszegzese
A MATLAB Output alapján a jövedelem jelenértéke: PV (Y ) = 3550.8 Ekkor számára az új optimalizáció során az els˝o id˝oszaki fogyasztás, amely gyakorlatban a 25. id˝oszak: Ci = (1 − β ) · PV (Y ) Azaz adódik, hogy: 1
C=PV*(1−beta)
A 30. id˝oszaki fogyasztás értéke ekkor: Ci = 284.063133
88 10. feladat Adott egy els˝orend˝u autoregresszív AR(1) folyamat, amely stacioner, ráadásul az is ismert, hogy általános alakban így írható le: Yt = α + φ1 ·Yt−1 + ut , u ≈ W N(µ, σ ) A paraméterek rendre sorban így adódnak: α = 20
(A tengelymetszet)
φ1 = 0.5
(Az autoregresszív együttható)
µ =0
(A hiba várhatóértéke)
σ =4
(A hiba szórása)
Az Y érték az els˝o id˝oszakra így adódik: Y1 = 10. Készítsen programot, amely Y értékeit ábrázolja az els˝o 150 id˝oszakra. Megoldás Els˝o lépésben deklarálni kell a modell paramétereit, a zajt jellemz˝o paramétereket és a kezd˝o értéket:3 1 2 3 4 5 6 7 8
clear all close all clc alfa=20; % A tengelymetszet phi=0.5; %Az autoregresszív egyutthato mu=0; % A hiba varhatoerteke sigma=4; % A hiba szorasa Y(1)=10; % Az elso ertek a folyamathoz
A folyamatunk gyakorlatilag az alábbi autoregresszív folyamat: Yt+1 = 20 + 0.5 ·Yt + ut ,
ut ≈ W N(0, σ )
A kés˝obbi ábrán meg kell jelennie annak, hogy a folyamat várható értéke így adódik: E(Yt ) =
α 20 = = 40 1−φ 1 − 0.5
A folyamat a már korábban megadott értékek alapján egy for ciklus segítségével generálható: 1 2 3
for i=1:149 Y(i+1)=alfa+phi*Y(i)+normrnd(mu,sigma); % A folyamat megadasa end
A kész folyamat mellé egy megfelel˝o id˝ovektorra is szükségünk van, amely 150 egység hosszú: 1
t=[1:150]; % Az idovektor megadasa
Ekkor a folyamat ábrázolható már: 1 2
plot(t,Y) % Az idovektor megadasa legend('A folyamat ertekei) % A plot cimkeje
3 Az
α paraméter neve azért lett ez, mert a listings csomag unicode α jelet használt helyette.
89 A teljes programkód tehát: 1 2 3 4 5 6 7 8 9 10 11 12 13 14
clear all close all clc alfa=20; % A tengelymetszet phi=0.5; %Az autoregresszív egyutthato mu=0; % A hiba varhatoerteke sigma=4; % A hiba szorasa Y(1)=10; % Az elso ertek a folyamathoz for i=1:149 Y(i+1)=alfa+phi*Y(i)+normrnd(mu,sigma); % A folyamat megadasa end t=[1:150]; % Az idovektor megadasa plot(t,Y) % Az idovektor megadasa legend('A folyamat ertekei') % A plot cimkeje
Y értékei
40
20
0
10
20
30
40
50
60
70 80 90 Az id˝ovektor
100 110 120 130 140 150
Ábra 7.6: Az id˝osor alakulása t = 1, . . . , 150 között A várható érték tulajdonság, pedig az alábbi módon bizonyítható be: ∞
∑ Yt E(Y ) ≈
t=1
t
Ez ebben az esetben így kódolható le: 1 2 3
for i=1:100000 Y(i+1)=alfa+phi*Y(i)+normrnd(mu,sigma); % A folyamat megadasa end
A kell˝oen nagy mintára lehet már várhatóértéket számolni: 1
E=sum(Y)/length(Y); % A varhatoertek szamitasa
Azaz azt kaptuk, hogy a várhatóérték nagyjából: E(Y ) ≈ 40.004112 Azaz az elméleti várhatóértéket közelíti a szimulált is.
90 11. feladat Adott egy els˝o rend˝u autoregresszív AR(1) folyamat, amely nem stacioner, ráadásul az is ismert, hogy általános alakban így írható le: Yt = φ1 ·Yt−1 + ut ,
u ≈ W N(µ, σ )
A paraméterek rendre sorban így adódnak: φ1 = 1
(Az autoregresszív együttható)
µ =0
(A hiba várhatóértéke)
σ =4
(A hiba szórása)
Az Y érték az els˝o id˝oszakra így adódik: Y1 = 10. Készítsen programot, amely Y értékeit ábrázolja az els˝o 150 id˝oszakra. Megoldás Els˝o lépésben deklarálni kell a modell paramétereit, a zajt jellemz˝o paramétereket és a kezd˝o értéket:4 1 2 3 4
phi=1; %Az mu=0; % A sigma=4; % Y(1)=10; %
autoregresszív egyutthato hiba varhatoerteke A hiba szorasa Az elso ertek a folyamathoz
A folyamatunk gyakorlatilag az alábbi autoregresszív folyamat: Yt+1 = Yt + ut ,
ut ≈ W N(0, σ )
A folyamat tulajdonképpen egy RW dolyamat, és ennek megfelel˝o viselkedést fogunk t˝ole várni. A folyamat a már korábban megadott értékek alapján egy for ciklus segítségével generálható: 1 2 3
for i=1:149 Y(i+1)=phi*Y(i)+normrnd(mu,sigma); % A folyamat megadasa end
A kész folyamat mellé egy megfelel˝o id˝ovektorra is szükségünk van, amely 150 egység hosszú: 1
t=[1:150]; % Az idovektor megadasa
Ekkor a folyamat ábrázolható már:
2
plot(t,Y) % Az idovektor megadasa legend('A folyamat ertekei) % A plot cimkeje
80 Y értékei
1
60 40 20 0
10
20
30
40
50
60
70 80 90 Az id˝ovektor
100 110 120 130 140 150
Ábra 7.7: Az id˝osor alakulása t = 1, . . . , 150 között 4 Az
α paraméter neve azért lett ez, mert a listings csomag unicode α jelet használt helyette.
91 12. feladat Adott egy másodrend˝u autoregresszív AR(2) folyamat, amely stacioner, ráadásul az is ismert, hogy általános alakban így írható le: Yt = α + φ1 ·Yt−1 + φ2 ·Yt−2 + ut ,
u ≈ W N(µ, σ )
A paraméterek rendre sorban így adódnak: α = 20
(A tengelymetszet)
φ1 = 0.4
(Az 1. autoregresszív együttható)
φ2 = 0.2
(A 2. autoregresszív együttható)
µ =0
(A hiba várhatóértéke)
σ =2
(A hiba szórása)
Az Y érték az els˝o és második id˝oszakra így adódik: Y1 = 45, Y2 = 55. Készítsen programot, amely Y értékeit ábrázolja az els˝o 150 id˝oszakra. Megoldás Els˝o lépésben deklarálni kell a modell paramétereit, a zajt jellemz˝o paramétereket és a kezd˝o értéket:5 1 2 3 4 5 6 7 8 9 10
clear all close all clc alfa=20; % A tengelymetszet phi1=0.4; %Az autoregressziv egyutthato phi2=0.2; %Az autoregressziv egyutthato mu=0; % A hiba varhatoerteke sigma=4; % A hiba szorasa Y(1)=45; % Az elso ertek a folyamathoz Y(2)=55; % A masodik ertek a folyamathoz
A folyamatunk gyakorlatilag az alábbi autoregresszív folyamat: Yt+2 = 20 + 0.4 ·Yt+1 + 0.2 ·Yt + ut ,
ut ≈ W N(0, σ )
A kés˝obbi ábrán meg kell jelennie annak, hogy a folyamat várható értéke így adódik: E(Yt ) =
α 20 = = 50 1 − φ1 − φ2 1 − 0.4 − 0.2
A folyamat a már korábban megadott értékek alapján egy for ciklus segítségével generálható: 1 2 3
for i=1:148 Y(i+2)=alfa+phi1*Y(i+1)+phi2*Y(i)+normrnd(mu,sigma); % A folyamat megadasa end
A kész folyamat mellé egy megfelel˝o id˝ovektorra is szükségünk van, amely 150 egység hosszú: 1
t=[1:150]; % Az idovektor megadasa
Ekkor a folyamat ábrázolható már: 1 2
plot(t,Y) % Az idovektor megadasa legend('A folyamat ertekei) % A plot cimkeje 5 Az
α paraméter neve azért lett ez, mert a listings csomag unicode α jelet használt helyette.
92 A teljes programkód tehát: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Y értékei
16
clear all close all clc alfa=20; % A tengelymetszet phi1=0.4; %Az autoregressziv egyutthato phi2=0.2; %Az autoregressziv egyutthato mu=0; % A hiba varhatoerteke sigma=4; % A hiba szorasa Y(1)=45; % Az elso ertek a folyamathoz Y(2)=55; % A masodik ertek a folyamathoz for i=1:148 Y(i+2)=alfa+phi1*Y(i+1)+phi2*Y(i)+normrnd(mu,sigma); end t=[1:150]; % Az idovektor megadasa plot(t,Y) % Az idovektor megadasa legend('A folyamat ertekei') % A plot cimkeje
% A folyamat megadasa
50
40
0
10
20
30
40
50
60
70 80 90 Az id˝ovektor
100 110 120 130 140 150
Ábra 7.8: Az id˝osor alakulása t = 1, . . . , 150 között A várható érték tulajdonság, pedig az alábbi módon bizonyítható be: ∞
∑ Yt E(Y ) ≈
t=1
t
Ez ebben az esetben így kódolható le: 1 2 3
for i=1:100000 Y(i+2)=alfa+phi1*Y(i+1)+phi2*Y(i)+normrnd(mu,sigma);% A folyamat megadasa end
A kell˝oen nagy mintára lehet már várhatóértéket számolni: 1
E=sum(Y)/length(Y); % A varhatoertek szamitasa
Azaz azt kaptuk, hogy a várhatóérték nagyjából: E(Y ) ≈ 49.9949 Azaz az elméleti várhatóértéket közelíti a szimulált is.
93 13. feladat A Lotka-Volterra modellben a ragadozók, és a zsákmányállatok küzdelmét figyelhetjük meg. A rendszer egyenletei a következ˝ok: Zt+1 = 1.1 · Zt − 0.2 · Zt · Rt
(Z SÁKMÁNYÁLLATOK EGYENLETE)
Rt+1 = 0.9 · Rt + 0.3 · Zt · Rt
(R AGADOZÓK EGYENLETE)
Tudjuk, hogy az els˝o id˝oszakban a populációt 0.3 egység ragadozó és 1/3 egység zsákmányállat alkotja valamilyen mértékegységben kifejezve. 1. Ábrázoljuk az egyes populációk létszámának alakulását 200 id˝oszakon keresztül! 2. Ábrázoljuk az egy ragadozóra jutó zsákmányállattok számát 200 id˝oszakon keresztül! 3. Ábrázoljuk az egyes populációk létszámának növekedését 199 id˝oszakon keresztül! Megoldás, 1. rész A feladat szövege alapján megadhatunk egy kezdeti értéket a ragadozók és zsákmányállatok létszámának: Z1 = 1/3
(Z SÁKMÁNYÁLLATOK SZÁMA)
R1 = 0.3
(R AGADOZÓK SZÁMA)
Tudjuk, hogy az id˝oértékek maximum t = 200 id˝oszakig kellenek majd, mivel a kezdeti állomány értékeket deklaráljuk csak 199 id˝oszaki állományt kell létrehoznunk. 1 2 3 4 5
clear all; % Memoria nullazasa close all; %Minden ablak bezarasa clc; % A parancssor kiuritese r(1)=0.3; % Ragadozok szama z(1)=1/3; % Zsakmanyallatok szama
A már deklarált változók segítségével meghatározhatjuk a két populáció nagyságát, akár 200 id˝oszakon keresztül is egy for ciklus segítségével. 1 2 3 4
for t = 1:199 % Idoszakok szama csak 199 a kezdo skalar miatt z(t+1)=1.1.*z(t)−(0.2.*z(t).*r(t)); % Zsakmanyallatok szamitasa r(t+1)=0.9.*r(t)+0.3.*r(t).*z(t) ; % Ragadozok szamitasa end
Szükségünk van egy 200 hosszúságú vektorra, amely tartalmazza a természetes számokat sorban: 1
t=[1:200]; % Idoszakok
A kész vektorokat, amelyek a populációkat tartalmazzák már tudjuk ábrázolni is, egy plot segítségével az alábbi módon: 1 2 3 4 5 6 7 8 9
figure(1); title('Populaciok'); % Cim adasa a plotnak plot(t,z,'−g'); % Zsakmanyallatok fuggveny hold on; plot(t, r,'−r'); % Ragadozo fuggveny hold on; legend('Zsakmanyallatok','Ragadozok'); xlabel('t'); % X tengely elnevezese ylabel('n'); % Y tengely elnevezese
94
Z és R értékei
1
0.5
0
20
40
60
80
100 120 Az id˝ovektor
140
160
180
200
Ábra 7.9: A ragadozók - piros és zsákmányállatok - zöld állományának alakulása t = 1, . . . , 200 között Megoldás, 2. rész A ragadozókra jutó zsákmányállatokat adott id˝opillanatban az alábbi módon határozhatjuk meg a két populáció alapján: η=
Zt Rt
(A RÁNYSZÁM)
Az ábrázolandó arányt egy for ciklus segítségével kiszámíthatjuk a korábban létrehozott vektorok alapján: 1 2 3
for t = 1:200; eta(t)=z(t)/r(t); % A keresett arany kiszamitasa end
Ekkor a kész arány számot, a két korábban kiszámolt populációs számmal együtt ábrázolhatjuk az id˝o függvényében egy ploton. 1 2 3 4 5 6 7 8 9 10 11
figure(1); title('Populaciok aranya'); % Cim adasa a plotnak plot(t,z,'−g'); % Zsakmanyallatok fuggveny hold on; plot(t, r,'−r'); % Ragadozo fuggveny hold on; plot(t, eta,'−b'); % Populaciok aranya hold on; legend('Zsakmanyallatok','Ragadozok','Aranyszam'); xlabel('t'); % X tengely elnevezese ylabel('n'); % Y tengely elnevezese
A kész plot alapján megfigyelhet˝o az a jelenség, hogy amikor a ragadozók és zsákmányállatok populációjára teljesül az alábbi: Zt = Rt
(P OPULÁCIÓS EGYENSÚLY)
Akkor értelemszer˝uen az arányokat tartalmazó η függvény értéke 1 lesz. Az arányok egyezése nem állandó id˝oközönként történik meg.
Z és R értékei
95
2
1
0 0
20
40
60
80
100 120 Az id˝ovektor
140
160
180
200
Ábra 7.10: A ragadozók - piros, a zsákmányállatok - zöld és az arány-kék állományának alakulása t = 1, . . . , 200 között Megoldás, 3. rész A két populáció növekedését indexekb˝ol képzet vektorokkal lehet megfelel˝oen ábrázolni - a vektorok egyes elemeit az alábbi képletekkel lehet leképezni. Zt+1 Zt Rt+1 IRt = Rt IZt =
(Z SÁKMÁNYÁLLATOK INDEXE) (R AGADOZÓK INDEXE)
Az indexeket for ciklussal lehet létrehozni a korábbi adatok alapján. Mivel majd csak 199 indexet tudunk létrehozni szükségünk lesz egy új fajta id˝o vektorra is, amely 199 oszloppal rendelkezik. A megfelel˝o f or ciklus ekkor: 1 2 3 4
for t=1:199 z_nov(t)=z(t+1)/z(t); % Zsakmanyallatok indexe r_nov(t)=r(t+1)/r(t); % Ragadozok indexe end
A keresett id˝ovektor: 1
t=1:1:199; % Uj idovektor megadasa
A kész vektorok alapján tudjuk már ábrázolni a MATLAB segítségével az indexek értékét is egy ploton: 1 2 3 4 5 6 7 8 9
figure(1); title('Novekedesi indexek'); % Cim adasa a plotnak plot(ido2,z_nov,'−g'); % Zsakmanyallatok fuggveny hold on; plot(ido, r_nov,'−r'); % Ragadozo fuggveny hold on; legend('Zsakmanyallatok indexe','Ragadozok indexe'); xlabel('t'); % X tengely elnevezese ylabel('i'); % Y tengely elnevezese
96 14. feladat A Lotka-Volterra modellben a ragadozók, és a zsákmányállatok küzdelmét figyelhetjük meg. A rendszer egyenletei a következ˝ok: P ∆P = r · 1 − −s·Q ·P (Z SÁKMÁNYÁLLATOK EGYENLETE) K ∆Q = (−u +V · P) · Q (R AGADOZÓK EGYENLETE) Tudjuk, hogy a rendszer m˝uködését leíró paraméterek értékei az alábbiak: K=1 r = 1.3 s = 0.5 u = 0.7 v = 1.6 1. Ábrázoljuk az egyes populációk létszámának alakulását 200 id˝oszakon keresztül! 2. Ábrázoljuk a ragadozók számát a zsákmányállatok függvényében 200 id˝oszakon keresztül! Megoldás, 1. rész A feladat szövege alapján megadhatunk egy dinamikus modellt is a folyamat leírására: Pt Pt+1 = r · 1 − − s · Qt · Pt + Pt (Z SÁKMÁNYÁLLATOK EGYENLETE) K Qt+1 = (−u +V · Pt ) · Qt + Qt (R AGADOZÓK EGYENLETE) Ekkor a változókat skalárként definiálhatjuk a MATLAB számára, a megadott értékek alapján: 1 2 3 4 5
K=1; % r=1.3; s=0.5; u=0.7; v=1.6;
1. parameter % 2. parameter % 3. parameter % 4. parameter % 5. parameter
Szükségünk lesz az induló populációkra is a modellezéshez: P = 1/3
(Z SÁKMÁNYÁLLATOK)
Q = 0.3
(R AGADOZÓK)
Az induló populációkat is modellezhetjük: 1 2
P=1/3; % Zsakmanyallatok Q=0.3; % Ragadozok
A szükséges egyenletek már dinamizálhatók és ciklusba szervezhet˝oek ekkor: 1 2 3 4
for i=1:199 P(i+1)=r*((1−P(i)/K)−s*Q(i))*P(i)+P(i); Q(i+1)=(−u+v*P(i))*Q(i)+Q(i); end
Az ábrázoláshoz létre kell hozni egy id˝ovektort is, amelynek a hossza 200 egység: 1
t=[1:1:200]; % 200 idoszak hosszu vektor
97 Az id˝o függvényében ábrázolhatóvá válik mind a két állomány: 1 2 3 4 5 6
figure(1); title('Populaciok'); % Cim adasa a plotnak xlabel('t'); % X tengely elnevezese ylabel('Populaciok'); % Y tengely elnevezese plot(t,P,t,Q); % Abra letrehozasa legend('Zsakmany','Ragadozok'); % Jelmagyarazat
P és Q értékei
1.5
1
0.5
0
20
40
60
80
100 120 Az id˝ovektor
140
160
180
200
Ábra 7.11: A ragadozók - piros és zsákmányállatok - zöld állományának alakulása t = 1, . . . , 200 között Megoldás, 2. rész Mivel, minden szükséges vektor rendelkezésre áll, az ábra létrehozható már: 1 2 3 4 5 6
figure(1); title('Kolcsonos fugges'); % Cim adasa a plotnak xlabel('Zsakmanyok'); % X tengely elnevezese ylabel('Ragadozok'); % Y tengely elnevezese plot(P,Q); % Abra letrehozasa legend('Kapcsolat a populaciok kozott'); % Jelmagyarazat
Ragadozók
1.5
1
0.5
0.3
0.35
0.4
0.45
0.5
0.55 0.6 0.65 Zsáhmányállatok
0.7
0.75
Ábra 7.12: A ragadozók száma a zsákmányállatok függvényében
0.8
0.85
98 15. feladat Tegyük fel, hogy q szám˝u sertés felnevelésének költsége C(q) = αq + β q2 . Tegyük fel, hogy a gazdaság N azonos sertésfarmból áll. Legyen a sertések keresleti görbéje a p ár függvényében D(p) = γ − δ q, ahol az α, β , γ, δ konstansok mindegyike pozitív. Tegyük fel továbbá, hogy az összes farmer kompetitív módon viselkedik, a p árat adottnak tekinti , és a Π(q) = p · q −C(q) profit maximalizálására törekszik. A sertések felneveléséhez egy periódusra van szükség, és a t periódusban felnevelend˝o sertések számáról a farmer a (t − 1)-ik id˝oszak pt−1 ára alapján dönt, azt feltételezve, hogy a t id˝oszak pt ára meg fog egyezni a pt−1 árral. Ez alapján a t id˝opont összevont kínálata: Qt =
N · (pt−1 − α) 2β
A t id˝oszakban a kereslet és kínálat egyensúlya esetén: pt−1 − α = γ − δ · pt 2β A termék ára az els˝o periódusban p = 70. A paraméterek értéke a következ˝o: N = 10 ; β = 1; δ = 6; γ = 460; α = 10. Készítsük el a fázis diagramot (pókháló diagramot), amely bemutatja, hogy konvergál az ár az egyensúlyi ár értékéhez. Jelöljük az ábrán a 45 fokos egyenes metszéspontját is. Megoldás Az exogén paramétereket visszaírva: pt−1 − 10 = 460 − 6 · pt 2·1 Ezt rendezve adódik: pt−1 − 10 = 920 − 12 · pt Egyensúlyban fennáll majd az alábbi: pt = pt−1 Az egyenlet ekkor már így írható fel: p − 10 = 920 − 12 · p 930 13 A MATLAB számára ekkor deklarálhatjuk a paraméterek, az exogén változó kezd˝o árat, és a modell alapján megkapott endogén egyensúlyi árat is: p=
1 2 3 4 5 6 7 8
clear all; % Memoria nullazasa close all; %Minden ablak bezarasa delt = 6; %Delta parameter megadasa gamma = 460; % Gamma parameter megadasa alfa = 10; % Alfa parameter megadasa beta = 1; % Beta parameter megadasa p_es=(930/13); % Az egyensulyi ar a modell alapjan p(1)=70;
A modell alapján azonban az ár iteratív módon határozódik meg, emiatt szükséges az egyenletrendszer rendezése úgy, hogy azt egy f or ciklusba lehessen belefoglalni: −α γ − pt−1 2β pt = δ
99 Ekkor az egyensúlyi folyamat lekódolható lesz már: 1 2 3
for i=1:200 p(i+1)=(gamma−((p(i)−alfa)/(2*beta)))/(delt) end
A pókháló diagramhoz szükséges vektorok így adódnak for ciklus segítségével: 1 2 3 4 5 6
for i=1:100 pok(2*i)=p(i); pok(2*i−1)=p(i); end pok1=pok(1:199) pok2=pok(2:200)
Ekkor ábrázolható a fázis diagram a két megfelel˝o vektor alapján: 1 2 3 4 5 6 7 8 9
figure(1); title('Fazisdiagram'); % Cim adasa a plotnak xlabel('p_t'); % X tengely elnevezese ylabel('p_{t+1}'); % Y tengely elnevezese plot(pok1,pok2,'−r');% Arfuggveny rajzolasa hold on; plot(pok1,pok1,'−g'); % 45 fokos egyenes rajzolasa hold on; plot(p_es,p_es,'ko'); %Egyensulyi pont
A kész plot esetében az egyensúlyi pont, a 45 fokos egyenes és az árfüggvény metszéspontjánál van, azaz jól dolgoztunk. A konvergencia folyamat sebessége az ábra alapján magas.
71.6 71.4 71.2
pt+1
71 70.8 70.6 70.4 70.2 70 70
70.2 70.4 70.6 70.8 pt
71
71.2 71.4 71.6
Ábra 7.13: A pókháló diagram és a 45 fokos egyenes
100 16. feladat Egy termék árának id˝obeni alakulását a következ˝o egyenlet írja le: q pt+1 = 1.5 − 0.5 · pt3 A kezdeti p1 árra igaz, hogy az értéke 1.25. Készítsük el a fázis diagramot (pókháló diagramot), amely bemutatja, hogy konvergál az ár az egyensúlyi ár értékéhez. Jelöljük az ábrán a 45 fokos egyenes metszéspontját is. Megoldás Az egyenlet már dinamikus és rendezett. Emiatt els˝o lépésben meg lehet adni az ár kezd˝o értékét: p1 = 1.25 Ezt a MATLAB számára is deklarálhatjuk már: 1 2 3 4
close all; clear all; clc; p=1.25; % Ar megadasa
Minden következ˝o id˝oszaki ár származtatható az el˝oz˝o id˝oszakiból, emiatt ez leprogramozható a MATLAB számára egy for ciklussal az alábbi módon: 1 2 3
for i=1:100 p(i+1)=(1.5−0.5*p(i)^3)^0.5; % Arak generalasa end
A pókháló diagramhoz szükséges vektorok így adódnak f or ciklus segítségével: 1 2 3 4 5 6 7
for i=1:101 pok(2*i)=p(i); pok(2*i−1)=p(i); end pok1=pok(1:201) pok2=pok(2:202) p_es=1
Ekkor ábrázolható a fázis diagram a két megfelel˝o vektor alapján: 1 2 3 4 5 6 7 8 9
figure(1); title('Fazisdiagram'); % Cim adasa a plotnak xlabel('p_t'); % X tengely elnevezese ylabel('p_{t+1}'); % Y tengely elnevezese plot(pok1,pok2,'−r');% Arfuggveny rajzolasa hold on; plot(pok1,pok1,'−g'); % 45 fokos egyenes rajzolasa hold on; plot(p_es,p_es,'ko'); %Egyensulyi pont
101 A kész plot esetében az egyensúlyi pont, a 45 fokos egyenes és az árfüggvény metszéspontjánál van, azaz jól dolgoztunk. A konvergencia folyamat sebessége az ábra alapján alacsony.
1.25 1.2 1.15 1.1
pt+1
1.05 1 0.95 0.9 0.85 0.8 0.75 0.7 0.7
0.75
0.8
0.85
0.9
1
0.95
1.05
1.1
pt Ábra 7.14: A pókháló diagram és a 45 fokos egyenes
1.15
1.2
1.25
102 17. feladat Frisch, Haavelmo, Norregaard-Rasmussen és Zeuthen az infláció bér-ár spirál modelljének tárgyalás során a következ˝oket vizsgálták: Wt+2 −Wt+1 Pt+1 − Pt = Wt+1 Pt Pt = γ + βWt Ahol Wt a bérszínvonal, Pt az árszínvonal, γ = 6, β = 0.8 pedig konstansok. A második egyenlet az aktuális periódus árait kapcsolja össze az adott id˝oszaki bérekkel. Tudjuk még az alábbiakat is: W1 = 17 W2 = 10 1. Ábrázoljuk az árak és bérek alakulását 30 id˝oszakon keresztül. 2. Ábrázoljuk az inflációt 30 id˝oszakon keresztül. 3. Ábrázoljuk a bérek indexálódását 30 id˝oszakon keresztül. Megoldás, 1. rész Els˝o lépésben egy dinamikai rendszerre van szükségünk, amelyet kés˝obb egy f or ciklus segítségével legenerálhatunk. Ennek ez lesz az els˝o két egyenlete: Pt = γ + βWt Pt+1 = γ + βWt+1 A harmadik egyenletet a reálbér követési egyenlet átrendezésével kapjuk: Pt+1 − Pt ·Wt+1 +Wt+1 Wt+2 = Pt A negyedik dinamikai egyenletet pedig a t + 2 id˝oszak áraira felírva kaphatjuk meg: Pt+2 = γ + βWt+2 Ez a dinamikai rendszer már önfenntartó, és legenerálható abban az esetben, ha az els˝o két id˝oszak bérei és a paraméterek ismertek. Az alábbi változókat szükséges ekkor deklarálni: W1 = 17 W2 = 10 γ =6 β = 0.8 Ekkor ezek deklarálhatóak a MATLAB számára is: 1 2 3 4
gamma=6; % Exogen parameter megadasa beta=0.8; % Exogen parameter megadasa w(1)=17; % Berek elso idoszakban w(2)=10;% Berek masodik idoszakban
Az els˝o 30 id˝oszakra ekkor egy f or ciklussal le lehet generálni az endogén változókat: 1 2 3 4 5 6
for i=1:28 p(i)=gamma+beta*w(i); % Adott idoszaki ber p(i+1)=gamma+beta*w(i+1); % Koveketo idoszaki ber w(i+2)=((p(i+1)−p(i))/p(i))*w(i+1)+w(i+1); % Realber ber 2 idoszak mulva p(i+2)=gamma+beta*w(i+2); % Ar 2 idoszak mulva end
103 Ekkor léte kell hozni egy vektort, amely az id˝ot tartalmazza 30 id˝oszakon keresztül: 1
t=[1:30]
A kész id˝ovektor mellett már ábrázolhatóak az endogén változók: 1 2 3 4 5 6 7 8
figure(1); title('Aringadozas'); % Cim adasa a plotnak xlabel('t'); % X tengely elnevezese ylabel('p_{t),w_{t}'); % Y tengely elnevezese plot(t,p,'−r'); %Az arak hold on; plot(t, w,'−g'); % A berek legend('Arszinvonal', 'Berek');
Az ábra ekkor így néz ki:
W és P értékei
20
15
10
5 0
2
4
6
8
10
12
14 16 18 Az id˝ovektor
20
22
Ábra 7.15: Az id˝osorok alakulása t = 1, . . . , 30 között Megoldás, 2. rész Az inflációs index kifejezhet˝o az alábbi módon is: I=
pt+1 −1 pt
Így egy 29 elem˝u vektort lehet létrehozni a korábban kiszámított adatokból: 1 2 3
for i=1:29 infl(i)=(p(i+1)/p(i))−1; % Inflacios tenyezok szamitasa end
A kés˝obbi ábrázoláshoz egy 29 elem˝u id˝ovektorra is szükségünk lesz: 1
t2=[1:1:29] % Ido vektor lehivasa
24
26
28
30
104 Az id˝o függvényében ekkor mindig ábrázolható az infláció: 1 2 3 4 5 6
figure(1); title('Aringadozas'); % Cim adasa a plotnak xlabel('t'); % X tengely elnevezese ylabel('Inflacio'); % Y tengely elnevezese plot(t2,infl,'−r'); % Inflacios fuggveny legend('Inflacio');
W és P értékei
0
−0.1
−0.2
−0.3 0
2
4
6
8
10
12
14 16 18 Az id˝ovektor
20
22
Ábra 7.16: Az infláció alakulása t = 1, . . . , 29 között Megoldás, 3. rész A bér index kifejezhet˝o az alábbi módon is: WI =
wt+1 −1 wt
Így egy 29 elem˝u vektort lehet létrehozni a korábban kiszámított adatokból: 1 2 3
for i=1:29 ber(i)=(w(i+1)/w(i))−1; % Bervaltozas tenyezok szamitasa end
A kés˝obbi ábrázoláshoz egy 29 elem˝u id˝ovektorra is szükségünk lesz: 1
t2=[1:1:29] % Ido vektor lehivasa
Mindezt már ábrázolhatjuk: 1 2 3 4 5 6
figure(1); title('Aringadozas'); % Cim adasa a plotnak xlabel('t'); % X tengely elnevezese ylabel('Ber valtozas'); % Y tengely elnevezese plot(t2,ber,'−r'); % Beringadozasi fuggveny legend('Ber index');
24
26
28
30
105
W és P értékei
0
−0.2
−0.4 0
2
4
6
8
10
12
14 16 18 Az id˝ovektor
20
22
Ábra 7.17: A bérindex alakulása t = 1, . . . , 29 között
24
26
28
30
8 — Nem lineáris optimalizáció
1. feladat Adott az alábbi egyenlet: x32 − 47x5 = 38x + 17x3 + 287 Mi lesz a megoldása? Megoldás El˝oször szükségünk van arra, hogy az egyenletet nullára rendezzük: 0 = 38x + 17x3 + 287 − x32 + 47x5 Az egyenletben 1 ismeretlen szerepel. A megoldandó egyenletrendszer így deklaráljuk a MATLAB számára: 1 2 3
function[fval]=fel1(x) % Fuggveny nevenek deklaralasa fval(1)=38*x+17*x^3+287−x^32+47*x^5; % Nullara rendezett egyenlet end
A feladatot megfelel˝o néven elmentve adódik, hogy az egyenletet meg lehet oldani. Els˝o lépésben deklarálunk egy kezd˝o értéket: x0 = 1
1 2 3 4
clear all; % Memoria nullazasa close all; % Nyitott ablakok bezarasa clc; % Ablak tartalom torlese x0=[1]; % Kezdo vektor
A megoldást pedig az f solve függvény segítségével fogjuk elvégezni. A kimeneti paraméterek közül az els˝o a keresett változó értéke, a második a nullára rendezett függvény kimenete, amely konvergencia esetén nullához közelít, a harmadik pedig egy logikai változó, amelynek értéke 1, ha a konvergencia megtörtént. 1
[x,fval,exitflag]=fsolve('fel1',x0);
107 Ekkor az egyenlet megoldása: x = −1.160574 Ekkor a függvény kimeneti értéke, ellen˝orizhet˝o: 1 2
x=−1.160574; % A megoldasban x erteke y=38*x+17*x^3+287−x^32+47*x^5; % A fuggveny kimeneti erteke
Az y értéke 5 tizedesig közelíti a nullát. Azaz az egyenletet tényleg megoldottuk. 2. feladat Adott az alábbi függvény: x5 f (x) = 38 · x + 4 · x2 − 5 · x4 + + 270 5 Hol lesz széls˝oértéke? Megoldás A széls˝oérték létezésének feltétel:1 ∂ f (x) =0 ∂x Ez ebben az esetben ennyit jelent: 38 + 8 · x − 20 · x3 + x4 = 0 Ez természetesen megadható egy függvényben is, hiszen nullára van rendezve. A megoldandó egyenletrendszer így deklaráljuk a MATLAB számára: 1 2 3
function[fval]=fel2(x) % Fuggveny nevenek deklaralasa fval(1)=38+8*x−20*x^3+x^4; % Nullara rendezett egyenlet end
A feladatot megfelel˝o néven elmentve adódik, hogy az egyenletet meg lehet oldani. Els˝o lépésben deklarálunk egy kezd˝o értéket: x0 = 100
1 2 3 4
clear all; % Memoria nullazasa close all; % Nyitott ablakok bezarasa clc; % Ablak tartalom torlese x0=[100]; % Kezdo vektor
A megoldást pedig az f solve függvény segítségével fogjuk elvégezni. A kimeneti paraméterek közül az els˝o a keresett változó értéke, a második a nullára rendezett függvény kimenete, amely konvergencia esetén nullához közelít, a harmadik pedig egy logikai változó, amelynek értéke 1, ha a konvergencia megtörtént. 1
[x,fval,exitflag]=fsolve('fel2',x0);
Ekkor a széls˝o érték helye: x ≈ 1.3810
1A
stacionárius pontok létezését˝ol most eltekintünk.
108 A széls˝oértéket besorolni az alábbi módon tudjuk, egy f or ciklus és egy plot segítségével: 1 2 3 4
Az y változó
5
for i=1:100 z(i)=0.02*i; % Az x valtozo ertekei 0 es 2 kozott y(i)=38*z(i)+4*z(i)^2−5*z(i)^4+(z(i)^5)/5+270; % A fuggveny ertekei end plot(z,y) % A kesz plot
300
280
0
0.2
0.4
0.6
0.8
1 1.2 Az x változó
1.4
1.6
1.8
2
Ábra 8.1: A széls˝oérték az x ∈ [0, 2] intervallumon Az ábra alapján adódik, hogy maximum helyet találtunk meg. Az alábbi programkóddal a széls˝oérték is meghatározható: 1 2
x=1.3810 % Az optimalis x ertek y=38*x+4*x^2−5*x^4+x^5/5+270; % A fuggvenyertek a szelsoertek helyen
Azaz adódik, hogy teljesül az alábbi: y ≈ 312.9249 3. feladat Adott az alábbi egyenletrendszer: ez+3·y = 243+7·z 53z−2y = 3y+5·z Mi lesz a megoldása? Megoldható lesz-e? Megoldás Els˝o lépésben nullára rendezünk: 0 = 243+7·z − ez+3·y 0 = 3y+5·z − 53z−2y Ekkor megoldható a függvényrendszer leprogramozása így: 1 2 3 4 5 6
function[fval]=fel3(x) % Fuggveny nevenek deklaralasa z=x(1); % Ertekadas, atlathatosagert y=x(2); %Ertekadas, atlathatosagert fval(1)=2^(43+7*z)−exp(z+3*y); % Elso egyenlet fval(2)=3^(y+5*z)−5^(3*z−2*y); % Masodik egyenlet end
109 Ekkor ez megoldható feltéve, hogy van kezd˝o vektorunk: 1
x0=ones(2,1)
A megoldás során megint alkalmazunk majd exit f lag kimeneti paraméter, illetve a megoldásunk egy vektor lesz, amelynek az els˝o komponense lesz z és a második lesz y. Az iterációt végrehajtó programkód: 1
[x,fval,exitflag]=fsolve('fel3',x0);
A két gyökünk ebben az esetben: z ≈ −5.4647 y ≈ 2.9184 4. feladat Tekintsük az alábbi feltételes széls˝oérték feladatot: max s.t.
− x2 − 2y2 − 2y · z − z2 − 3x + 5yz − z = 2 2x − 4y + 2z = 0
Létezik-e megoldása? Ha igen mi lesz az? Megoldás A korlátokat nullára rendezzük: −3x + 5x − z − 2 = 0 2x − 4y + 2z = 0 Az alábbi Lagrange-féle függvényt lehet felírni: L (x, y, z, λ1 , λ2 ) = −x2 − 2y2 − 2yz − z2 − λ1 (−3x + 5y − z − 2) − λ2 (2x − 4y + 2z) Az ehhez tartozó parciális deriváltak a 3 változó és a két paraméter szerint: ∂ L (x, y, z, λ1 , λ2 ) = −2x + 3λ1 − 2λ2 = 0 ∂x ∂ L (x, y, z, λ1 , λ2 ) = −4y − 2z − 5λ1 + 4λ2 = 0 ∂y ∂ L (x, y, z, λ1 , λ2 ) = −2y − 2z − λ1 − 2λ2 = 0 ∂z ∂ L (x, y, z, λ1 , λ2 ) = 2 + 3x − 5y + z = 0 ∂ λ1 ∂ L (x, y, z, λ1 , λ2 ) = −2x + 4y − 2z = 0 ∂ λ2 A parciális deriváltak mindegyike létezik, emellett adódik az is, hogy áll az alábbi: 0 ≥ f (x, y, z) 0 ≥ −x2 − 2y2 − 2yz − z2 0 ≥ −x2 − y2 − (y + z)2 Ennek lehetséges megoldása lesz az (x, y, z) = (−4, −2, 0) pont. Az is adódik, hogy −3 5 −1 J f (x, y, z) = 2 −4 2 Ekkor a Lagrange-multiplikátorokra vonatkozó tétel feltételei teljesülnek elegend˝o az egyenletrendszer megoldása.
110 A függvény, amelyet meg fogunk oldani ekkor így néz ki: 1 2 3 4 5 6 7 8 9 10 11
function[fval]=fel4(x) % Fuggveny nevenek deklaralasa y=x(2); % Ertekadas, atlathatosagert z=x(3); %Ertekadas, atlathatosagert L1=x(4); % Ertekadas, atlathatosagert L2=x(5); % Ertekadas, atlathatosagert fval(1)=−2*x(1)+3*L1−2*L2; fval(2)=−4*y−2*z−5*L1+4*L2; fval(3)=−2*y−2*z+L1−2*L2; fval(4)=2+3*x(1)−5*y+z; fval(5)=−2*x(1)+4*y−2*z; end
Szükségünk lesz egy megfelel˝o kezd˝ovektorra is, amely 5 elem˝u: 1
x0=ones(5,1);
Ekkor megoldható az egyenletrendszer az alábbi kódrészlettel, ahol exit f lag paraméter is szerepel, kimeneti x változó és a konvergencia mértékét mér˝o f val érték: 1
[x,fval,exitflag]=fsolve('fel4',x0);
A program által visszaadott megoldásvektorunk: (x, y, z, λ1 , λ2 ) = (−1, 0, 1, −2, −2) A számunkra szükséges megoldásvektor részlet: (x, y, z) = (−1, 0, 1) 5. feladat Adott egy tökéletesen versenyz˝o vállalat, amelynek a teljes költségfüggvénye az alábbi módon néz ki: TC(Q) = 4 · Q2.8 − 13 · Q1.7 + 34 · Q + 50 1. Milyen mennyiséget termel és milyen áron a vállalat rövid távon? 2. Milyen mennyiséget termel és milyen áron a vállalat hosszú távon? Megoldás, 1. rész A rövid távú egyensúlyi feltétel: MC(Q) = AVC(Q) Ekkor a szükséges származtatott függvények: ∂ TC(Q) = MC(Q) = 4 · 2.8 · Q1.8 − 13 · 1.7 · Q0.7 + 34 ∂Q VC(Q) = AVC(Q) = 4 · Q1.8 − 13 · Q0.7 + 34 Q
Az egyensúlyi feltétel tehát: 4 · 2.8 · Q1.8 − 13 · 1.7 · Q0.7 + 34 = 4 · Q1.8 − 13 · Q0.7 + 34 Ha ezt nullára rendezzük, a probléma MATLAB segítségével kezelhet˝ové válik: 0 = 4 · Q1.8 − 13 · Q0.7 + 34 − 4 · 2.8 · Q1.8 − 13 · 1.7 · Q0.7 + 34
111 A megoldandó függvény így adódik: 1 2 3 4
function[fval]=fel5(x) % Fuggveny nevenek deklaralasa Q=x(1) % Ertekadas Q neven fval(1)=4*Q^1.8−13*Q^0.7+34−(4*2.8*Q^1.8−13*1.7*Q^0.7+34) % MC=AVC feltetel end
Szükségünk lesz egy megfelel˝o kezd˝ovektorra is, amely 1 elem˝u: 1
x0=ones(1,1);
Ekkor megoldható az egyenletrendszer az alábbi kódrészlettel, ahol exit f lag paraméter is szerepel, kimeneti x változó és a konvergencia mértékét mér˝o f val érték: 1
[x,fval,exitflag]=fsolve('fel5',x0);
Ekkora keresett mennyiség: Q = 1.237264 Az ár így adódik: P = MC Ez így kódolható le, feltételezve, hogy az f solve lefutott, és a mennyiség az x változóban van eltárolva: 1 2
Q=x; % Mennyiseg visszakodolasa P=4*Q^1.8−13*Q^0.7+34 % A P =MC feltetel
Ekkor az ár nagysága: P = 24.7788 Megoldás, 2. rész A hosszú távú egyensúlyi feltétel: MC(Q) = AC(Q) Ekkor a szükséges származtatott függvények: ∂ TC(Q) = MC(Q) = 4 · 2.8 · Q1.8 − 13 · 1.7 · Q0.7 + 34 ∂Q TC(Q) 50 = AC(Q) = 4 · Q1.8 − 13 · Q0.7 + 34 + Q Q
Az egyensúlyi feltétel tehát: 4 · 2.8 · Q1.8 − 13 · 1.7 · Q0.7 + 34 = 4 · Q1.8 − 13 · Q0.7 + 34 +
50 Q
Ha ezt nullára rendezzük, a probléma MATLAB segítségével kezelhet˝ové válik: 0 = 4 · Q1.8 − 13 · Q0.7 + 34 +
50 − 4 · 2.8 · Q1.8 − 13 · 1.7 · Q0.7 + 34 Q
A megoldandó függvény így adódik: 1 2 3 4
function[fval]=fel5b(x) % Fuggveny nevenek deklaralasa Q=x(1) % Ertekadas Q neven fval(1)=4*Q^1.8−13*Q^0.7+34+50/Q−(4*2.8*Q^1.8−13*1.7*Q^0.7+34) % MC=AC feltetel end
112 Szükségünk lesz egy megfelel˝o kezd˝ovektorra is, amely 1 elem˝u: 1
x0=ones(1,1);
Ekkor megoldható az egyenletrendszer az alábbi kódrészlettel, ahol exit f lag paraméter is szerepel, kimeneti x változó és a konvergencia mértékét mér˝o f val érték: 1
[x,fval,exitflag]=fsolve('fel5b',x0);
Ekkora keresett mennyiség: Q = 2.49393 Az ár így adódik: P = MC Ez így kódolható le, feltételezve, hogy az f solve lefutott, és a mennyiség az x változóban van eltárolva: 1 2
Q=x; % Mennyiseg visszakodolasa P=4*Q^1.8−13*Q^0.7+34 % A P =MC feltetel
Az ár és kibocsátás, amelyet kapunk megfelel az elvárásainknak, hiszen magasabb kibocsátással válnak a fixköltségek fedezhet˝ové, és ekkor a határköltség is növekszik. Az ár pedig: P = 30.0761034364 6. feladat Adott egy tökéletesen versenyz˝o vállalat, amelynek a teljes költségfüggvénye az alábbi módon néz ki: TC(Q) = 2 · Qα − 10 · Q1.5 + 20 · Q + 200 1. Tegyük fel, hogy α értéke 2.5 és 3.5 között változhat. Mennyit termel a vállalat rövid távon? 2. Tegyük fel, hogy α értéke 2.5 és 3.5 között változhat. Mennyit termel a vállalat hosszú távon? 3. A kapott mennyiséget ábrázolja egy ploton, ahol α a magyarázó változó! Megoldás A megoldásban mind a 3 részt közösen oldjuk végig, els˝o lépésben a 3 származtatott függvény: ∂ TC(Q) = 2 · α · Qα−1 − 15 · Q0.5 + 20 ∂Q VC(Q) AVC(Q) = = 2 · Qα−1 − 10 · Q0.5 + 20 Q TC(Q) 200 AC(Q) = = 2 · Qα−1 − 10 · Q0.5 + 20 + Q Q MC(Q) =
A rövid távra vonatkozó optimalitási feltétel: AVC(Q) = MC(Q) Ez esetünkben így adódik: 2 · Qα−1 − 10 · Q0.5 + 20 = 2 · α · Qα−1 − 15 · Q0.5 + 20 Ezt pedig els˝o lépésben nullára rendezzük: 0 = 2 · α · Qα−1 − 15 · Q0.5 + 20 − 2 · Qα−1 − 10 · Q0.5 + 20
113 Ez már f solve számára megoldható függvénybe rendezhet˝o lesz: 1 2 3 4 5
function[fval]=fel6a(x,alfa) % Fuggveny nevenek deklaralasa global alfa % Globalis alfa deklaralas Q=x(1); % Ertekadas Q neven fval(1)=2*alfa*Q^(alfa−1)−15*Q^0.5−(2*Q^(alfa−1)−10*Q^0.5+20); % MC=AVC end
A globális paraméter deklarálás azért szükséges, hogy a rendszer számár kívülr˝ol érkez˝o α értékek mellett újra megoldható legyen az optimalizációs probléma. Ekkor egy ciklusba kell szervezni a megoldást, és le kell menteni a különböz˝o α értékek mellett termelt mennyiségeket: 1 2 3 4 5 6 7
global alfa % Globalis alfa deklaralasa for i=1:100 alfa=2.5+i*0.01; % Uj alfa ertekek x0=1; % Kezdo iteracios ertek [x,fval,exitflag]=fsolve('fel6a',x0); % Alfa melletti Q nagysaga rovid tav Qrovid(i)=x; % Q kimentese end
A hosszú távra vonatkozó optimalitási feltétel: AC(Q) = MC(Q) Ez esetünkben így adódik: 2 · Qα−1 − 10 · Q0.5 + 20 +
500 = 2 · α · Qα−1 − 15 · Q0.5 + 20 Q
Ezt pedig els˝o lépésben nullára rendezzük: α−1
0 = 2·α ·Q
− 15 · Q
0.5
500 α−1 0.5 + 20 − 2 · Q − 10 · Q + 20 + Q
Ez lesz az optimalizálandó célfüggvényünk, ezt kell az fsolve számára megadnunk, természetesen úgy, hogy α globális paraméter lesz, amelyet kívülr˝ol lehet változtatni: 1 2 3 4 5
function[fval]=fel6b(x,alfa) % Fuggveny nevenek deklaralasa global alfa % Globalis alfa deklaralas Q=x(1); % Ertekadas Q neven fval(1)=2*alfa*Q^(alfa−1)−15*Q^0.5−(2*Q^(alfa−1)−10*Q^0.5+20+500/Q); end
% MC=AC
Ekkor egy ciklusba kell szervezni a megoldást, és le kell menteni a különböz˝o α értékek mellett termelt mennyiségeket: 1 2 3 4 5 6 7
global alfa % Globalis alfa deklaralasa for i=1:100 alfa=2.5+i*0.01; % Uj alfa ertekek x0=1; % Kezdo iteracios ertek [x,fval,exitflag]=fsolve('fel6b',x0); % Alfa melletti Q nagysaga hosszu tav Qhossz(i)=x; % Q kimentese end
114 Ekkor deklarálunk egy megfelel˝o hosszúságú α vektort, amelynek függvényében ábrázolni tudjuk a két termelt mennyiséget: 1
alfa=[2.51:0.01:3.5]
Ekkor ezen változó függvényében kezd˝odhet a plot elkészítése, amelyet így kaphatunk meg: 1 2 3 4 5 6
figure(1); title('Verseny'); % Cim adasa a plotnak xlabel('alfa'); % X tengely elnevezese ylabel('Mennyiseg'); % Y tengely elnevezese plot(alfa,Qrovid,alfa,Qhossz); % Termelesek alfa fuggvenyeben legend('Rovid tav','Hosszu tav');
Az eredményünk, amely az ábrán látható összességben így deklarálható, ha növekszik a kitev˝o, és ezzel a költségünk a kibocsátás rövid és hosszú távon is csökken. A termelések közötti rést az okozza, hogy a fix költségeket is fedezni kell id˝ovel, emiatt a hosszú távon történ˝o termelés nagyobb.
Mennyiség
8 6 4 2 2.5
2.6
2.7
2.8
2.9
3 α
3.1
3.2
3.3
Ábra 8.2: A termelések rövid és hosszú távon α ∈ [2.5; 3.5] esetén 7. feladat Adott egy monopolista vállalat amely az alábbi inverz kereslettel szembesül: P(Q) = 1100 − 2Q A költségfüggvényi az alábbi alakot ölti: TC(Q) = 2 · Q2.8 + 4.17 · Q2.23 + 5.78 · Q1.71 Mennyit fog termelni a monopolista? Megoldás A profit függvény általános alakja:
∏ = P · Q − TC(Q) Ez esetünkben így írható fel:
∏ = (1100 − 2 · Q) · Q −
2 · Q2.8 + 4.17 · Q2.23 + 5.78 · Q1.71
A monopolista célja az alábbi lesz: max → ∏
3.4
3.5
115 Ez a feltétel így fog adódni majd: ∂∏ =0 ∂Q Ez esetünkben így adódik: 0 = 1100 − 4 · Q − 2 · 2.8Q˙ 1.8 − 4.17 · 2.23 · Q1.13 − 5.78 · 1.71 · Q0.71 Mivel ez egy már nullára rendezett egyenlet, amely kezelhet˝o az f solve segítségével a probléma megoldható lesz így: 1 2 3 4
function[fval]=fel7(x) % Fuggveny nevenek deklaralasa Q=x(1); % Ertekadas Q neven fval(1)=1100−4*Q−2*2.8*Q^1.8−4.17*2.23*Q^1.13−5.78*1.71*Q^0.71; end
% Profit max
Ekkor mindez már megoldható, szükségünk lesz egy megfelel˝o kezd˝ovektorra is, amely 1 elem˝u: 1
x0=ones(1,1);
Ekkor megoldható az egyenletrendszer az alábbi kódrészlettel, ahol exit f lag paraméter is szerepel, kimeneti x változó és a konvergencia mértékét mér˝o f val érték: 1
[x,fval,exitflag]=fsolve('fel7',x0);
Ekkora keresett mennyiség: Q = 15.3692 Az ár így adódik: P = 1100 − 2 · Q Ez így kódolható le, feltételezve, hogy az f solve lefutott, és a mennyiség az x változóban van eltárolva: 1 2
Q=x; % Mennyiseg visszakodolasa P=1100−2*Q;% Az ar
Azaz a keresett ár: P = 1069.2616 8. feladat Adott egy monopolista vállalat amely az alábbi inverz kereslettel szembesül: P(Q) = 1200 − 3 · Q A költségfüggvényi az alábbi alakot ölti: TC(Q) = Qα + Q1.15 + 4000 1. 2. 3. 4.
Mennyit fog termelni a monopolista, ha α = 1.5, . . . , 2.5? Milyen árakon termel a monopolista, ha α = 1.5, . . . , 2.5? Mekkora lesz a profit, hogyha α = 1.5, . . . , 2.5? Ábrázolja a kapott eredményeit α függvényében!
116 Megoldás A profit függvény általános alakja:
∏ = P · Q − TC(Q) Ez esetünkben így írható fel:
∏ = (1200 − 3 · Q) · Q −
Qα + Q1.15 + 4000
A monopolista célja az alábbi lesz: max → ∏ Ez a feltétel így fog adódni majd: ∂∏ =0 ∂Q Ez esetünkben így adódik: 0 = 1200 − 6 · Q − α · Qα−1 − 1.15 · Q0.15 Adott α ismeretében az optimum mindig meghatározható, innen adódik, hogy az egyenlet megoldható f solve segítségével minden esetben: 1 2 3 4 5
function[fval]=fel8(x,alfa) % Fuggveny nevenek deklaralasa global alfa % Globalis alfa deklaralas Q=x(1); % Ertekadas Q neven fval(1)=1200−6*Q−alfa*Q^(alfa−1)−1.15*Q^0.15; % MC=MR end
Ekkor a változó α paraméter mellett megoldható az egyenletrendszer minden esetben: 1 2 3 4 5 6 7
global alfa % Globalis alfa deklaralasa for i=1:100 alfa=1.5+i*0.01; % Uj alfa ertekek x0=1; % Kezdo iteracios ertek [x,fval,exitflag]=fsolve('fel8',x0); % Alfa melletti Q nagysaga Q(i)=x; % Q kimentese end
Ekkor szükségünk egy küls˝o α paraméterre is, amely a megfelel˝o intervallumban van: 1
alfa=[1.51:0.01:2.5] % Alfa ertekei
Ekkor a kapott eredményeink alapján egy f or ciklussal számítható lesz, az ár és a termelt mennyiség is: 1 2 3 4
for i=1:100 P(i)=1200−3*Q(i); % Ar szamitasa Profit(i)=P(i)*Q(i)−Q(i)^(alfa(i))−4000−Q(i)^1.15; % Profit szamitasa end
Az eredmények alapján összesen 3 különböz˝o plot készíthet˝o el, ahol minden esetben az α paramétert választjuk magyarázóváltozónak. Az els˝o egy közös ábra, amely a mennyiségre és árra vonatkozik: 1 2 3 4 5 6
figure(1); title('Monopolista I.'); % Cim adasa a plotnak xlabel('alfa'); % X tengely elnevezese ylabel('Mennyiseg es ar'); % Y tengely elnevezese plot(alfa,Q,alfa,P); % Termelesek alfa fuggvenyeben legend('Mennyiseg','Ar');
117 A második plot az α függvényében a profit nagysága lesz: 1 2 3 4 5 6
figure(1); title('Monopolista II.'); % Cim adasa a plotnak xlabel('alfa'); % X tengely elnevezese ylabel('Profit'); % Y tengely elnevezese plot(alfa,Profit); % Termelesek alfa fuggvenyeben legend('Profit');
Ez a mi esetünkben így fog kinézni:
Mennyiség és ár
1,000
500
1.5
1.6
1.7
1.8
1.9
2 α
2.1
2.2
2.3
2.4
2.5
Ábra 8.3: Az ár és mennyiség α ∈ [1.5; 2.5] esetén. Az eredményt így lehet interpretálni: A mennyiség csökken abban az esetben, hogyha a költség hatványkitev˝oje növekszik, ebben az esetben viszont többet lehet elkérni a piacon egy darab termékért. Ekkor már ábrázolható a profit is: ·105
Mennyiség és ár
1 0.8 0.6 0.4 1.5
1.6
1.7
1.8
1.9
2 α
2.1
2.2
2.3
Ábra 8.4: Az ár és mennyiség α ∈ [1.5; 2.5] esetén. Azaz a profit a költségfüggvény α paraméterének növekedésével csökken fokozatosan.
2.4
2.5
118 9. feladat Egy kötvényr˝ol tudjuk, hogy az els˝o két évben 7 százalékos kupont fizet, a következ˝o három évben pedig 10 százalékot, a t˝oketörlesztés az ötödik év végén történik meg, és ekkor fizetik vissza egyben a 2000 dollárt. A kötvény jelenértéke a kibocsátáskor 2200 dollár, mekkora a kamatláb, amivel diszkontálunk? Megoldás Els˝o lépésben felírjuk a kötvény pénzáramlásait, amelyek így adódnak sorban: ha t = 1, 2 140$ Ct = 200$ ha t = 3, 4 200 + 2000$ ha t = 5 A jelenértékr˝ol tudjuk, hogy így adódik mindig: 5
Ct t t=1 (1 + r)
PV = ∑ Ez a mi esetünkben ezt jelenti: 2200$ =
140$ 140$ 200$ 200$ 2200$ + + + + 1 + r (1 + r)2 (1 + r)3 (1 + r)4 (1 + r)5
Bár az egyenlet nem lineáris és 5. fokú elemeket is tartalmaz nullára rendezve a MATLAB segítségével megoldható lesz: 0=
1 2 3 4
140$ 200$ 200$ 2200$ 140$ + + + − 2200$ + 2 3 4 1 + r (1 + r) (1 + r) (1 + r) (1 + r)5
function[fval]=fel9(x) % Fuggveny nevenek deklaralasa r=x(1); % Ertekadas r neven fval(1)=140/(1+r)+140/(1+r)^2+200/(1+r)^3+200/(1+r)^4+2200/(1+r)^5−2200; end
Deklarálunk egy kezd˝o értéket, amely a kamatláb lesz, mondjuk az alábbit: 1
x0=0.05; % Kezdo iteracios ertek
Majd megoldjuk a korábban létrehozott egyenletet: 1
[x,fval,exitflag]=fsolve('fel9',x0); %
Azaz a keresett kamatláb értéke adódik: r ≈ 0.06296 ≈ 6.296%
% PV
119 10. feladat Egy kötvényr˝ol tudjuk, hogy az els˝o három évben 9 százalékos kupont fizet, a következ˝o négy évben pedig 13 százalékot, a t˝oketörlesztés a hetedik év végén történik meg, és ekkor fizetik vissza egyben az 500 dollárt. A kötvény jelenértéke a kibocsátáskor PV = 600, . . . , 700 dollár, mekkora a kamatláb, amivel diszkontálunk? Hogyan függ a kamatláb a jelenértékt˝ol? Megoldás Els˝o lépésben felírjuk a kötvény pénzáramlásait, amelyek így adódnak sorban: ha t = 1, 2, 3 45$ Ct = 65$ ha t = 4, 5, 6 500 + 65$ ha t = 7 A jelenértékr˝ol tudjuk, hogy így adódik mindig: 7
Ct (1 + r)t t=1
PV = ∑ Ez a mi esetünkben ezt jelenti: PV =
45$ 65$ 65$ 65$ 565$ 45$ 45$ + + + + + + 2 3 4 5 6 1 + r (1 + r) (1 + r) (1 + r) (1 + r) (1 + r) (1 + r)7
Bár az egyenlet nem lineáris és 7. fokú elemeket is tartalmaz nullára rendezve a MATLAB segítségével megoldható lesz: 0=
45$ 45$ 45$ 65$ 65$ 65$ 565$ + + + + + + − PV 2 3 4 5 6 1 + r (1 + r) (1 + r) (1 + r) (1 + r) (1 + r) (1 + r)7
A PV érték egy kívülr˝ol kapott paraméter marad a megoldandó f solve függvényben ekkor. Ez így néz ki tehát: 1 2 3 4 5 6
function[fval]=fel10(x,PV) % Fuggveny nevenek deklaralasa global PV; r=x(1); % Ertekadas r neven fval(1)=45/(1+r)+45/(1+r)^2+45/(1+r)^3+65/(1+r)^4 +65/(1+r)^5+65/(1+r)^6+565/(1+r)^7−PV; % PV end
Ekkor a modell az alábbi módon oldható meg, minden egyes esetben új jelenértéket deklarálva: 1 2 3 4 5 6 7
global PV % Globalis alfa deklaralasa for i=1:100 PV=600+i; % Uj PV ertekek x0=0.05; % Kezdo iteracios ertek [x,fval,exitflag]=fsolve('fel10',x0); % PV melletti r nagysaga r(i)=x; % r kimentese end
Ekkor készen vagyunk az optimalizációs f or ciklussal is, amelybe beágyaztuk az f solve parancsot, ilyenkor még létre kell hoznunk egy PV vektort: 1
PV=[601:700]% A jelenertek
120 Ekkor a jelenérték függvényében ábrázolhatjuk a kamatlábat az alábbi módon: 1 2 3 4 5 6
figure(1); title('PV'); % Cim adasa a plotnak xlabel('Jelenertek'); % X tengely elnevezese ylabel('Kamat'); % Y tengely elnevezese plot(PV,r); % Kamat a jelenertek fuggvenyeben legend('Kamat');
Összességben tehát adódik, hogy alacsonyabb a jelenérték, abban az esetben, hogyha magasabb kamatlábbal diszkontálunk. Ez tulajdonképpen egy evidens állítás. ·10−2
Kamatláb
7
6
5
600
610
620
630
640
650 660 Jelenérték
670
680
690
700
Ábra 8.5: A viszonyítási kamatláb PV ∈ [600; 700] esetén 11. feladat Egy piacon az alábbi inverz kereslettel találkoznak a résztvev˝o vállalatok: P = 1500 − Q A piacon összesen 2 vállalat van jelen, akik szimultán döntenek a termelt mennyiségr˝ol a költségfüggvényeik rendre az alábbiak lesznek: 2.3 1.1 TC1 (q1 ) = q3.7 1 + q1 + q1 + 305
(1. vállalat költségei)
2.1 1.4 q3.9 2 + q2 + q2 + 207
(2. vállalat költségei)
TC2 (q2 ) =
Optimális esetben mennyit termelnek? Milyen ár fog kialakulni? Megoldás Tudjuk, hogy indirekt módon egy Cournot-féle duopólium van megfogalmazva, hiszen szimultán mennyiségi játékot játszanak. Ekkor a vállalatok célja az egyéni profitok maximalizációja: max max
∏ 1 = P · q1 − TC1 (q1 ) ∏ 2 = P · q2 − TC2 (q2 )
Ebben az esetben az optimum feltétele: ∂∏1 =0 ∂ q1 ∂∏2 =0 ∂ q2
121 A profit függvények:
∏ 1 = (1500 − (q1 + q2 )) · q1 − ∏ 2 = (1500 − (q1 + q2 )) · q2 −
2.3 1.1 q3.7 1 + q1 + q1 + 305
2.1 1.4 q3.9 2 + q2 + q2 + 207
Az optimum feltétele tehát nem más, mint az alábbi: 1.3 0.1 0 = 1500 − 2 · q1 − q2 − 3.7 · q2.7 1 − 2.3 · q1 − 1.1 · q1 1.1 0.4 0 = 1500 − 2 · q2 − q1 − 3.9 · q2.9 2 − 2.1 · q2 − 1.4 · q2
Azonban ez két nemlineáris két változós függvény, amelyet megoldani nehézkes, viszont ezt a MATLAB tudja kezelni, tehát az alábbi függvényt kell létrehoznunk: 1 2 3 4 5 6
function[fval]=fel11(x) % Fuggveny nevenek deklaralasa q1=x(1); % Ertekadas q1 neven q2 =x(2); % Ertekadas q2 neven fval(1)=1500−2*q1−q2−3.7*q1^2.7−2.3*q1^1.3−1.1*q1^0.1; % Reakciofuggveny 1 fval(2)=1500−2*q2−q1−3.9*q2^2.9−2.1*q2^1.1−1.4*q2^0.4; % Reakciofuggveny 2 end
Az egyenletrendszer megoldásához már csak 1 két elem˝u kezd˝ovektor szükséges: 1
x0=ones(2,1);
Ekkor megoldható az egyenletrendszer az alábbi kódrészlettel, ahol exit f lag paraméter is szerepel, kimeneti x változó és a konvergencia mértékét mér˝o f val érték: 1
[x,fval,exitflag]=fsolve('fel11',x0);
A termelt mennyiségek tehát: q1 = 9.0876 q2 = 7.7014 Azaz szimultán döntés esetén az a vállalat fog többet termelni, amelyik alacsonyabb költségekkel tud kibocsátani. A piacon kialakuló ár: 1 2 3
q1=x(1); q2=x(2); P=1500−(q1+q2); % Keresletbe visszairas
Azaz az ár: P = 1483.21 12. feladat Egy piacon az alábbi inverz kereslettel találkoznak a résztvev˝o vállalatok: P = 1800 − 3 · Q A piacon összesen 2 vállalat van jelen, akik szimultán döntenek a termelt mennyiségr˝ol a költségfüggvényeik rendre az alábbiak lesznek: 1.3 TC1 (q1 ) = qα1 + q2.5 1 + q1 + 400
(1. vállalat költségei)
1.3 TC2 (q2 ) = q42 + q2.5 2 + q2 + 400
(2. vállalat költségei)
122 Abban az esetben ha α = 3, . . . , 4 között lehet, optimális esetben mennyit termelnek? Milyen ár fog kialakulni? Mekkora lesz az egyes vállalatok profitja? Megoldás Tudjuk, hogy indirekt módon egy Cournot-féle duopólium van megfogalmazva, hiszen szimultán mennyiségi játékot játszanak. Ekkor a vállalatok célja az egyéni profitok maximalizációja: max max
∏ 1 = P · q1 − TC1 (q1 ) ∏ 2 = P · q2 − TC2 (q2 )
Ebben az esetben az optimum feltétele: ∂∏1 =0 ∂ q1 ∂∏2 =0 ∂ q2 A profit függvények:
∏ 1 = (1800 − 3 · (q1 + q2 )) · q1 − ∏ 2 = (1800 − 3 · (q1 + q2 )) · q2 −
1.3 qα1 + q2.5 1 + q1 + 400 1.3 q42 + q2.5 2 + q2 + 400
Az optimum feltétele tehát nem más, mint az alábbi: 0.3 0 = 1800 − 6 · q1 − 3 · q2 − α · q1α−1 − 2.5 · q1.5 1 − 1.3 · q1 0.3 0 = 1800 − 6 · q2 − 3 · q1 − 4 · q32 − 2.5 · q1.5 2 − 1.3 · q2
Azonban ez két nemlineáris két változós függvény, amelyet megoldani nehézkes, viszont ezt a MATLAB tudja kezelni, tehát az alábbi függvényt kell létrehoznunk, ahol α paraméter fog maradni. 1 2 3 4 5 6 7
function[fval]=fel12(x,alfa) % Fuggveny nevenek deklaralasa global alfa; q1=x(1); % Ertekadas q1 neven q2=x(2); % Ertekadas q2 neven fval(1)=1800−6*q1−3*q2−alfa*q1^(alfa−1)−2.5*q1^1.5−1.3*q1^0.3; % Reakciof.1 fval(2)=1800−6*q2−3*q1−4*q2^3−2.5*q2^1.5−1.3*q2^0.3; % Reakciof. 2 end
Ekkor tetsz˝oleges α mellett megoldható mindig a probléma, emiatt érdemes létrehozni egy f or ciklust, amely megoldja a kódrészletet: 1 2 3 4 5 6 7 8
global alfa % Globalis alfa deklaralasa for i=1:100 alfa=3+i*0.01; % Kezdo alfa ertek x0=ones(2,1); % Kezdo iteracios vektor [x,fval,exitflag]=fsolve('fel12',x0); % Adott alfa melletti termelesek q1(i)=x(1); % Q1 kimentese q2(i)=x(2); end
Ekkor a mennyiségek ismeretében az ár is meghatározható, hiszen ismert, hogy: P = 1800 − 3Q = 1800 − 3 · (q1 + q2 ) Erre így lehet ciklust írni: 1 2 3
for i=1:100 P(i)=1800−3*(q1(i)+q2(i)); % Arak meghatarozasa end
123 Szükségünk van egy α paramétereket tartalmazó vektorra is, amely 100 egység hosszú: 1
alfa=[3.01:0.01:4]
Az ár és mennyiségek ismeretében az egyedi profitok is meghatározhatóak egy f or ciklus segítségével: 1 2 3 4
for i=1:100 Profit1(i)=P(i)*q1(i)−(q1(i)^(alfa(i))+q1(i)^2.5+q1(i)^1.3+400); % Prof. 1. vall. Profit2(i)=P(i)*q2(i)−(q2(i)^4+q2(i)^2.5+q2(i)^1.3+400); % Prof. 2. vall. end
Ekkor pedig sorban ábrázolhatjuk a kapott eredményeinket, els˝oként egy olyan plot készül, amelyen α függvényében a két termelt mennyiség szerepel: 1 2 3 4 5 6
figure(1); title('Mennyisegek'); % Cim adasa a plotnak xlabel('Alfa ertekei'); % X tengely elnevezese ylabel('Mennyisegek'); % Y tengely elnevezese plot(alfa,q1,alfa,q2); % Mennyiseg alfa fuggvenyeben legend('Termeles 1. vallalat','Termeles 2. vallalat');
Az ábra alapján megállapítható, hogy a növekv˝o költségek mellett az 1. vállalat egyre kevesebbet termel, ekkor viszont a 2. vállalat egy kicsivel többet termel. A kis változás alapján adódik, hogy a reakciófüggvénye rugalmatlan. Az is adódik, hogy a két termelt mennyiség azonos költségfüggvények mellett megegyezik, ez a szimultán döntés következménye is.
A mennyiségek
20
15
10
3
3.1
3.2
3.3
3.4
3.5 α
3.6
3.7
3.8
3.9
4
Ábra 8.6: Az els˝o és második vállalat termelése α ∈ [3; 4] esetén A következ˝o plot az árakat fogja bemutatni, az ehhez tartozó kódrészlet: 1 2 3 4 5 6
figure(1); title('Arak'); % Cim adasa a plotnak xlabel('Alfa ertekei'); % X tengely elnevezese ylabel('Arak'); % Y tengely elnevezese plot(alfa,P); % Ar alfa fuggvenyeben legend('Arak');
Az ábra alapján adódik, hogy a csökken˝o aggregált mennyiség miatt a piacon az árak növekedni fognak. Ez sem egy meglep˝o eredmény.
Az árak
124
1,740
1,720
3
3.1
3.2
3.3
3.4
3.5 α
3.6
3.7
3.8
3.9
4
Ábra 8.7: Az árak α ∈ [3; 4] esetén Végül pedig a profitot érdemes ábrázolni mind a két vállalatra nézve: 1 2 3 4 5 6
figure(1); title('Profit'); % Cim adasa a plotnak xlabel('Alfa ertekei'); % X tengely elnevezese ylabel('Profit'); % Y tengely elnevezese plot(alfa,Profit1,alfa,Profit2); % Profitok alfa fuggvenyeben legend('Profit 1. vallalat','Profit 2. vallalat');
Az ábra alapján adódik, hogy az 1. vállalat profitja csökken a másodiké növekedik, a konvergencia végpontja azonos, hiszen az árak a piacon határozódnak meg, termelési szerkezetük és a költségfüggvényük pedig azonos. ·104
A profit
2
1.5
1 3
3.1
3.2
3.3
3.4
3.5 α
3.6
3.7
3.8
3.9
4
Ábra 8.8: A profitok α ∈ [3; 4] esetén 13. feladat Egy faluban két termel˝o foglalkozik mez˝ogazdasági Termeléssel. Adorján és Mihály gazda. Adorján gazdának almáskertje van, Mihály gazdának pedig méhészete. Profitfüggvényük a következ˝o: ΠA = 10A1.1 − Aα + 5M ΠM = 5M 1.05 − M α ahol A az almafák, M a méhcsaládok száma, α pedig egy 1.5 és 2 között változó paraméter. Ábrázoljuk, α függvényében, hogy mennyivel növeli közös profitjukat az externália internalizálása.
125 Megoldás Az egyensúlyi feltételek abban az esetben, ha a két gazdasági szerepl˝o egymástól függetlenül dönt: ∂ ΠA = 11A0.1 − αAα−1 ∂A ∂ ΠM = 5.25M 0.05 − αM α−1 ∂M Az α paraméter olyan küls˝o változó lesz, amelyet kívülr˝ol fogunk megadni minden optimalizációs esetben, a két kimen˝o paramétert a MATLAB számára pedig így definiáljuk majd: x1 = A x2 = M A megoldandó egyenletrendszer ekkor az x vektortól és az α globális változótól fog függeni, és az egyenletrendszert alma néven tároljuk le: 1 2 3 4 5 6 7
function fval=alma(x,alfa) global alfa % Globalis rugalmassagi parameter A=x(1); M=x(2); fval(1)=11*A^0.1−alfa*A^(alfa−1); % Elso optimum feltetel fval(2)=5.25*M^0.05−alfa*M^(alfa−1); % Masodik optimum feltetel end
Tudjuk, hogy a közös profit így lesz felírható minden esetben:
∏ = 5M1.05 − Mα + 10A1.1 − Aα + 5M A rugalmasságot indexként futtatva és küls˝o paraméterként megadva az egyenlet minden rugalmasság mellett megoldható, és az M, A és α értékek kimenthet˝oek: 1 2 3 4 5 6 7 8
global alfa % Globalis alpha meghivasa for i=1:51 % Ciklus elinditasa alfa=1.49+i/100; % Rugalmassag ertekadasa [x,fval]=fsolve('alma',[10;10]); % Egyenletrendszer lehivasa A(i)=x(1); % Alma ertek elmentese M(i)=x(2); % Meh ertek elmentese t(i)=alfa; % Alfa ertek elmentese end % Ciklus lezarasa
A korábban megfogalmazott képlet alapján a közös profit értékek is legenerálhatóak egy f or ciklus segítségével:2 1 2 3
for i=1:51 pi(i)=10*A(i)^(1.1)−A(i)^t(i)+5*M(i)+5*M(i)^1.05−M(i)^(t(i)); % Profit end
Az egyensúlyi feltételek abban az esetben, ha a két gazdasági szerepl˝o közösen dönt, és internalizálják az extern hatást: ∂ ΠA + ΠM = 11A0.1 − αAα−1 ∂A ∂ ΠA + ΠM = 5.25M 0.05 − αM α−1 + 5 ∂M A megoldandó egyenletrendszer ekkor az x vektortól és az α globális változótól fog függeni, és az egyenletrendszert körte néven tároljuk le: 2 Feltéve,
hogy az M, A és rugalmasságértékek rendelkezésre állnak.
126 1 2 3 4 5 6 7
function fval=korte(x,alfa) global alfa % Globalis rugalmassagi parameter A=x(1); M=x(2); fval(1)=11*A^0.1−alfa*A^(alfa−1); % Elso optimum feltetel fval(2)=5.25*M^0.05−alfa*M^(alfa−1)+5; % Masodik optimum feltetel end
Tudjuk, hogy a közös profit így lesz felírható minden esetben:
∏ = 5M1.05 − Mα + 10A1.1 − Aα + 5M A rugalmasságot indexként futtatva és küls˝o paraméterként megadva az egyenlet minden rugalmasság mellett megoldható, és az m, a és α értékek kimenthet˝oek: 1 2 3 4 5 6 7 8
global alfa % Globalis alpha meghivasa for i=1:51 % Ciklus elinditasa alfa=1.49+i/100; % Rugalmassag ertekadasa [x,fval]=fsolve('korte',[10;10]); % Egyenletrendszer lehivasa a(i)=x(1); % Uj alma ertek elmentese m(i)=x(2); % Uj meh ertek elmentese k(i)=alfa; % Alfa ertek elmentese end % Ciklus lezarasa
A korábban megfogalmazott képlet alapján a közös profit értékek is legenerálhatóak egy for ciklus segítségével:3 1 2 3
for i=1:51 Profit(i)=10*a(i)^(1.1)−a(i)^k(i)+5*m(i)+5*m(i)^1.05−m(i)^(k(i)); end
A kész profit vektorok már ábrázolhatóak mind a két esetben a rugalmasság függvényében és az egyedi termelések is ábrázolhatóak: 1 2 3 4 5 6 7
subplot(1,2,1) plot(t,pi,t,A,t,M) % Niyto allapot legend('Kozos profit','Alma termeles','Mez termeles') hold on subplot(1,2,2) plot(t,Profit,t,a,t,m) % Internalizacio utani allapot legend('Kozos profit','Alma termeles','Mez termeles')
A kész ábrán megfigyelhet˝o, hogy növekv˝o költség hatványkitev˝o mellett csökkennek az egyedi termelések és a közös profit is. Emellett az is megfigyelhet˝o, hogy az internalizáció magasabb közös profitot eredményez az eltér˝o döntés miatt. 3 Feltéve,
hogy az m, a és rugalmasságértékek rendelkezésre állnak.
127
700 600
A profit
500 400 300 200 100 0 1.5
1.55
1.6
1.65
1.7
1.75 α
1.8
1.85
1.9
1.95
2
1.95
2
Ábra 8.9: A kibocsátások és profit két külön vállalat esetén
800 700
A profit
600 500 400 300 200 100 0 1.5
1.55
1.6
1.65
1.7
1.75 α
1.8
1.85
1.9
Ábra 8.10: A kibocsátások és profit egy konglomerátum esetén
128 14. feladat Egy árelfogadó vállalat termelési függvénye az alábbi: Q = 2 · K α · L1−α A vállalat rövid távon 4 egység t˝okét használ fel. A tényez˝oárak rendre a következ˝ok: hL = 1000 és hK = 10000. A vállalat termékeit 4000 egységes áron adja el. Mekkora lesz a felhasznált munkaer˝o, kibocsátás és a realizálható haszon, ha α = 0.25, . . . , 0.75? Megoldás A profitfüggvényt fogja a vállalat maximalizálni és csak a felhasznált munkaer˝or˝ol dönthet:
∏ = Q · P − L · hl − K · hK Ez így is felírható még mindig változókkal:
∏ = 2 · K α · L1−α · P − L · hl − K · hK Mindez a változókkal együtt:
∏ = 8000 · 4α · L1−α − L · 1000 − 4 · 10000 Az optimum feltétele így fog adódni: ∂∏ =0 ∂L Azaz ebben az esetben: 0 = 8000 · 4α · (1 − α) · L−α − 1000 Mindez természet ciklusba szervezhet˝o az alábbi módon: 1 2 3 4 5
function[fval]=fel14(x,alfa) global alfa; L=x(1); fval(1)=(8000*4^alfa)*(1−alfa)*L^(−alfa)−1000; end
Ekkor a kódrészlet megoldható az f solve segítségével, és a függvényet egy f or ciklusba fogjuk beágyazni: 1 2 3 4 5 6 7
global alfa % Globalis alfa meghivasa for i=1:51 % Ciklus elinditasa alfa=0.24+0.01*i; % Kitevo ertekadas [x,fval]=fsolve('fel14',10); % Egyenletrendszer lehivasa L(i)=x; % Munka lementese kitevo(i)=alfa; % Alfa ertek elmentese end % Ciklus lezarasa
A korábban megfogalmazott képlet alapján a kibocsátás, és profit értékek is legenerálhatóak: 1 2 3 4
for i=1:51 Q(i)=2*L(i)^(1−kitevo(i))*4^kitevo(i); % Mennyiseg szamitasa Profit(i)=Q(i)*4000−40000−L(i)*1000; % Profit szamitasa end
Azt tapasztaljuk, hogy bizonyos α értékek mellett a vállalat negatív profittal szembesülne. Ekkor nem történik meg a belépés.
129 15. feladat Tételezzük fel, hogy az általunk vizsgált gazdaságban a reprezentatív fogyasztó az 3
U = ∑ β t−1 lnCt − 12 · Lt1.82
t=1
formában megragadható életpálya hasznosságának maxmializálására törekszik a megfelel˝o költségvetési korlátok sorozata mellett. A terméket el˝oállító vállalat termelési függvénye Yt = 0.2 · Lt0.74 , ahol t = 1, 2 1 és Y3 = L30.74 A fogyasztónak lehet˝osége van arra, hogy 1 + r = β1 = 0.99 kamat mellett hitelt vegyen fel, vagy betétet helyezzen a vagyonkezel˝onél. 1. Mekkora lesz a fogyasztás az 1. periódusban? 2. Mekkora lesz a foglalkoztatás a 2. periódusban? 3. Mekkora lesz a munkavállalók által realizált reálbér a 2. periódusban? 4. Mekkora lesz a kibocsátás a 3. periódusban? Megoldás A megoldandó problémára a két Euler-egyenlet így néz ki: 1 1 = β · (1 + r2 ) · C1 C2 1 1 = β · (1 + r3 ) · C2 C3
(Euler egyenlet 1. és 2. periódus között) (Euler egyenlet 2. és 3. periódus között)
Mivel teljesül, hogy r2 = r3 és az is hogy 1 + r = β1 , a két Euler-egyenlet így lesz egyszer˝usíthet˝o: 1 1 = C1 C2 1 1 = C2 C3
(Euler egyenlet 1. és 2. periódus között) (Euler egyenlet 2. és 3. periódus között)
Ez így rendezhet˝o nullára: 1 1 − C2 C1 1 1 0= − C3 C2
0=
(Euler egyenlet 1. és 2. periódus között) (Euler egyenlet 2. és 3. periódus között)
A vállalat inverz munkakereslete az egyes id˝oszakokban így fog kinézni: Y1 L1 Y2 w2 = α2 · L2 Y3 w3 = α3 · L3 w1 = α1 ·
(Inverz munkakereslet az 1. id˝oszakban) (Inverz munkakereslet a 2. id˝oszakban) (Inverz munkakereslet a 3. id˝oszakban)
Ez így rendezhet˝o nullára: Y1 − w1 L1 Y2 0 = α2 · − w2 L2 Y3 0 = α3 · − w3 L3
0 = α1 ·
(Inverz munkakereslet az 1. id˝oszakban) (Inverz munkakereslet a 2. id˝oszakban) (Inverz munkakereslet a 3. id˝oszakban)
130 A termelési függvények így írhatóak fel: Y1 = a1 · L1α1
(Termelési függvény az 1. id˝oszakban)
a2 · L2α2 a3 · L3α3
(Termelési függvény a 2. id˝oszakban)
Y2 = Y3 =
(Termelési függvény a 3. id˝oszakban)
Ez így rendezhet˝o nullára át: 0 = a1 · L1α1 −Y1
(Termelési függvény az 1. id˝oszakban)
a2 · L2α2 a3 · L3α3
−Y2
(Termelési függvény a 2. id˝oszakban)
−Y3
(Termelési függvény a 3. id˝oszakban)
0= 0=
A munkakínálat egy általános alakja: glt = uct · wt Ebben a három esetben ez így adódik: w1 C1 w2 0.82 12 · 1.82 · L2 = C2 w3 0.82 12 · 1.82 · L3 = C3 12 · 1.82 · L10.82 =
(Munkakínálat az 1. id˝oszakban) (Munkakínálat a 2. id˝oszakban) (Munkakínálat a 3. id˝oszakban)
Ez így rendezhet˝o nullára: w1 − 12 · 1.82 · L10.82 C1 w2 − 12 · 1.82 · L20.82 0= C2 w3 0= − 12 · 1.82 · L30.82 C3
0=
(Munkakínálat az 1. id˝oszakban) (Munkakínálat a 2. id˝oszakban) (Munkakínálat a 3. id˝oszakban)
Az intertemporális költségvetési korlátnak is állnia kell: C1 +
C3 Y2 Y3 C2 + = Y1 + + 1 + r2 (1 + r2 )(1 + r3 ) 1 + r2 (1 + r2 )(1 + r3 )
Ez nullára rendezve így néz ki: 0 = Y1 +
Y2 Y3 C2 C3 + −C1 − − 1 + r2 (1 + r2 )(1 + r3 ) 1 + r2 (1 + r2 )(1 + r3 )
A nullára rendezett megoldandó egyenletrendszer tehát: 1 1 − C2 C1 1 1 0= − C3 C2 Y1 0 = α1 · − w1 L1 Y2 0 = α2 · − w2 L2 Y3 0 = α3 · − w3 L3
0=
(Euler egyenlet 1. és 2. periódus között) (Euler egyenlet 2. és 3. periódus között) (Inverz munkakereslet az 1. id˝oszakban) (Inverz munkakereslet a 2. id˝oszakban) (Inverz munkakereslet a 3. id˝oszakban)
131 0 = a1 · L1α1 −Y1
(Termelési függvény az 1. id˝oszakban)
a2 · L2α2 a3 · L3α3 w1
−Y2
(Termelési függvény a 2. id˝oszakban)
−Y3
(Termelési függvény a 3. id˝oszakban)
0= 0=
− 12 · 1.82 · L10.82 (Munkakínálat az 1. C1 w2 − 12 · 1.82 · L20.82 (Munkakínálat a 2. 0= C2 w3 0= − 12 · 1.82 · L30.82 (Munkakínálat a 3. C3 Y2 Y3 C2 C3 0 = Y1 + + −C1 − − 1 + r2 (1 + r2 )(1 + r3 ) 1 + r2 (1 + r2 )(1 + r3 ) 0=
id˝oszakban) id˝oszakban) id˝oszakban) (Int. korlát)
Az endogén változóink: C1 ,C2 ,C3 ,Y1 ,Y2 ,Y3 , L1 , L2 , L3 , w1 , w2 , w3 Az ismert paramétereink: a1 , a2 , a3 , α1 , α2 , α3 Az ismert exogén változóink: r2 , r3 A problémához 12 egyenlet tartozik és 12 endogén változónk van, az egyenletrendszer a MatLab számára megadható. A változókat így definiálom:
A megoldandó m.file ekkor: 1 2 3 4 5 6 7 8 9 10 11 12 13
function fval=makro(x) C1=x(1); C2=x(2); C3=x(3); Y1=x(4); Y2=x(5); Y3=x(6); L1=x(7); L2=x(8); L3=x(9); w1=x(10); w2=x(11); w3=x(12);
x1 = C1
(Fogyasztás 1. id˝oszak)
x2 = C2
(Fogyasztás 2. id˝oszak)
x3 = C3
(Fogyasztás 3. id˝oszak)
x4 = Y1
(Jövedelem 1. id˝oszak)
x5 = Y2
(Jövedelem 2. id˝oszak)
x6 = Y3
(Jövedelem 3. id˝oszak)
x7 = L1
(Foglalkoztatás 1. id˝oszak)
x8 = L2
(Foglalkoztatás 2. id˝oszak)
x9 = L3
(Foglalkoztatás 3. id˝oszak)
x10 = w1
(Reálbér 1. id˝oszak)
x11 = w2
(Reálbér 2. id˝oszak)
x12 = w3
(Reálbér 3. id˝oszak)
132 1 2 3 4 5 6 7 8 9 10 11 12 13
fval(1)=1/C1−1/C2; % Euler1 fval(2)=1/C2−1/C3; % Euler2 fval(3)=0.74*(Y1/L1)−w1; % Munkakereslet 1 fval(4)=0.74*(Y2/L2)−w2; % Munkakereslet 2 fval(5)=0.74*(Y3/L3)−w3; % Munkakereslet 3 fval(6)=(0.2*L1^0.74)−Y1; % Termeles 1 fval(7)=(0.2*L2^0.74)−Y2; % Termeles 2 fval(8)=(1*L3^0.74)−Y3; % Termeles 3 fval(9)=(w1/C1)−12*1.82*L1^0.82; % Munkakinalat 1 fval(10)=(w2/C2)−12*1.82*L2^0.82; % Munkakinalat 2 fval(11)=(w3/C3)−12*1.82*L3^0.82; % Munkakinalat 3 fval(12)=C1+0.99*C2+(0.99^2)*C3−Y1−0.99*(Y2−(0.99^2))*Y3; % Int. end
A megoldáshoz szükséges kód: 1
[x,fval]=fsolve('makro',[10;10;10;10;10;10;10;10;10;10;10;10]);
Az iterációs folyamat végén az alábbi megoldás vektort kapjuk: x1 = C1 = 0.14098175
(Fogyasztás 1. id˝oszak)
x2 = C2 = 0.14098175
(Fogyasztás 2. id˝oszak)
x3 = C3 = 0.14098175
(Fogyasztás 3. id˝oszak)
x4 = Y1 = 0.02499484
(Jövedelem 1. id˝oszak)
x5 = Y2 = 0.02499484
(Jövedelem 2. id˝oszak)
x6 = Y3 = 0.37648216
(Jövedelem 3. id˝oszak)
x7 = L1 = 0.06018484
(Foglalkoztatás 1. id˝oszak)
x8 = L2 = 0.06018484
(Foglalkoztatás 2. id˝oszak)
x9 = L3 = 0.26710476
(Foglalkoztatás 3. id˝oszak)
x10 = w1 = 0.30732298
(Reálbér 1. id˝oszak)
x11 = w2 = 0.30732298
(Reálbér 2. id˝oszak)
x12 = w3 = 1.04302446
(Reálbér 3. id˝oszak)
16. feladat Egy fogyasztó három terméket fogyaszt: c1 , c2 és c3 . Hasznossági függvénye pedig: U(c1 , c2 , c3 ) =
c0.6 c0.4 c0.5 1 +β · 2 +β2 · 3 0.4 0.5 0.6
A rendelkezésre álló jövedelme 100 egység. Az els˝o termék ára 1, a másodiké 1,1, a harmadiké 1,21. 1. Tegyük fel, hogy β értéke 0.7 és 1 között változhat. Ábrázoljuk β függvényében közös grafikonon a három termék fogyasztását. 2. Tegyük fel, hogy β = 0.9 és a jövedelem értéke változtatható 100 és 200 között. Ábrázoljuk a jövedelem függvényében közös grafikonon a három termék fogyasztását. Megoldás, 1. rész Els˝o lépésben szükségünk van a parciális paraméteres deriváltakra: ∂U(c1 , c2 , c3 ) = c−0.6 1 ∂ c1 ∂U(c1 , c2 , c3 ) = β · c−0.5 2 ∂ c2 ∂U(c1 , c2 , c3 ) = β 2 · c−0.4 3 ∂ c3
133 Az egyensúlyi feltételekb˝ol három, az lesz, hogy a páronkénti MRS feltételek teljesülnek minden esetben: MRS(c1 , c2 ) =
c−0.6 p1 1 = −0.5 p β · c2 2
MRS(c2 , c3 ) =
β · c−0.5 p2 2 = −0.4 2 p3 β · c3
MRS(c1 , c3 ) =
c−0.6 p1 1 = −0.4 p3 β 2 · c3
Az egyenletek nullára rendezve megkapjuk azokat az állításokat, amelyeket a MATLAB meg tud oldani minden esetben: 0=
c−0.6 p1 1 − −0.5 p2 β · c2
0=
β · c−0.5 p2 2 − −0.4 p3 β 2 · c3
0=
c−0.6 p1 1 − −0.4 2 p3 β · c3
A negyedik egyensúlyi feltétel a jövedelem korlátra fog vonatkozni: m = c1 · p1 + c2 · p2 + c3 · p3 Ezt a korlátot is nullára kell rendezni: 0 = c1 · p1 + c2 · p2 + c3 · p3 − m Ebben a formában az egyenletrendszer a MATLAB számára formalizálható feltételezve, hogy az alábbi módon deklaráljuk a döntési változókat: c1 = x1 c2 = x2 c3 = x3 A függvény számára meg kell adni a kés˝obb paraméterezhet˝o β , ár (p1 , p2 és p3 és jövedelem (m) globális változókat is: 1 2 3 4 5 6 7 8 9 10 11 12 13 14
function fval=hasznos(x,beta,m,p1,p2,p3) global m; % Globalis jovedelem global beta; % Globalis beta global p1; % Globalis ar 1 global p2; % Globalis ar 2 global p3; % Globalis ar 3 C1=x(1); C2=x(2); C3=x(3); fval(1)=(C1^(−0.6))/(beta*C2^(−0.5))−(p1/p2); % MRS1 fval(2)=(beta*C2^(−0.5))/((beta^2)*C3^(−0.4))−(p2/p3); % MRS2 fval(3)=(C1^(−0.6))/(beta^2*C3^(−0.4))−(p1/p3); % MRS3 fval(4)=C1*p1+C2*p2+C3*p3−m; % Korlat end
134 Az így kapott egyenletrendszer megoldható abban az esetben, hogyha értéket adunk a jövedelemnek és megadjuk az árakat is: p1 = 1 p2 = 1.1 p3 = 1.21 m = 100 A kés˝obbiek során a költség együttható értéke az, amelyet változtatnunk kell a megoldás során: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
global m; % Globalis jovedelem kivulre global beta; % Globalis koltseg kivulre global p1;% Globalis ar kivulre global p2;% Globalis ar kivulre global p3;% Globalis ar kivulre m=100; % Jovedelem ertek p1=1; % Ar ertekadas p2=1.1; % Ar ertekadas p3=1.21; % Ar ertekadas for i=1:31 % Ciklus elinditasa beta=0.69+i/100; % Koltsegtenyezo ertekadasa [x,fval]=fsolve('hasznos',[10;10;10]); % Egyenletrendszer lehivasa c1(i)=x(1); % C1 ertek elmentese c2(i)=x(2); % C2 ertek elmentese c3(i)=x(3); % C3 ertek elmentese egyutthato(i)=beta; % Egyutthato lementese end
A kész vektorok ábrázolhatóak a β függvényében és az így kapott ábra feliratozható is: 1 2
plot(egyutthato,c1,egyutthato,c2,egyutthato,c3) % Rajz meghivasa legend('C_1 mennyiseg','C_2 mennyiseg','C_3 mennyiseg') % Feliratok
45
Mennyisegek
40 35 30 25 20 0.7 0.72 0.74 0.76 0.78 0.8 0.82 0.84 0.86 0.88 0.9 0.92 0.94 0.96 0.98 β Ábra 8.11: A 3 termékb˝ol fogyasztott mennyiség
1
135 Megoldás, 2. rész A küls˝o paraméterezhet˝oség miatt csak változtatható jövedelem mellett kell megoldani az egyenletrendszert, úgy hogy deklaráljuk a változók értékét: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
global m; % Globalis jovedelem kivulre global beta; % Globalis koltseg kivulre global p1;% Globalis ar kivulre global p2;% Globalis ar kivulre global p3;% Globalis ar kivulre beta=0.9; %Beta ertek p1=1; % Ar ertekadas p2=1.1; % Ar ertekadas p3=1.21; % Ar ertekadas for i=1:101 % Ciklus elinditasa m=99+i; % Jovedelem ertekadasa [x,fval]=fsolve('hasznos',[10;10;10]); % Egyenletrendszer lehivasa C1(i)=x(1); % Uj C1 ertek elmentese C2(i)=x(2); % Uj C2 ertek elmentese C3(i)=x(3); % Uj C3 ertek elmentese jovedelem(i)=m; % Jovedelem lementese end
A vektorok ábrázolhatóak a jövedelem függvényében, az így kapott ábra feliratozható: 1 2
plot(jovedelem,C1,jovedelem,C2,jovedelem,C3) % Rajz meghivasa legend('Uj C_1 mennyiseg','Uj C_2 mennyiseg','Uj C_3 mennyiseg')
80
Mennyisegek
70 60 50 40 30 20 100
110
120
130
140
150 β
160
170
Ábra 8.12: A 3 termékb˝ol fogyasztott mennyiség
180
190
200
136 17. feladat A Baumol-Tobin modellben legyen a kamatláb 9 százalék, a havi jövedelem 10000 egység, a banklátogatások költsége pedig N α egység, ahol α 1 és 2 közötti értékeket vesz fel. 1. Ábrázoljuk az optimális banklátogatások számát α függvényében. 2. Legyen most α = 1.5. Ábrázoljuk ekkor közös ábrán a következ˝o négy dolgot: a banklátogatás költségét, a kamat veszteséget, a két költség összegét, az optimális látogatási számot, és az ehhez tartozó költséget. A feladatrész A banklátogatások költsége az alábbi: C1 = N α A kamatveszteség költsége az alábbi: C2 =
Y ·r 2N
A teljes költsége ekkor az alábbi:
∑ C = C1 +C2 = N α +
Y ·r 2N
Ezt N szerint optimalizálva az alábbi kifejezést kapjuk: ∂ ∑C Y ·r = α · N α−1 − 2 ∂N 2N Ez lesz az optimum feltétel amit fel fogunk használni: 0 = α · N α−1 −
Y ·r 2N 2
Mivel nullára van rendezve, ezt már megadhatjuk a MATLAB számára kívülr˝ol paraméterezhet˝o α,Y és r értékkel függvényként, ahol x(1) jelöli az N értékét: 1 2 3 4 5 6
function fval=baumol(x,alpha,y,r) global alpha; % Globalis alpha global Y; % Globalis Y global r; % Globalis r fval(1)=alpha*x(1)^(alpha−1)−((Y*r)/(2*x(1)^2)); % Optimum feltetel end
A küls˝o paraméterezhet˝oség miatt csak változtatható α mellett kell megoldani az egyenletrendszert, úgy hogy deklaráljuk a változók értékét: 1 2 3 4 5 6 7 8 9 10 11
global alpha; % Globalis alpha kivulre global r; % Globalis kamat kivulre global Y;% Globalis jovedelem kivulre Y=10000; % Jovedelem megadasa r=0.09; % Kamatlab megadasa for i=1:101 % Ciklus elinditasa alpha=0.99+i/100; % Alpha ertekadasa [x,fval]=fsolve('baumol',[10]); % Egyenletrendszer lehivasa N(i)=x(1); % Uj N ertek elmentese kitevo(i)=alpha; % Jovedelem lementese end
A kész vektorok ábrázolhatóak a α függvényében és az így kapott ábra feliratozható is: 1 2
plot(kitevo,N) % Rajz meghivasa legend('Kivetelek szama') % Feliratok
137
Látogatás szám
20
15
10
1
1.1
1.2
1.3
1.4
1.5 α
1.6
1.7
1.8
1.9
2
Ábra 8.13: Az optimális látogatások száma Megoldás, 2. rész Els˝o lépésben megadjuk az exogén paramétereket: α = 1.5 Y = 10000 r = 0.09 Az exogén paramétereket megadva, az N vektort 1 és 100 között futtatva, megadható a kamatveszteség: ReturnLossi =
Y ·r 2Ni
Ilyen módon mindig megadható a banklátogatási költség is: BankCosti = Niα A két költség összegeként mindig megadható a teljes költség: TCi = ReturnLossi + BankCosti Ezek a lépéseket egy for ciklusba lehet szervezni, egymás után és 3 darab 100 elem˝u vektort lehet generálni, majd egy plotra fel lehet rajzolni az értékeket: 1 2 3 4 5 6 7 8 9 10 11
n=[1:100]; % N vektor generalasa r=0.09; % Kamat megadasa Y=10000; % Jovedelem erteke for i=1:100 lat(i)=n(i)^1.5; % Latogatasok szama kamat(i)=(Y*r)/(2*n(i)); % Kamatveszteseg teljes(i)=lat(i)+kamat(i); % Teljes koltseg end plot(n,lat,n,kamat,n,teljes); % Rajz keszitese hold on % Abra kimerevitese clear all
Következ˝o lépésben meg kell határozni az optimális látogatási számot, és ki kell számolni az ahhoz tartozó költség értékeket. Ehhez fel fogjuk használni a kívülr˝ol paraméterezhet˝o Baumol-Tobin függvényünket.
138 1 2 3 4 5 6 7 8 9 10 11 12 13
global alpha; % Globalis alpha kivulre global r; % Globalis kamat kivulre global Y;% Globalis jovedelem kivulre Y=10000; % Jovedelem megadasa r=0.09; % Kamatlab megadasa alpha=1.5; % Alpha deklarasa [x,fval]=fsolve('baumol',[10]); % Egyenletrendszer lehivasa N=x(1); % Optimalis N ertek elmentese optlat=N^1.5; %Optimalis latogatasi koltseg optkamat=(Y*r)/(2*N);%Optimalis kamatkoltseg optteljes=optlat+optkamat; % Teljes koltseg plot(N,optteljes,'o') % Optimum abrazolasa legend('L.koltseg','K. veszteseg', 'Teljes koltseg','Optimum')
1,000
A költségek
800
600
400
200
0 0
10
20
30
40
50 N
Ábra 8.14: A költségek
60
70
80
90
100
9 — Lineáris programozás
10 — Diszkretizáció