MATLAB 8. gyakorlat Differenciálegyenletek
Menetrend Kis ZH Differenciálegyenletek általában Elsőrendű differenciálegyenletek Másodrendű differenciálegyenletek
Kis ZH pdf
Differenciálegyenletek Diffegyenlet: Olyan egyenlet, amelyben az ismeretlen egy függvény, és szerepel benne ennek az ismeretlen függvénynek valamely deriváltja is. A diffegyenlet rendje: az ismeretlen függvény legmagasabb fokú deriváltjának fokszáma (első és másodrendűről lesz szó). MATLAB-ban a diffegyenletek megoldása numerikus integrálással történik.
Differenciálegyenletek Praktikusan: amire kiváncsi vagyok: egy függvény ( f(t) ) ami a rendelkezésemre áll: a függvény valamilyen deriváltját tartalmazó függvény ( f'(t) = g(f(t),t) )
Szemléletesen Tegyük fel, hogy egy hegyi úton sétálunk, és az aktuális magasságunk az előrehaladás közben változik. A magasságunkat felírhatjuk pl. az idő, a hosszúsági és szélességi kör vagy a megtett út függvényében is. A megtett út függvényében a magasságra a következő összefüggés írható fel: y = y(x), ahol x az út, y pedig a magasság.
Szemléletesen Ha van nálunk magasságmérő vagy GPS vevő, az előrehaladás közben elegendő ponton felírva az aktuális magasságértékeket megkapjuk az y = y(x) összefüggés értékeit (pl. a lenti ábra szerint).
Szemléletesen Ez egyszerű megoldás lenne, de tegyük fel, hogy nincs nálunk megfelelő mérőeszköz. Látunk viszont egy táblát, ami 5%-os emelkedőt mutat. Ekkor a tábla megfelelően kicsi környezetében egy tetszőleges x-re és h = 100-ra az alábbi összefüggés írható fel: y ( x +h) y ( x) =0.05 h ahol az összefüggés bal oldala az út meredeksége x és x+h között.
Szemléletesen Tegyük fel, hogy az út mentén pár méterenként találunk egy ilyen táblát, melyek a magasság változásának közelítő értékeit adják meg a megtett út függvényében. Ha ezeket az értékeket felírjuk, megkapjuk a dy/dx összefüggést, ami y deriváltja lesz.
Szemléletesen Az így kapott görbét numerikusan integrálva megkapjuk y = y(x) értékeit. dx
Példa 1. - ode1 Legyen adott a következő elsőrendű diffegyenlet: y'(t) = 2y(t). Adjuk meg y(t) értékeit a t = [0,3] intervallumon, y(0) = 1 kezdeti érték esetén!
Példa 1. - ode1 Ehhez definiáljuk a diffegyenletet egy függvényként, amelynek 2 bemenő paramétere t és y. A diffegyenlet egyszerűsége miatt itt most anonim függvényt használjunk: F = @(t,y) 2*y; F a deriváltfüggvény értékeit tartalmazza, a t paraméter a beépített megoldók miatt (ode45, ode23, ode15) kell.
Példa 1. - ode1 Írjunk egy saját diffegyenlet megoldó eljárást (ode1), amely az Euler módszert alkalmazva, F numerikus integrálásával kiszámolja y(t) értékeit a fent megadott intervallumon és kezdeti értékkel! Az integrálás lépésközét (intervallum hossza)/200-nak válasszuk meg! FONTOS: a saját megoldó csak szemléltetési célt szolgál, a későbbi feladatok megoldásakor mindig a beépített ode45 megoldót használjuk!
Megoldás 1. - ode1 function [t_out,y_out] = ode1(f,tspan,y0) % Egyszerű diffegyenlet megoldó. % Csak szemléltetési célt szolgál, % ne használjuk, mert pontatlan. % időskála kezdete t0 = tspan(1); % időskála vége tfinal = tspan(end); % lépésköz h = (tfinal - t0)/200; % kezdeti feltétel y = y0; for t = t0:h:tfinal % a derivált aktuális % értéke ydot = F(t,y); % numerikus integrálás y = y + h*ydot; % értékek tárolása a % kimeneten t_out(ind) = t; y_out(ind) = y; ind = ind + 1; % kimeneti vektorok t_out = zeros(201,1); y_out = zeros(201,length(y0)); ind = 1; end end
Megoldás 1. - ode1 Hívjuk meg a függvényt és rajzoljuk ki az eredményt! % függvény definíció F = @(t,y) 2*y; % megoldás [t1,y1] = ode1(f,[0 3],1); % rajzoljuk ki figure(1); hold on; plot(t1,y1,'r-');
Megoldás 1. - ode1 Nézzük meg ugyanezt a beépített ode45 megoldó használatával is! % beépített megoldó eljárás [t45,y45] = ode45(f,[0 3],1); % rajzoljuk ki plot(t45,y45,'bo-'); Analízisből ismert, hogy az y'(t) = 2y(t) diffegyenlet megoldása y(t) = e2t, ezért ellenőrzésként rajzoljuk ki ezt is! plot(t45,exp(2*t45),'k--','linewidth',2);
Megoldás 1. - ode1
Konklúzió 1. - ode1 A beépített ode45 megoldó nem lineárisan osztja el a "mintavételi" időpontokat (ezért kell a t paraméter a deriváltfüggvény megadásánál). A lépésköz meghatározása minden esetben egy előre meghatározott pontosság elérése érdekében történik. A legtöbb problémára az ode45 a legjobb választás, ezért ezt fogjuk használni.
Elsőrendő, egyváltozós DE Vegyünk egy egyszerű töltőáramkört az alábbi ábra alapján: ahol V0 = 2 V, R = 1 kohm, C = 500 uf és tudjuk, hogy τ = RC (időállandó). t = 0-ban a kapacitáson nincs töltés és a kapcsoló nyitva van
Elsőrendő, egyváltozós DE A kapcsoló bekapcsolásakor a kapacitáson átfolyó áram alakulása az alábbi diffegyenlettel írható le, (V0/R kezdeti értékkel): 1 i ' (t )= τ i Analitikus alakban pedig az alábbi képlettel adható meg: V 0 τt i (t )= e R
Példa 2. - 1.R, 1V DE Számítsuk ki és ábrázoljuk a fent leírt áramkörben a kapacitás áramának időbeli változását!
Megoldás 2. - 1.R, 1V DE V0 = 2; % V R = 1E3; % Ohm C = 5E-4; % F tau = R*C; % ODE megadása anonim fv.-ként F = @(t,y) -1/tau*y; % megoldás a [0 1] intervallumon, % V0/R kezdeti értékre [t_rc y_rc] = ode45(f,[0 1],V0/R); figure(2); plot(t_rc,y_rc,'linewidth',2); % analitikus megoldás t=0:0.001:1; I=V0/R*exp(-t/tau); hold on; plot(t,i,'r--','linewidth',2); title('kondenzator kisulese'); xlabel('t'); ylabel('i(t) [A]'); legend('ode45','analitikus');
Megoldás 2. - 1.R, 1V DE
Példa 3. - 1.R, 2V DE Egy kémiai reakció során két anyagot vegyítünk (A és B), melyek kocentráció változását az alábbi differenciálegyenlet rendszer írja le: ( da = 10A +50B dt db =10A 50B dt ) Adjuk meg A és B koncentrációját a [0 0.5] intervallumon, A(0) = 0 és B(0) = 1 esetén!
Megoldás 3. - 1.R, 2V DE function dydt = chem(t,y) % y - állapotváltozó dydt = zeros(2,1); % da/dt dydt(1) = -10*y(1) + 50*y(2); % db/dt % az ODE megadása külön fv.-ben dydt(2) = 10*y(1) - 50*y(2); % (chem.m) történt end [t y] = ode45('chem',[0 0.5], [0 1]); % VAGY: % [t y] = ode45(@chem,[0 0.5], [0 1]); figure(3); hold on; plot(t,y(:,1),'k','linewidth',2); plot(t,y(:,2),'r','linewidth',2); title('kémiai reakció'); xlabel('t'); ylabel('koncentráció'); legend('a','b');
Megoldás 3. - 1.R, 2V DE
Példa 4. - 1.R, 2V DE Vizsgáljuk meg egy, két állatfajt tartalmazó területen a ragadozó-zsákmány egyedszám viszonyt leíró differenciálegyenlet rendszert (Lotka-Volterra modell)! ( dy 1 y2 = 1 μ y 1 2 dt dy 2 y1 = 1 μ y 2 1 dt ( ) ( ) ) y1: zsákmány egyedszám, y2: ragadozó egyedszám, µ 1: zsákmányok környezeti eltartóképessége, µ 2: ragadozók környezeti eltartóképessége
Példa 4. - 1.R, 2V DE Oldjuk meg a fenti DER-t az alábbi adatok birtokában: µ 1 = 200, µ 2 = 300 y1(0) = 100, y2(0) = 150 t = [0 20]
Megoldás 4. - 1.R, 2V DE % környezeti kapacitások % (eltartóképesség) mu1 = 200; % zsákmány mu2 = 300; % ragadozó % a rendszert leíró diffegyenletrendszer PredPrey = @(t,y) [(1-y(2)/mu2)*y(1); -(1-y(1)/mu1)*y(2)]; % kezdeti értékek y0 = [100; % zsákmány 150]; % ragadozó % kirajzolás figure(4); subplot(211); plot(t_pp,y_pp,'linewidth',2); title('predator-prey Model'); xlabel('t'); ylabel('egyedszám'); legend('zsákmány','ragadozó'); % megoldás [t_pp y_pp] = ode45(predprey,[0 20],y0); % fazisgörbe subplot(212); plot(y_pp(:,1),y_pp(:,2)); title('fázisgörbe'); xlabel('zsakmany #'); ylabel('ragadozo #');
Megoldás 4. - 1.R, 2V DE
Másodrendű DE - rezgőmozgás Rezgőmozgás során az erők egyensúlyát az alábbi összefüggés adja meg: mx ' ' + Dx +Cx ' = F ahol m a test tömege, D a rugóállandó, C a csillapítási tényező, x pedig a test kitérése.
Másodrendű DE - rezgőmozgás Az állapotvektor [x1;x2] legyen: x1 = x (kitérés) x2 = x' (sebesség) Ekkor a másodrendű egyenlet két elsőrendűvel megoldható.
Másodrendű DE - rezgőmozgás Paraméterek: külső erő (F) lehet pl. a gravitációs erő ha a csillapítási tényező (C) 0, a rezgőmozgás harmonikus lesz a tömeg (m) és a rugóállandó (D) a rezgés frekvenciáját és a test sebességét határozzák meg csillapított rezgés esetén (C>0) a nyugalmi kitérés s = F/D lesz
Példa 5. - 2.R DE Számítsuk ki az alábbi paraméterekkel rendelkező rendszer rezgőmozgásának időbeli lefutását a t = [0 100] intervallumon: m = 1 kg (= Ns^2/m) D = 10 N/m C = 0.2 Ns/m F = -10 N Ábrázoljuk a rugóra rögzített test kitérésének és sebességének időbeli változását!
Megoldás 5. - 2.R DE mx ' ' + Dx +Cx ' = F function xdot=myspring(t,x,m,d,c,f) % az állapotvektor x=[x1;x2] alakú, % ahol x1=pozíció, x2=sebesség xdot = zeros(2,1); xdot(1,1)=x(2); % x2dot = x'' xdot(2,1)=-d/m*x(1)-c/m*x(2)+f/m; end
Megoldás 5. - 2.R DE % tömeg m = 1; % kg == (Ns^2)/m % rugóállandó D = 10; % N/m % csillapítási tényező C=0.2; % (Ns)/m % külső erő F=-10; % N % időablak tspan=[0 100]; % kezdeti feltételek ([kitérés;sebesség]) x0=[1;0]; % ODE megoldása [t x] = ode45(@(t,x) myspring(t,x,m,d,c,f),tspan,x0);
Megoldás 5. - 2.R DE % tömeg m = 1; % kg == (Ns^2)/m % rugóállandó D = 10; % N/m % csillapítási tényező C=0.2; % (Ns)/m % külső erő F=-10; % N % időablak tspan=[0 100]; % kirajzolás figure(5); clf hold on; plot(t,x(:,1),'b'); plot(t,x(:,2),'r'); title('rezgőmozgás'); xlabel('t (s)'); ylabel('érték'); legend('pozíció (m)','sebesség (m/s)'); % kezdeti feltételek ([kitérés;sebesség]) x0=[1;0]; % ODE megoldása [t x] = ode45(@(t,x) myspring(t,x,m,d,c,f),tspan,x0);
Megoldás 5. - 2.R DE