In [ ]:
import numpy as np
import sympy as sp
import matplotlib.pyplot as plt
from pyodesys.tests._robertson import get_ode_exprs
from pyodesys.symbolic import SymbolicSys, ScaledSys, PartiallySolvedSystem
sp.init_printing()
%matplotlib inline

In [ ]:
linf, linj = get_ode_exprs()
logf, logj = get_ode_exprs(True, True)

linsys = ScaledSys.from_callback(linf, 3, 3, dep_scaling=1e8, linear_invariants=[[1, 1, 1]], names='ABC')

In [ ]:
psysA = PartiallySolvedSystem.from_linear_invariants(linsys, preferred=[0], description='A ')
psysC = PartiallySolvedSystem.from_linear_invariants(linsys, preferred=[2], description='C ')
psysA.exprs, psysC.exprs

In [ ]:
tend, iv, pars = 1e18, [1, 0, 0], [0.04, 1e4, 3e7]
integrate_kw = dict(integrator='cvode', record_rhs_xvals=True, record_jac_xvals=True, nsteps=3000,
                    atol=1e-8, rtol=1e-8, return_on_error=True)

def plot_res(res, ax):
    res.plot(xscale='log', yscale='log', ax=ax, title_info=2)  # , info_vlines_kw=True)
    ax.set_xlim([1e-12, tend])
    ax.set_ylim([1e-30, 1e9])
    ax.legend(loc='best')

def integrate_and_plot_systems(systems):
    results = []
    fig, axes = plt.subplots(1, 3, figsize=(16, 4))
    for odesys, ax in zip(systems, axes):
        results.append(odesys.integrate(tend, iv, pars, **integrate_kw))
        plot_res(results[-1], ax)
    return results

odes = [linsys, psysA, psysC]

In [ ]:
results = integrate_and_plot_systems(odes)

In [ ]:
_ = integrate_and_plot_systems([SymbolicSys.from_other(odesys, lower_bounds=[0]*odesys.ny) for odesys in odes])

In [ ]: