def _fixed_step(self, t, fields, dt, pars,
hook=null_hook):
fields = fields.copy()
fields, pars = hook(t, fields, pars)
J = self._model.J(fields, pars)
Id = self.__cache__(fields.uflat.size)
self._A = A = Id - self._gamma[0, 0] * dt * J
luf = sps.linalg.factorized(A)
ks = []
fields_i = fields.copy()
for i in np.arange(self._s):
fields_i.fill(fields.uflat +
sum([self._alpha[i, j] * ks[j]
for j in range(i)]))
F = self._model.F(fields_i, pars)
ks.append(luf(dt * F + dt * (J @ sum([self._gamma[i, j] *
ks[j]
for j
in range(i)])
if i > 0 else 0)))
U = fields.uflat.copy()
U = U + sum([bi * ki for bi, ki in zip(self._b, ks)])
U_pred = (U + sum([bi * ki
for bi, ki
in zip(self._b_pred, ks)])
if self._b_pred is not None else None)
fields.fill(U)
return t + dt, fields, (norm(U - U_pred, np.inf)
if U_pred is not None else None)
评论列表
文章目录