function [U,t] = ODE(eq,t,U0,log)
%ODE Řeší nestacionární problém vedení tepla metodu ode23t
% Vstupy: eq - strukture představující data přímé úlohy vedení tepla, t -
% dělení časového intervalu, U0 - počáteční podmínka v uzlech triangulace,
% log - má-li být použita logaritmická časová škála
% Výstupy: U - matice řešení, t - dělení časového intervalu

if eq.stationary
    error('Úloha je stacionární');
end

if isempty(t)
    % Zejména při nesouladu okrajových a počátečních podmínek je vhodné
    % použít logaritmické dělení časového intervalu
    if log
        t = logspace(-3,log10(eq.time(2)),eq.num_tsteps-1);
        t = [eq.time(1),t];
        if t(end) ~= eq.time(2)
            t(end) = eq.time(2);
        end
    else
        t = linspace(eq.time(1),eq.time(2),eq.num_tsteps);
    end
end

U = zeros(size(eq.phi(eq.domain.p(1,:)',eq.domain.p(2,:)),1)',size(t,2));
% Počáteční podmínka je zadaná buď jako funkce, nebo v každém uzlu triangulace

if isempty(U0) 
    U(:,1) = eq.phi(eq.domain.p(1,:),eq.domain.p(2,:));
else
    U(:,1) = U0;
end

[t,U] = ode23t(@(t,U) wrapper(t,U,eq),t,U(:,1));
U = U';
t = t';
end

function dUdt = wrapper(t,U,eq)
    [C,K,F] = FEM(eq,t,U);
    dUdt = C\(F-K*U);
end

