%4. gyakorlat: exponenciális öszefüggés megoldása Euler módszerekkel
% dx=mu*x
% x=aktuális állapot; X=új állapot
%pontos megoldás: x(t)=e^(mu*t)

tmax=3;
x_null=1; %kezdeti érték
h=0.11; %0.01, 0.05, 0.1, 0.11, 0.15, 0.2, 0.21, 0.5 %lépésköz
mu=-100; %-10, -100; %meredékség paraméter
t=0:h:tmax; %idõpontok, ahol az egyenletet kiszámoljuk
xE=zeros(length(t),1);
xE(1)=x_null;
xI=xE;

%explicit Euler módszer:
%(X-x)/h = dx=mu*x -> X=x+h*mu*x
for i=2:length(xE)
    xE(i)=xE(i-1)+h*(mu*xE(i-1));
end

%implicit Euler módszer:
%(X-x)/h = dX=mu*X -> X=x/(1-h*mu)
for i=2:length(xI)
    xI(i)=xI(i-1)/(1-h*mu);
end

%ode:
[t45, x45] = ode45(@(t, x) mu*x, [0,tmax], x_null); %általános megoldó
[t15s, x15s] = ode15s(@(t, x) mu*x, [0,tmax], x_null); %speciálisan stiff problémákra jó 
[t113, x113] = ode113(@(t, x) mu*x, [0,tmax], x_null); %speciálisan nem stiff problémákra jó 

figure;
subplot(3,2,[1,3,5]);
plot(t, exp(mu*t), 'r-'); %analitikus megoldás
hold on;
plot(t,xE, 'b-');
plot(t,xI, 'k-');
xlabel('t');
ylabel('x(t)');
title({['dx=',num2str(mu), 'x'], ['h=', num2str(h)]});
legend({'analitikus','Explicit Euler', 'Implicit Euler'});

subplot(3,2,2);
plot(t45, x45, 'o-');
xlabel('t');
ylabel('x(t)');
title('ode45');

subplot(3,2,4);
plot(t15s, x15s, 'o-');
xlabel('t');
ylabel('x(t)');
title('ode15s');

subplot(3,2,6);
plot(t113, x113, 'o-');
xlabel('t');
ylabel('x(t)');
title('ode113');