Řešení diferenciálních rovnic v MATLABu Základy algoritmizace a programování Přednáška 23. listopadu 2011
Co řešíme Obyčejné diferenciální rovnice prvního řádu: separovatelné lineární exaktní druhého řádu, lineární: s konstantními koeficienty s proměnnými koeficienty soustavy lineární: X = AX + B nelineární
Obyčejné diferenciální rovnice Řešení Cauchyovy úlohy y = f (t, y(t)), y(t 0 ) = t 0, kde t je skalár, y(t) neznámý vektor hodnot, f (t, y) zadaná funkce (resp. vektor hodnot).
Řešení v symbolických proměnných Obyčejná diferenciální rovnice 1. řádu, např. y + y x = 1 x + 3 y( 2) = 4 1 rovnici upravíme na tvar : y = f (x, y). 2 help dsolve 3 funkce dsolve( Dy =f(x), y(x0)=y0, x ) y=dsolve( Dy=1/(x+3)-y/x, y(-2)=4, x ) y je výraz, který odpovídá řešení rovnice a do kterého lze dosadit, např. vektor hodnot 4 zobrazení přesného řešení xx=-2:0.1:-0.1; yy=subs(y,xx); plot(xx,yy) nebo ezplot(y)
v matlabu y = (x - 3*log(x + 3))/x - 6/x latex(y) ans= x 3 ln(x + 3) x 6 x
Lineární diferenciální rovnice 2. řádu s konstantními koeficienty, y 9y = 5e 2t, y(0) = 0, y (0) = 3 y = dsolve( D2y = 5*exp(2*t)+9*y, y(0)=0, Dy(0)=3, t ) ezplot(y)
v matlabu y = (4*exp(3*t))/3-1/(3*exp(3*t)) - exp(2*t)» latex(y) ans = 4 e 3 t 3 1 3 e 3 t e 2 t
Lineární diferenciální rovnice 2. řádu s proměnnými koeficienty, y + xy = 1 2 x, y(0) = 0.25, y (0) = 0 y = dsolve( D2y = 1/(2-x)-x*y, y(0)=0.25, Dy(0)=0, x ) Ne vždy je řešení nalezeno...
Lineární soustavy, Ẋ = ( 1 1 4 2 ) ( 0 X, X 5 dsolve( Dy = x+y, Dy = 4*x -2y, x(0)=0, y(0)=5, t ) )
Numerické řešení Napíšeme funkci, která počítá hodnoty f a použijeme některou z matlabovských funkcí, které potřebují: jméno funkce, rozsah hodnot t (od t 0 do t N ) a počáteční hodnotu y 0. Nejpoužívanější matlabovská funkce: ode45. (help ode45)
Použití ode45 y = y(t) 5e t sin 5t, y(0) = 1, pro 0 t 3. Vytvoříme funkci prava (v souboru prava.m) function dy = prava(t,y) dy = -y-5*exp(-t)*sin(5*t); a použijeme ji: interval_t = [0 3]; y0 = 1; [t, y ] = ode45(@prava, interval_t, y0); v proměnné t jsou body z intervalu < 0, 3 >, ve kterých jsou určeny hodnoty přibližného řešení y(i).vnitřní body vybírá funkce ode45, tím menší vzdálenost, čím více se mění řešení. Výsledek můžeme graficky zobrazit: plot(t,y, *- - ); xlabel t, ylabel y(t) Pro uvedený příklad známe přesné řešení: y(t) = e x cos 5t, proto můžeme určit chybu numerického řešení jako max(abs(y-exp(-t).* cos(5*t))) = 2.8991 e -04 a porovnat grafy.
Pokud je zadáno více než 2 hodnoty (pro t) výpočet je proveden pouze v těchto hodnotách, a funkce dělení intervalu neprovádí (respektuje zadané). Např. tspan2 = 0:4 budou y hodnoty vypočteny pro t=0,1,2,3,4 Lze zadat i obrácené uspořádání hodnot (záporný krok), např. tspan3 = [0-0.5-1]
ODR vyššího řádu Řešíme převedením rovnice vyššího řádu na soustavu diferenciálních rovnic prvního řádu. Např. rovnice kyvadla: y = sin y Převedeme na soustavu 2 rovnic: y 1 (t) = y(t) a y 2 (t) = y (t): y 1 (t) = y 2(t), y 2 (t) = sin y 1(t) Pro použití ode45 vytvoříme funkci pravé strany: function dy = kyvadlo(t,y) dy =[y(2); -sin(y(1))];
Kyvadlo Výpočet provedeme pro 0 t 10 s různými počátečními podmínkami. Návratovými hodnotami ode45 bude matice, která má v každém řádku t(i), y1(t), y2(t). tspan = [0 10 ]; ya0 = [1; 1]; yb0 = [-5; 2 ]; yc0=[5; -2]; [ta ya] = ode45(@kyvadlo, tspan, ya0); [tb yb] = ode45(@kyvadlo, tspan, yb0); [tc yc] = ode45(@kyvadlo, tspan, yc0);
Zobrazení řešení Zobrazení fázových trajektorií v rovině v osách y1(t), y2(t) použijeme vygenerované sloupce y(:,1), y(:,2). Vektorové pole směrových vektorů [y2, -sin y1 ] zobrazí funkce quiver. [y1,y2] = meshgrid (-5:0.5:5, -3:0.5:3); Dy1Dt = y2; Dy2Dt = -sin(y1); quiver(y1,y2,dy1dt,dy2dt) hold on plot(ya(:,1),ya(:,2)) plot(yb(:,1),yb(:,2)) plot(yc(:,1),yc(:,2)) axis equal, axis([-5 5-3 3]) xlabel y_1(t), ylabel y_2(t), hold off
Kyvadlo
Soustavy autonomních rovnic 1 bod rovnováhy : ohnisko ( 1 1 Ẋ = 1 1 ) ( 1 X, X(0) = 2 ) 2 bod rovnováhy : sedlo ( 1 1 Ẋ = 4 2 ) ( 0 X, X(0) = 5 ) 3 bod rovnováhy : uzel ( 1 0 Ẋ = 3 2 4 bod rovnováhy : střed ( 0 1 Ẋ = 4 0 ) ( 1 X, X(0) = 0 ) ( 1 X, X(0) = 0 ) )
Autonomní soustava: bod rovnováhy OHNISKO tspan=[0,-5]; ybzero=[1;2]; [tb,yb]=ode45(@pr31,tspan,ybzero); [y1,y2] = meshgrid(-1:0.2:2,-1:0.2:2); Dy1Dt = y1-y2; Dy2Dt =y1+y2; quiver(y1,y2,dy1dt,dy2dt); hold on plot(yb(:,1),yb(:,2)) axis equal axis([-1,2,-1,2]) xlabel x(t), ylabel y(t), hold off function yprime = pr31 (t,y) yprime =[y(1)-y(2);y(1)+y(2)];
Ohnisko
Autonomní soustava: bod rovnováhy SEDLO tspan=[0,1]; ybzero=[0;1]; yczero=[0; -1]; yazero=[1;0]; ydzero=[-1;0]; [tb,yb]=ode45(@pr19,tspan,ybzero); [tc,yc]=ode45(@pr19,tspan,yczero); [tb,ya]=ode45(@pr19,[0,0.3],yazero); [tb,yd]=ode45(@pr19,[0,0.3],ydzero); [y1,y2] = meshgrid(-1.5:0.2:1.5,-1.5:0.2:1.5); Dy1Dt = y1-y2; Dy2Dt =-4*y1-2*y2; quiver(y1,y2,dy1dt,dy2dt); hold on plot(yb(:,1),yb(:,2), yc(:,1),yc(:,2),ya(:,1),ya(:,2),yd(:,1),yd(:,2)); axis equal xlabel y_1(t), ylabel y_2(t), hold off function yprime = pr19 (t,y) yprime =[y(1)-y(2);-4*y(1)-2*y(2)];
Sedlo
Autonomní soustava: bod rovnováhy UZEL tspan =[0, 20]; yazero = [1; 0]; [ta,ya] = ode45(@pr12, tspan, yazero); [y1,y2] = meshgrid(-1:0.2:1,-1:0.2:1); Dy1Dt = -y2; Dy2Dt =3*y1-2*y2; quiver(y1,y2,dy1dt,dy2dt); hold on plot(ya(:,1),ya(:,2), r ) axis equal xlabel y_1(t), ylabel y_2(t), hold off function yprime = pr12 (t,y) yprime =[-y(2);3*y(1)-2*y(2)];
Uzel
Autonomní soustava: bod rovnováhy STŘED tspan = [0,pi]; yazero = [1;0]; ybzero = [0; 3]; yczero = [1; 1]; [ta,ya] = ode45(@pr28, tspan, yazero); [tb,yb] = ode45(@, tspan, ybzero); [tc,yc] = ode45(@, tspan, yczero); [y1,y2] = meshgrid(-1.5:0.3:1.5,-3:0.3:3); Dy1Dt = y2; Dy2Dt = -4*y1; quiver(y1,y2,dy1dt,dy2dt); hold on plot(ya(:,1),ya(:,2),yb(:,1),yb(:,2),yc(:,1),yc(:,2)) axis equal, axis([-2,2,-4,4]) xlabel y_1(t), ylabel y_2(t), hold off function yprime = pr28 (t,y) yprime =[y(2);-4*y(1)];
Střed
Numerická integrace v MATLABu Numerická integrace integrace v kvadraturách přibližný výpočet b a f (x)dx funkce quad realizuje Simpsonovu metodu funkce quad1 realizuje přesnější metodu (Gauss Lobato, Kronrod) funkce trapz realizuje lichoběžníkovou metodu funkce dblquad výpočet dvojného integrálu
Použití funkcí trapz : parametry vektory x a y souřadnic, např. sin 2 (x) dx 1+cos 2 (x) 2π 0 >>x = linspace(0, 2*pi, 10);... nebo x = 0: 2*pi/10: 10; >>y = sin(x).ˆ2./sqrt(1+cos(x).ˆ2); >>trapz(x,y) ans = 2.8478
Použití quad, quad1, dblquad parametry: funkce, a, b, přesnost funkce musí mít parametr vektor a vracet vektor funkčních hodnot (pro dblquad 2 parametry: vektor x, skalár y, vrací vektor q = quad (funkce, a, b, presnost) q = quad1(inline( cos(x.ˆ2) ), t(i), t(i+1), 1e-3);
Příklady 4 2 x ln xdx function f = xlnx(x) f=x.*log(x); quad(@xlnx,2,4) >> ans = 6.7041
Příklady x(t) = t 0 cos(u2 )du, y(t) = t 0 sin(u2 )du n=1000; x=zeros(1,n); y=x; t=linspace(0,4*pi,n+1); for i=1:n x(i)=quad(inline( cos(x.ˆ2) ), t(i),t(i+1),1e-3); y(i)=quad(inline( sin(x.ˆ2) ), t(i),t(i+1),1e-3); end
Obrázek
příklady 6 4 1 0 (y 2 e x + x cos(x))dxdy function vysl = fxy(x,y) vysl = yˆ2*exp(x)+x*cos(y); >>dblquad(@fxy,0,1,4,6) ans = 87.2983