84 this.
Name=
" adaptive semi-implicit euler method ";
92 s = this.model.System;
94 error(
" This solver requires an (affine) linear system component A. ");
106 x = zeros(size(x0,1),length(t));
112 oldex = []; newex = []; edim = 0; est = [];
113 if isa(this.model,
" models.ReducedModel ")
114 est = this.model.ErrorEstimator;
115 if ~isempty(est) && est.Enabled
116 edim = est.ExtraODEDims;
117 oldex = x0(end-edim+1:end);
122 M = speye(length(x0)-edim);
125 mdep = s.M.TimeDependent;
131 fdep = s.A.TimeDependent;
134 A = s.A.evaluate(1, 0, s.mu);
139 [l1, u1] = lu(M - h * A);
143 [l2, u2] = lu(M - h/2 * A);
150 delta = 0.5 * this.
epsilon * (1-this.
q);
155 while ((delta/this.
epsilon) < (1 - this.
q)) || ((delta/this.
epsilon) > (1 + this.
q))
157 h = h * (this.
epsilon / delta);
173 RHS1 = RHS1 + h*s.f.evaluate(x1, time, s.mu);
176 RHS1 = RHS1 + h*s.B.evaluate(time, s.mu)*s.u(time);
185 A = s.A.evaluate(1, time, s.mu);
188 M = s.M.evaluate(time);
190 x1 = (M - h * A)\RHS1;
197 RHS2 = RHS2 + h/2*s.f.evaluate(x2, time, s.mu);
200 RHS2 = RHS2 + h/2*s.B.evaluate(time, s.mu)*s.u(time);
209 A = s.A.evaluate(1, time, s.mu);
212 M = s.M.evaluate(time);
214 x2 = (M - h/2 * A)\RHS2;
218 delta = norm((x1-x2)./x2)/(2*h);
245 while time < t(end) && time >
t(outidx)
250 l = length(t) - outidx;
251 x(:,outidx:end) = repmat(x2,1,l+1);
The base class for any KerMor detailed model.
logical RealTimeMode
Determines if the solver's StepPerformed event should be used upon solving instead of returning the f...
BaseCustomSolver: Base class for all self-implemented solvers.
epsilon
(exp(L(b-a))-1)/L * epsilon (Interval (a,b), Lipschiz constant L) is upper error bound ...
function matrix< double > x = customSolve(unused1, t, x0, unused2)
Implements the actual semi-implicit solving of the given ODE system.
dscomponents.AMassMatrix M
The mass matrix of the ODE .
SemiImplicitEuler: Solves ODEs in KerMor using implicit euler for the linear part and explicit euler ...
AdaptiveSemiImplicitEuler(models.BaseFullModel model, epsilon, q, h0)