KTE / PPEL Počítačová podpora v elektrotechnice 22.12.2010 Ing. Lenka Šroubová, Ph.D. email: lsroubov@kte.zcu.cz http://home.zcu.cz/~lsroubov Příklad: Obvod RLC v sérii R=200 Ω L=0,5 H C=5. 10-6 F U 0 =100 V V čase t = 0s je připojen konstantní zdroj stejnosměrného napětí. Řeše pomocí výpočetních systémů - viz minulá přednáška, http://edison.fel.zcu.cz a http://portal.zcu.cz, příp. http://home.zcu.cz/~lsroubov/ppel - diferenciální rovnice 1. řádu v m-file RLCobvod.m a její řešení v m-file RLC_reseni.m
A stejný obvod vyřešíme v LTSpice
140V V(N001,N002) V(N002,N003) V(n003) 120V 100V 80V 60V 40V 20V 0V -20V -40V -60V 210mA I(R) 180mA 150mA 120mA 90mA 60mA 30mA 0mA -30mA -60mA -90mA 0ms 2ms 4ms 6ms 8ms 10ms 12ms 14ms 16ms 18ms 20ms 22ms 24ms 26ms 28ms 30ms
Příklad: Van der Poolova rovnice diferenciální rovnice 2. řádu d 2 dt y 1 2 µ dy 2 ( 1 y ) 1 + y 1 1 dt = 0 Převedeme na soustavu dvou rovnic prvního řádu: substitucí dodáme proměnnou y 2 dy = dt 1 y2 a dosadíme: dy dt 2 2 = a upravíme: dy dt µ ( 1 y1 ) y2 + y1 2 2 = µ 1 y1 ) ( y y 2 A mám soustavu rovnic, na levé straně derivace 1. řádu na pravé zbytek: dy 1 = y2 dt dy2 2 = µ ( 1 y1 ) y2 y dt 1 1 0
m-file: function dy=fce_vdp(t,y) mi=1; dy=[y(2);mi*(1-y(1)^2)*y(2)-y(1)]; %pozor sloupec Nebo totéž jinak: function dy=fce_vdp(t,y) mi=1; dy(1,1)= y(2); dy(2,1)= mi*(1-y(1)^2)*y(2)-y(1); Nebo totéž (asi nejlépe) takto: function dy=fce_vdp(t,y) mi=1; dy = zeros(2,1); dy(1)= y(2); dy(2)= mi*(1-y(1)^2)*y(2)-y(1); A vlastí výpočet a vykreslení grafu pro t od 0 do 20 a počáteční podmínky y 1 (0) = 2 a y 2 (0) = 0 (hodnoty y 1 a y 2 v čase t=0): [t,y] = ode45(@fce_vdp, [0, 20], [2, 0]); plot(t,y(:,1)) hold on plot(t,y(:,2), '--r') hold off
Řízení vzhledu textů v grafech příkazy LaTeXu dolní index t 1 se zapíše t_1 horní index t 2 se zapíše t^2 - má-li platit příkaz pro více znaků použijeme {} např. x_{23} vytiskne x 23 - speciální symboly (např. řecká písmena atp.) - \alpha, \beta atp. viz nápověda MATLABu pod heslem Text Properties tabulka ke konci. (platí pro MATLAB) - často užívané značky (platí pro MATLAB): \bf tučné písmo \it italika, kurzíva \sl -- Oblique font (rarely available) \rm normální font (tj. návrat k výchozímu fontu ruší příkazy \it, \bf atd.) 'FontName','jmeno_fontu' nastavení jiného fontu 'FontSize',velikost_fontu změna velikosti fontu Příklad: function sincos figure
x = 0:pi/50:2*pi; ys = sin(x); yc = cos(x); plot(x,ys) hold on plot(x,yc,'r') legend1 = legend({'y_{sin} = sin(x)','y_{cos} = cos(x)'},... 'FontAngle','italic',... 'FontName','Arial kurzíva',... 'FontSize',14,... 'FontWeight','bold'); xlabel('osa x') ylabel('osa y') title('graf \itsin(\alpha)\rm a cos(\beta)','fontname','times New Roman', 'FontSize',30) Tloušťka čáry: plot(x, y, 'LineWidth', 5); Nastavení na červenou barvu, značka trojúhelník vrcholem doprava, tloušťka čáry 3, velikost značky 16, barva vnitřku značky na červenou 'r', barva okraje značky na purpurová 'm':
plot(a, b, 'r>', 'LineWidth', 5, 'MarkerSize', 16, 'MarkerFaceColor', 'r', 'MarkerEdgeColor', 'm'); Ukládání proměnných na disk platí pro MATLAB save nazev uloží všechny proměnné ve Workspace MATLABu na disk do souboru nazev.mat load nazev nahraje proměnné zpet do paměti load moje_prace AHOJ nahraje ze souboru moje_prace do paměti proměnnou AHOJ load moje_prace A* nahraje ze souboru do paměti proměnné začínající od písmene A Např.: save prom_a A - je uložena proměnná A (samotinkou) do souboru prom_a.mat save prom_a append - append říká, že nemá děla nový soubor, ale připojit další data na konec již existujícího
Nahrání zpět do paměti: load prom_a save vypis.txt -ascii - uloženo do txt souboru v ASCII kódu save vypis.txt -ascii -tabs - uloženo do txt souboru, sloupce oddělí tabelátorem Vsuvka: Symbolická derivace (nutný Symbolic Math Toolbox) vysledek = diff('sin(x^2)*cos(x-sin(x))') vysledek = 2*cos(x^2)*x*cos(x-sin(x))-sin(x^2)*sin(x-sin(x))*(1-cos(x)) >> pretty(vysledek) 2 2 2 cos(x ) x cos(x - sin(x)) - sin(x ) sin(x - sin(x)) (1 - cos(x)) >> latex(vysledek) 2\,\cos \left( {x}^{2} \right) x\cos \left( x-\sin \left( x \right) \right) -\sin \left( {x}^{2} \right) \sin \left( x-\sin \left( x \right) \right) \left( 1-\cos \left( x \right) \right) vysledek*vysledek ans = (2*cos(x^2)*x*cos(x-sin(x))-sin(x^2)*sin(xsin(x))*(1-cos(x)))^2 linsolve řešení lin. rovnic (numericky) solve řešení rovnic (symbolic)
dsolve řešení diferenciálních rovnic (symbolic) syms x y z vytvoří 3 symbolické proměnné x, y a z proměnné pro alg. výpočty int - integrál simplify(vysledek) zjednodušení výrazu (vytýkání atp.) simple(vysledek) zkusí všechny možné cesty ke zkrácení výrazu vysledek, včetně simplify a dalších
Řešení diferenciálních rovnic ve starších verzích programu Octave používá Hindmarshův ODE řešič LSODE. Funkce: lsode('jmenofunkce', x0, t, t_crit) vrací matici řešení x parametry: vektor osy t počáteční podmínky řešeného systému x0 parametr t_crit je volitelný slouží k ošetření časů (hodntot t) kde se projevují singularity a nespojitosti v derivacích. Příklad: function dx = nasefunkce(x, t) dx = zeros (3,1); dx(1) = 77.27 * (x(2) - x(1)*x(2) + x(1) \ - 8.375e-06*x(1)^2); dx(2) = (x(3) - x(1)*x(2) - x(2)) / 77.27; dx(3) = 0.161*(x(1) - x(3)); endfunction Počáteční podmínky: x0 = [4; 1.1; 4] t = linspace (0, 500, 1000); y = lsode ('nasefunkce', x0, t); Při řešení této úlohy zjistíme, že průběh výsledné funkce se dramaticky mění v rozmezí t = 0 až 5, a také kolem hodnoty t = 305.
Proto provedeme výpočet znovu pro hodnoty t upravené v těchto zajímavých oblastech: t = [0, logspace (-1, log10(303), 150), \ logspace (log10(304), log10(500), 150)]; y = lsode ('nasefunkce', x0, t); Další nastavení řešiče lsode je možné pomocí funkce: lsode_options(volby, hodnoty) Pozn. Funkce ODE v systému Octave Pokud nechcete v Octave používat funkci lsode (standardne v Octavu), lze doinstalovat do Octave přídavný balíček "octave-odepkg" Na edisonu je naistalován, takže tam ODE funkce fungují ála Matlab. Pokud provozujete Octave na lokálním počítači, postup je následující: 1) Stáhnout balíček odepkg-cislo_verze zde: http://sourceforge.net/projects/octave/files/octave%20forge%20packages/individual%20package%20rele ases/odepkg-0.6.10.tar.gz/download 2) Balíček např. "odepkg-0.6.10.tar.gz" uložit někam na disk, třeba do D:\balicek 3) Pustit Octave (je to jedno jestli samostatný nebo s nadstavbou QtOctave apod.) 4) V Octave spustit příkaz: pkg install D:\balicek\odepkg-0.6.10.tar.gz Počkat chvíli (může to být i pár minut) 5) A můžete začít používat ode45 a další "ODEčka". Stačí se přesvědčit zadáním "help ODE45"