% Implixit Euler-modszer
% A diffegy alfuggveny altal megadott differencialegyenletet
% megoldja a t0 pontbol es y0 kezdeti ertekbol kiindulva
% h lepeskozzel es N db lepessel
% Hasznalata: pl. [T1,Ye] = impeuler(@diffegy, 0, 1, 0.1, 10)
function [t,y] = impeuler(diffegy, t0, y0, h, N)
t=zeros(N+1,1);
y = zeros(N+1,1);
t(1) = t0;
y(1) = y0;
for i=1:N
t(i+1) = t(i) + h;
g = @(x)(x-y(i)-h*diffegy(t(i+1),x));
g_der = @(x)(1+h);   %Kezzel kiszamitottuk elotte a g masodik valtozo szerinti derivaltjat
%Newton-modszert alkalmazunk a cikluson belul
hiba = 1e-6;
maxit = 50;
x(1) = y(i)+h*diffegy(t(i),y(i));   % kezdeti iteracio az explicit Euler-megoldas
y_newton = g(x(1));
it = 0;
while ((abs(y_newton) > hiba) && (it < maxit))
    it = it + 1;
    x(it+1) = x(it) - g(x(it))/g_der(x(it));
    y_newton = g(x(it+1));
end
y(i+1)=x(it+1);
end
% Pontos megoldas
u=exp(-t)+t;
plot(t,u,'b',t,y,'r')
xlabel('t')
ylabel('y')
title('Implicit Euler-modszer')
legend('Pontos megoldas','Numerikus megoldas')
