Using Strengths with SciPy's integration ODE methods ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `SciPy `_ [1] proposes powerful tools for integrating systems of ordinary differential equations (ODE), such as `solve_ivp `_ [2], why are way more advanced and fast than the Euler method available in the built-in engine. We show here how to use Strengths with Scipy. Here is a first example using Strengths's built-in engine, with the Euler method : .. code:: python from strengths import * import numpy as np import matplotlib.pyplot as plt system = rdsystem_from_dict({ "network" : { "species" : [ {"label" : "A", "density" : 100}, {"label" : "B", "density" : 50}, ], "reactions" : [ {"eq" : "A -> B", "k+" : 1, "k-" : 1} ] } }) out = simulate(system, t_sample=np.linspace(0, 10, 1000), engine=euler_engine()) plt.plot(out.t.value, out.get_trajectory("A").value, label="A") plt.plot(out.t.value, out.get_trajectory("B").value, label="B") plt.xlabel("t (s)") plt.ylabel("n (molecules/µm$^3$)") plt.show() Now, let us do the same thing, but using `solve_ivp `_ [2] instead of simulate. The integration function is obtained by calling the make_dxdtf method of the RDSystem object. .. code:: python from strengths import * import numpy as np import matplotlib.pyplot as plt from scipy.integrate import solve_ivp system = rdsystem_from_dict({ "network" : { "species" : [ {"label" : "A", "density" : 100}, {"label" : "B", "density" : 50}, ], "reactions" : [ {"eq" : "A -> B", "k+" : 1, "k-" : 1} ] } }) f = system.make_dxdtf() out = solve_ivp(f, t_span=(0, 10), y0=system.state.value, method="LSODA") plt.plot(out.t, out.y[0], label="A") plt.plot(out.t, out.y[1], label="B") plt.xlabel("t (s)") plt.ylabel("n (molecules/µm$^3$)") plt.show() References ^^^^^^^^^^ [1] SciPy package website (https://scipy.org/) [2] SciPy's API Reference documentation for the solve_ivp function (https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html#scipy.integrate.solve_ivp)