import%20marimo%0A%0A__generated_with%20%3D%20%220.23.16%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0Aasync%20with%20app.setup(hide_code%3DTrue)%3A%0A%20%20%20%20%23%20Setup%20cell%20for%20marimo%20notebook%2C%20can%20be%20ignored%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20sys%0A%0A%20%20%20%20%23%20Import%20packages%20if%20running%20on%20marimo%20playground%0A%20%20%20%20if%20sys.executable%20%3D%3D%20%22%2Fhome%2Fpyodide%2Fthis.program%22%3A%0A%20%20%20%20%20%20%20%20import%20micropip%0A%0A%20%20%20%20%20%20%20%20await%20micropip.install(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%22pint_pandas%3C%3D0.7%22%2C%20%22typing_extensions%3E%3D4.15.0%22%2C%20%22poincare%3E%3D1.1.2%22%2C%20%22matplotlib%22%5D%2C%20verbose%20%3D%20False%0A%20%20%20%20%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Simulation%20in%20poincare%0A%20%20%20%20Poincare%20and%20SimBio%20include%20a%20number%20of%20different%20options%20for%20simulation%2C%20including%20changing%20solvers%20and%20backends%2C%20searching%20for%20steady%20states%20and%20limit%20cycles%20with%20parameter%20sweeps%20and%20interactive%20simulation.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Using%20different%20solvers%20and%20backends%0A%20%20%20%20We%20can%20change%20the%20method%20used%20for%20simulating%20the%20system%20by%20passing%20it%20to%20the%20%60solve%60%20method.%20To%20use%20Runge-Kutta%20%20of%20order%204%20(5)%20instead%20of%20the%20default%20LSODA%20(SciPy's%20implementation%20of%20Adams%2FBDF%20method)%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%20%20%20%20from%20poincare%20import%20(%0A%20%20%20%20%20%20%20%20Constant%2C%0A%20%20%20%20%20%20%20%20Derivative%2C%0A%20%20%20%20%20%20%20%20Simulator%2C%0A%20%20%20%20%20%20%20%20System%2C%0A%20%20%20%20%20%20%20%20Variable%2C%0A%20%20%20%20%20%20%20%20assign%2C%0A%20%20%20%20%20%20%20%20initial%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Define%20a%20System%0A%20%20%20%20class%20DampedOscillator(System)%3A%0A%20%20%20%20%20%20%20%20x%3A%20Variable%20%3D%20initial(default%3D1)%0A%20%20%20%20%20%20%20%20v%3A%20Derivative%20%3D%20x.derive(initial%3D0)%0A%20%20%20%20%20%20%20%20k%3A%20Constant%20%3D%20assign(default%3D1%2C%20constant%3DTrue)%0A%20%20%20%20%20%20%20%20eq%20%3D%20v.derive()%20%3C%3C%20-k%20*%20x%20-%200.1%20*%20v%0A%0A%20%20%20%20return%20DampedOscillator%2C%20Simulator%2C%20np%0A%0A%0A%40app.cell%0Adef%20_(DampedOscillator%2C%20Simulator)%3A%0A%20%20%20%20from%20poincare%20import%20solvers%0A%0A%20%20%20%20result%20%3D%20Simulator(DampedOscillator).solve(solver%3Dsolvers.RK45()%2C%20save_at%3Drange(3))%0A%20%20%20%20result%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Currently%20the%20implemented%20methods%20are%3A%20Asams%2FBDF%20(LSODA)%2C%20Runge-Kutta%20of%20orders%203(2)%20(RK32)%2C%204(5)%20(RK45)%20and%208%20(DOP853)%2C%20Runge-Kutta%20method%20of%20Radau%20IIA%20family%20of%20order%205%20(Radau)%2C%20and%20BDF%20(BDF).%20All%20oft%20them%20are%20wrappers%20to%20SciPy's%20implementation%20%20of%20the%20method%2C%20see%20%5BSciPy's%20documentation%5D(https%3A%2F%2Fdocs.scipy.org%2Fdoc%2Fscipy%2Freference%2Fintegrate.html)%20for%20more%20details.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Poincare%20also%20allows%20the%20use%20of%20diffent%20backends%20to%20compile%20the%20systems%20to%2C%20inculuding%20%5BNumPy%5D(https%3A%2F%2Fnumpy.org%2F)%20(by%20default)%20%5BNumba%5D(https%3A%2F%2Fnumba.pydata.org%2F)%20and%20%5BJAX%5D(https%3A%2F%2Fdocs.jax.dev%2Fen%2Flatest%2F)%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(DampedOscillator%2C%20Simulator)%3A%0A%20%20%20%20result2%20%3D%20Simulator(DampedOscillator%2C%20backend%3D%22numba%22).solve(save_at%3Drange(3))%0A%20%20%20%20result2%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%23%20In%20marimo%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Interactive%20simulators%0A%0A%20%20%20%20%23%23%23%20In%20marimo%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20slider%20%3D%20mo.ui.slider(start%3D0%2C%20stop%3D10%2C%20step%3D0.1%2C%20value%3D0.5%2C%20label%3D%22v(0)%22)%0A%20%20%20%20slider%0A%20%20%20%20return%20(slider%2C)%0A%0A%0A%40app.cell%0Adef%20_(DampedOscillator%2C%20Simulator%2C%20np%2C%20slider)%3A%0A%20%20%20%20Simulator(DampedOscillator).solve(%0A%20%20%20%20%20%20%20%20save_at%3Dnp.linspace(0%2C%2010%2C%20100)%2C%20values%3D%7BDampedOscillator.v%3A%20slider.value%7D%0A%20%20%20%20).to_dataframe().plot()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20In%20Jupyter%0A%0A%20%20%20%20%20in%20Jupyter%20we%20use%20the%20%60interact%60%20method%20to%20create%20interactive%20simulations%20to%20vary%20parameters%20or%20initial%20conditions%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(DampedOscillator%2C%20Simulator%2C%20np)%3A%0A%20%20%20%20result4%20%3D%20Simulator(DampedOscillator).interact(%0A%20%20%20%20%20%20%20%20save_at%3Dnp.linspace(0%2C%2010%2C%20100)%2C%20values%3D%7BDampedOscillator.k%3A%20(0%2C%2010%2C%200.1)%7D%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
80ff87e4b2a2d0c841bd27742e077f25