def newton_krylov(self, verbose=False): """ Full Newton-Krylov method Warnings -------- The result might be wrong if discrete are in use! Parameters ---------- verbose Returns ------- """ system = self.system system.init() v0 = system.dae.xy try: ret = newton_krylov(self._fg_wrapper, v0, verbose=verbose) except ValueError as e: logger.error('Mismatch is not correctable. Equations may be unsolvable.') raise e return ret
def _solve_ivp_wrapper(self, t, x, asolver, verbose): system = self.system dae = self.system.dae # store the values from k-1 (the last step) dae.x = x system.vars_to_models() system.dae.store_yt_single() # set new t must come after `store_xyt` dae.t = t # solve for algebraic variables if asolver is None: self._solve_g(verbose) elif asolver == 'fsolve': sol, _, ier, mesg = fsolve(self._g_wrapper, dae.y, full_output=True) if ier != 1: raise NoConvergence(f"Cannot solve algebraic equations, error: \n{mesg}") dae.y = sol elif asolver == 'newton_krylov': dae.y = newton_krylov(self._g_wrapper, dae.y, verbose=verbose) else: raise NotImplementedError(f"Unknown algeb_solver {asolver}") system.f_update(models=self.pflow_tds_models) system.l_check_eq(models=self.pflow_tds_models) system.l_set_eq(models=self.pflow_tds_models) system.fg_to_dae() return dae.f
def newton_krylov(self, verbose=False): """ Full Newton-Krylov method from SciPy. Warnings -------- The result might be wrong if discrete are in use! Parameters ---------- verbose True if verbose. Returns ------- np.array Solutions `dae.xy`. """ system = self.system system.init(system.exist.pflow) v0 = system.dae.xy try: ret = newton_krylov(self._fg_wrapper, v0, verbose=verbose) except ValueError as e: logger.error('Mismatch is not correctable. Equations may be unsolvable.') raise e return ret