Function-ok a MATLAB-ban Előző óra 4. Feladata. Amikor mi egy function-t írunk, akkor azt eltárolhatjuk egy.m fileban. Ebben az esetben ha egy másik programunkból szeretnénk meghívni ezt a függvényt (pl az iranysorsolas-t), akkor a megfelelő.m filenak ott kell lennie ugyanabban a mappában. (Ez a beépített függvényeknél nincs így, csak azoknál amiket mi írunk) De nem mindenképpen kell külön.m file-t létrehozni. Ha pl egy függvényt csak egy adott programon belül szeretnénk használni, akkor a program.m file-jába is tehetjük. Viszont ekkor maga a programot adó function végére is kell -et írnunk. Ez az után beírhatjuk a függvényünket, ugyanúgy, mintha egy külön.m file-ba írnánk. Majd ennek a végére is kell egy. End-et azért kell tenni, hogy a fordító tudja, hogy hol ér véget az adott függvény. Lehet tenni akkor is -et, ha csak egy függvény van egy.m file-ban. Hogyan oldjunk meg MATLAB-ban diffegyenletet? A MATLAB a diffegyenletet numerikusan oldja meg. Erre több matematikai módszer is létezik. Azt, hogy melyiket célszerű használni, a probléma határozza meg. Mivel mi jelen esetben nem a diffegyenletek numerikus megoldásának matematikájával foglalkozunk, így ezekkel nem foglalkozunk. A MATLAB helpje tartalmaz egy részt arról, hogy szerintük milyen esetben melyik megoldási módszert válasszuk. Lényegében az összes megoldási módszer esetén programozástechnikailag ugyanúgy kell eljárni. Példákban a Runge-Kutta módszert alkalmazó eljárást fogjuk használni. A differenciálegyenlet megoldás egy ugyanolyan beépített függvénnyel működik, mint amikor egy mátrix elemei között a minimumot keressük. A különbség az, hogy a differenciál egyenletet nem tudjuk úgy megadni a beépített függvénynek, mint egy mátrixot a min függvénynek. A megoldandó differenciál egyenletet meg kell írnunk egy függvényben, és azt a függvényt kell a megoldó-függvénynek odaadni. Ettől függetlenül a diffegyenlet-megoldó beépített függvény (solver) meghívása ugyanúgy működik, mint bármelyik másik beépített függvény: [t,y] = solver(odefun,tspan,y0,options) Bemenet: odefun tspan y0 options Annak a function-nak a neve, amiben letároltuk az egyenletünket. Az integrálás határait megadó vektor. Magyarul, az x értelmezési tartomány ahol meg szeretnénk kapni a megoldást. Ha azt szeretnénk, hogy egy adott értéknél mindenképpen legyen számított pontunk, akkor [alsóhatár köztespont felsőhatár] A kezdeti feltételek vektora. Plusz opciókat is készíthetünk a solver számára az odeset függvény segítségével. Kimenet: t A megoldás-függvény argumentumát leíró vektor. y A megoldás-függvény. Minden pontja T egy elemében számolódik ki. 1
Solver: a diffegyenlet megoldására való matlab beépített függvény neve. Lehet: ode45, ode23, ode113, ode15s, ode23s, ode23t, ode23tb, stb. Odefun megadása: kétféleképpen lehet. Én így szoktam: @(t,y) függvényneve(t, y, egyéb inputparaméterek) Ez azt jelenti, hogy t és y értékeket igazából mi nem definiálunk. A megoldás során a megoldóalgoritmus eldönti, hogy milyen t értékek mellett fogja megoldani, és a megoldás értékeket (a függvényértéket) y-ba teszi. Ezért tesszük előre a @(t,y)-t, mert ők úgymond változók a függvény számára. A függvény neve utáni ()-be kerülnek a bemeneti értékek. Itt meg kell adni a t és y t is, aminek itt még nincs értéke, valójában nincsenek is ilyen változóink a programunkban. Azért kell mégis megadni, mert a solver egy eljárást többször hív meg, így kell neki a változó-érték is. A diffegyenletnek lehetnek paraméterei is, pl radioaktív bomlásnál a felezési idő, stb Végeredményben a differenciál-egyenlet megoldásához két dolgot kell csinálnunk: Megírni a diffegyenletet megadó függvényt (odefun). Majd ezt egy programban meg kell oldanunk (kezdetiértékek, paraméterek megadása; odexx meghívása) 1.1 Példa: Oldjuk meg a radioaktív bomlás alapegyenletét a következő bomlásra: Maga a diffegyenlet: () = (), ahol = A bomló izotóp legyen a 95 Zr, ennek felezési ideje 64.02 nap. Kezdetben 10 20 atommag van. A megoldás időtartománya: t=0..2év. Az eredményt ábrázoljuk is. function bomlas1() %% alapadatok T12 = 64.02*24*3600; % 64.02 nap -> s lambda = log(2)t12; % lambda = ln(2)t12 N0 = 1e20; % t = 0-ban a magok száma - kezdetiérték tspan = [0 2*365*24*3600]; % időtartomány, amin meg szeretnénk oldani %%megoldás [t, N] = ode45(@(t,n) bomlas(t, N, lambda), tspan, N0); %%ábrázolás plot(t,n) title('radioaktív bomlás') xlabel('idő (s)') ylabel('magok száma (db)') leg({'^9^5zr'}) %% a diffegyenletet leíró függvényünk function dn = bomlas(t, N, lambda) dn = -lambda*n; 1.2 Példa: az 1.1 példa bonyolítása: A 95 Zr leányeleme a 95 Nb, ami szintén radioaktív. Így egy diffegyenlet-rszert kapunk: () = () 2
() = () () A szükséges paraméterek: 95 Zr felezési ideje: 64.02 nap, kezdetben 10 20 db atommag. 95 Nb felezési ideje: 34.991 nap, kezdetben 0 db atommag. A megoldás időtartománya: t=0..400 nap. Az eredményt ábrázoljuk is. Itt a megoldás során vektorokba tesszük a paramétereket. A kimeneti N függvényértékünk-nek is két oszlopában lesz a két izotóp atommagjainak száma. function bomlas2() %% alapadatok %Zr-95 adatai T12(1) = 64.02*24*3600; % 64.02 nap -> s N0(1) = 1e20; % t = 0-ban a magok száma - kezdetiérték % Nb-95 adatai T12(2) = 34.991*24*3600; % 34.991 nap -> s N0(2) = 0; % t = 0-ban a magok száma - kezdetiérték lambda = log(2).t12; % lambda = ln(2)t12 tspan = [0 400*24*3600]; % időtartomány, amin meg szeretnénk oldani %% diffegy megoldása [t, N] = ode45(@(t,n) bomlas(t, N, lambda), tspan, N0); %% ábrázolás plot(t,n) title('radioaktív bomlás') xlabel('idő (s)') ylabel('magok száma (db)') leg({'^9^5zr', '^9^5Nb'}) %% a diffegyenletet leíró függvényünk function dn = bomlas(t, N, lambda) dn = zeros(2,1); % hogy oszlopvektor legyen dn(1) = -lambda(1)*n(1); dn(2) = lambda(1)*n(1) - lambda(2)*n(2); Ha egy paraméter valamilyen függvény szerint változik, akkor a paraméter értékét az odefun (diffegyenletet leíró függvényben) kell kiszámolni. Ez kétféleképp lehetséges, attól függően, hogy milyen módon áll relkezésünkre a paraméter: 1. Ha a paraméter egy függvény szerint változik (pl A=x^b+c), akkor az odefun paramétereibe a b és c paramétereket írjuk: function dy = fuggveny(x, y, b, c) A = x^b+c; % az adott x értékhez a parameter számítása dy = -A*x; 2. Ha a paraméter értékei diszkrét változóértékekre állnak relkezésre egy (2*N-es) mátrixban akkor az odefun paramétereibe a mátrixot adjuk meg: function dy = fuggveny(x, y, A) Ai = interp1q(a(:,1), A(:,2), x);% az adott x értékhez a parameter számítása dy = -Ai*x; 3
Feladatok 1. Oldjuk meg a gamma-sugárzás anyagban való gyengülését leíró differenciálegyenletét a következő feltételek mellett: Maga a diffegyenlet: () = () A gammasugárzás érkezzen egy 137 Cs forrásból, = 1e5 foton másodpercenként. Az anyag legyen alumínium, melyre a lineáris gyengítési együttható = 0.2 1"#. Az x = 0..10cm tartományon oldjuk meg, és az eredményt ábrázoljuk is. 2. Az előző feladatban ne csak egy anyag legyen, hanem két különböző anyag legyen egymás mellett. Mit kell ilyenkor módosítani? 1. anyag: 5cm víz ( = 0.087 1"#) 2. anyag: 2cm ólom ( = 1.2 1"#) Az x = 0..7cm tartományon oldjuk meg, és az eredményt ábrázoljuk is. 3. Lotka-Volterra modell: Rókák és nyuszik A természetben egymás mellett élő populációk hatással lehetnek egymásra. Az egyik leghíresebb ilyen kapcsolatot leíró modell a Lotka-Volterra modell, mely a ragadozók (r) és a zsákmányaik (zs) egyedszáma közötti kapcsolatot írja le az alábbiak szerint: &'() *() = ( &'() ) &'() *() = " *() + &'() *() Oldjuk meg és ábrázoljuk az egyenletrszer megoldását t=[0 200] intervallumon, ha ( = 0.15, ) = 0.01, " = 0.4 és = 0.02. Kezdetben 80 nyuszi és 40 róka van. 4. Pontkinetikai egyenletrszer Egy adott reaktivitás esetén megadja a reaktorban lévő neutronfluxus időbeni értékét. Ez egy nagyon egyszerű közelítés a reaktorban lévő neutronok kiszámítására. Nem veszi figyelembe a hosszú időskálán való változásokat. Viszont figyelembe veszi, hogy a reaktorban vannak promptés későneutronok. A későneutronokat hat csoportra osztva veszi fegyelembe, az alapján, hogy az anyamag milyen felezési idővel relkezik. Azaz a hasadás után mennyi idő múlva jelenik meg. Az egyenletrszerben szereplő paraméterek magyarázata: -() időfüggő neutronfluxus (neutronsűrűség) Λ generációs idő. A prompt-neutronok élettartama. Arra jellemző, hogy a keletkező promptneutronok mennyi idő alatt eredményeznek újabb hasadást. a reaktivitás. = 0 1223 0 122, értékétől függően a reaktor lehet: < 0 Szubkritikus = 0 Kritikus > 0 Szuperkritikus (vagy promptszuperkritikus ) 6 a későenutron-hányad. 235 U-ra 0.65% 6 7 az egyes későneutron csoportok hányada. (ezek összege lesz a későneutron-hányad) 4
7 az egyes későneutron-csoportokhoz relt bomlási állandó ( = : 7 az egyes későneutron anyamagok száma. ; neutronforrás (dbs) A szükséges adatok: Λ = 25μs 6 = 0.65% Későneutron anyamagok: -() = 6 Λ : 7 () Csoport C (') 6 7 ( 10 3E ) 1 55,7 21 2 22,7 142 3 6,2 128 4 2,3 257 5 0,615 75 6 0,23 27 = -() + < 7 : 7 () + ;() = -() Λ 7> 6 7 7 : 7 () 89 () ) ; = 32G3 )' 6 = 0.2$ Kezdetben legyen 0 db neutron a rszerben. Milyen állapotban van a rszer? Mit jelent az eredmény? Hogyan lehet megváltoztatni ezt az állapotot? 5