%23%20%2F%2F%2F%20script%0A%23%20requires-python%20%3D%20%22%3E%3D3.13%22%0A%23%20dependencies%20%3D%20%5B%0A%23%20%20%20%20%20%22marimo%3E%3D0.19.10%22%2C%0A%23%20%20%20%20%20%22pyzmq%3E%3D27.1.0%22%2C%0A%23%20%5D%0A%23%20%2F%2F%2F%0A%0Aimport%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%0A%20%20%20%20%20%20%20%20%20%20%20%20verbose%3DFalse%2C%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%20Getting%20started%20with%20Poincare%0A%20%20%20%20Poincare%20is%20a%20python%20library%20for%20declaring%20and%20simulating%20dynamical%20systems.%20Designed%20around%20the%20principle%20of%20modularity%2C%20composability%20and%20reproducibility%2C%20it's%20intended%20to%20create%20a%20layer%20to%20separate%20the%20actual%20declaration%20of%20models%20from%20their%20simulation%2C%20allowing%20to%20easily%20switch%20methods%20and%20backends.%20It%20also%20makes%20models%20composable%2C%20allowing%20the%20combination%20of%20smaller%20systems%20to%20create%20larger%20ones%2C%20and%20implements%20a%20series%20of%20analysis%20tools%20such%20as%20parameter%20sweeps%20to%20find%20steady%20states%20or%20limit%20cicles.%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%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%20Installation%0A%0A%20%20%20%20It%20can%20be%20installed%20from%20PyPI%3A%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%60%60%60%0A%20%20%20%20pip%20install%20-U%20poincare%0A%20%20%20%20%60%60%60%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%20or%20conda-forge%3A%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%60%60%60%0A%20%20%20%20conda%20install%20-c%20conda-forge%20poincare%0A%20%20%20%20%60%60%60%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%20Creating%20and%20simultaing%20a%20system%0A%20%20%20%20Systems%20are%20represented%20as%20a%20subclass%20of%20the%20%60System%60%20Class.%20To%20create%20one%20with%20equations%3A%0A%20%20%20%20%24%24%20%5Cfrac%7Bdx%7D%7Bdt%7D%20%3D%20-x%20%5Cquad%20%5Ctext%7Bwith%7D%20%5Cquad%20x(0)%20%3D%201%20%24%24%0A%20%20%20%20we%20can%20write%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%20from%20poincare%20import%20System%2C%20Variable%2C%20initial%0A%0A%20%20%20%20class%20Model(System)%3A%0A%20%20%20%20%20%20%20%20%23%20Define%20a%20variable%20with%20name%20%60x%60%20with%20an%20initial%20value%20(t%3D0)%20of%20%601%60%60.%0A%20%20%20%20%20%20%20%20x%3A%20Variable%20%3D%20initial(default%3D1)%0A%20%20%20%20%20%20%20%20%23%20The%20rate%20of%20change%20of%20%60x%60%20(i.e.%20velocity)%20is%20assigned%20(%3C%3C)%20to%20%60-x%60.%0A%20%20%20%20%20%20%20%20%23%20This%20relation%20is%20assigned%20to%20a%20Python%20variable%20(%60eq%60)%0A%20%20%20%20%20%20%20%20eq%20%3D%20x.derive()%20%3C%3C%20-x%0A%0A%20%20%20%20return%20Model%2C%20System%2C%20Variable%2C%20initial%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%20To%20simulate%20that%20system%20we%20must%20create%20a%20%60Simulator%60%20for%20it%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Model)%3A%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20from%20poincare%20import%20Simulator%0A%0A%20%20%20%20_sim%20%3D%20Simulator(Model)%0A%20%20%20%20result%20%3D%20_sim.solve(save_at%3Dnp.linspace(0%2C%2010%2C%20100))%0A%20%20%20%20%23%20Create%20a%20simulator%20for%20Model%0A%20%20%20%20%23%20Solve%20the%20model%20and%20save%20the%20resulting%20xarray%20dataset%20to%20%22result%22%0A%20%20%20%20result.to_dataframe().plot()%0A%20%20%20%20return%20Simulator%2C%20np%2C%20result%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%20The%20output%20is%20a%20%5Bxarray%5D(https%3A%2F%2Fdocs.xarray.dev%2Fen%2Fstable%2F)%20%60Dataset%60%2C%0A%20%20%20%20which%20can%20be%20plotted%20with%20%60to_dataframe().plot()%60.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(result)%3A%0A%20%20%20%20%23%20Display%20Datest%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%20We%20can%20change%20the%20initial%20conditions%20by%20passing%20a%20%60values%60%20dictionary%20to%20%60solve%60%3B%20it%20is%20possible%20to%20create%20more%20than%20one%20solution%20with%20different%20initial%20conditions%20from%20the%20same%20%60Simulator%60%2C%20avoiding%20model%20recompilation.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Model%2C%20Simulator)%3A%0A%20%20%20%20_sim%20%3D%20Simulator(Model)%0A%20%20%20%20result1%20%3D%20_sim.solve(values%3D%7BModel.x%3A%202%7D%2C%20save_at%3Drange(3))%0A%20%20%20%20print(%22Result%201%3A%20%20%5Cn%22%2C%20result1)%0A%20%20%20%20result2%20%3D%20_sim.solve(values%3D%7BModel.x%3A%203%7D%2C%20save_at%3Drange(3))%0A%20%20%20%20print(%22Result%202%3A%20%5Cn%22%2C%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%20Higher%20order%20systems%0A%20%20%20%20To%20define%20a%20higher-order%20system%2C%20we%20have%20to%20explicitly%20define%20and%20assign%20an%20initial%20condition%20to%20the%20derivative%20of%20a%20variable%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Simulator%2C%20System%2C%20Variable%2C%20initial%2C%20np)%3A%0A%20%20%20%20from%20poincare%20import%20Derivative%0A%0A%20%20%20%20class%20Oscillator(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%20%23%20Define%20%60v%60%20as%20the%20derivative%20of%20%60x%60%20with%20an%20intital%20value%20of%20%600%60%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%20eq%20%3D%20v.derive()%20%3C%3C%20-x%0A%0A%20%20%20%20result_1%20%3D%20Simulator(Oscillator).solve(save_at%3Dnp.linspace(0%2C%2010%2C%20100))%0A%20%20%20%20result_1.to_dataframe().plot()%0A%20%20%20%20return%20Derivative%2C%20Oscillator%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%20Non-autonomous%20systems%0A%0A%20%20%20%20To%20use%20the%20independent%20variable%2C%0A%20%20%20%20we%20create%20an%20instance%20of%20%60Independent%60%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Simulator%2C%20System%2C%20Variable%2C%20initial)%3A%0A%20%20%20%20from%20poincare%20import%20Independent%0A%0A%20%20%20%20class%20NonAutonomous(System)%3A%0A%20%20%20%20%20%20%20%20time%20%3D%20Independent()%0A%20%20%20%20%20%20%20%20x%3A%20Variable%20%3D%20initial(default%3D0)%0A%20%20%20%20%20%20%20%20eq%20%3D%20x.derive()%20%3C%3C%202%20*%20time%0A%0A%20%20%20%20Simulator(NonAutonomous).solve(save_at%3Drange(3))%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%20Transforming%20output%0A%20%20%20%20We%20can%20compute%20transformations%20of%20the%20output%0A%20%20%20%20by%20passing%20a%20dictionary%20%60transform%20%3D%20%7B%22name%22%3A%20expression%7D%60%20of%20expressions%20to%20calculate%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Oscillator%2C%20Simulator%2C%20np)%3A%0A%20%20%20%20%23%20Compute%20kinetic%20and%20potential%20energy%0A%20%20%20%20result_2%20%3D%20Simulator(%0A%20%20%20%20%20%20%20%20Oscillator%2C%0A%20%20%20%20%20%20%20%20transform%3D%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22x%22%3A%20Oscillator.x%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22T%22%3A%201%20%2F%202%20*%20Oscillator.v**2%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22V%22%3A%201%20%2F%202%20*%20Oscillator.x**2%2C%0A%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20).solve(save_at%3Dnp.linspace(0%2C%2010%2C%20100))%0A%20%20%20%20result_2.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%20Note%20that%20the%20output%20will%20only%20save%20whatever%20is%20passed%20to%20transform%2C%20so%20the%20original%20variables%20must%20be%20explicitly%20passed%20in%20order%20to%20be%20included.%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%20Constants%20and%20Parameters%0A%0A%20%20%20%20Besides%20variables%2C%0A%20%20%20%20we%20can%20define%20parameters%20and%20constants%2C%0A%20%20%20%20and%20use%20functions%20from%20%5BSymbolite%5D(https%3A%2F%2Fgithub.com%2Fhgrecco%2Fsymbolite).%0A%0A%20%20%20%20%23%23%23%20Constants%0A%0A%20%20%20%20Constants%20allow%20to%20define%20common%20initial%20conditions%20for%20Variables%20and%20Derivatives%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Simulator%2C%20System%2C%20Variable%2C%20initial)%3A%0A%20%20%20%20from%20poincare%20import%20Constant%2C%20assign%0A%0A%20%20%20%20class%20ModelXY(System)%3A%0A%20%20%20%20%20%20%20%20c%3A%20Constant%20%3D%20assign(default%3D1%2C%20constant%3DTrue)%0A%20%20%20%20%20%20%20%20x%3A%20Variable%20%3D%20initial(default%3Dc)%0A%20%20%20%20%20%20%20%20y%3A%20Variable%20%3D%20initial(default%3D2%20*%20c)%0A%20%20%20%20%20%20%20%20eq_x%20%3D%20x.derive()%20%3C%3C%20-x%0A%20%20%20%20%20%20%20%20eq_y%20%3D%20y.derive()%20%3C%3C%20-y%0A%0A%20%20%20%20Simulator(ModelXY).solve(save_at%3Drange(3))%0A%20%20%20%20return%20ModelXY%2C%20assign%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%20Now%2C%20we%20can%20vary%20their%20initial%20conditions%20jointly%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ModelXY%2C%20Simulator)%3A%0A%20%20%20%20Simulator(ModelXY).solve(values%3D%7BModelXY.c%3A%202%7D%2C%20save_at%3Drange(3))%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%20But%20we%20can%20break%20that%20connection%20by%20passing%20%60y%60's%20initial%20value%20directly%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ModelXY%2C%20Simulator)%3A%0A%20%20%20%20Simulator(ModelXY).solve(values%3D%7BModelXY.c%3A%202%2C%20ModelXY.y%3A%202%7D%2C%20save_at%3Drange(3))%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%20Parameters%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%20Parameters%20are%20like%20Variables%2C%0A%20%20%20%20but%20their%20time%20evolution%20is%20given%20directly%20as%20a%20function%20of%20time%2C%0A%20%20%20%20Variables%2C%20Constants%20and%20other%20Parameters%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Simulator%2C%20System%2C%20Variable%2C%20assign%2C%20initial)%3A%0A%20%20%20%20from%20poincare%20import%20Parameter%0A%0A%20%20%20%20class%20ParametrizedDecay(System)%3A%0A%20%20%20%20%20%20%20%20p%3A%20Parameter%20%3D%20assign(default%3D1)%0A%20%20%20%20%20%20%20%20x%3A%20Variable%20%3D%20initial(default%3D1)%0A%20%20%20%20%20%20%20%20eq%20%3D%20x.derive()%20%3C%3C%20-p%20*%20x%0A%0A%20%20%20%20%23%20We%20can%20use%20a%20value%20other%20than%20the%20default%20for%20parameter%20%60p%60%20when%20solving%20the%20system%0A%20%20%20%20Simulator(ParametrizedDecay).solve(%0A%20%20%20%20%20%20%20%20save_at%3Drange(3)%2C%20values%3D%7BParametrizedDecay.p%3A%200.5%7D%0A%20%20%20%20)%0A%20%20%20%20Simulator(ParametrizedDecay).solve(%0A%20%20%20%20%20%20%20%20save_at%3Drange(3)%2C%20values%3D%7BParametrizedDecay.p%3A%202%7D%0A%20%20%20%20)%0A%20%20%20%20return%20Parameter%2C%20ParametrizedDecay%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%20Functions%0A%20%20%20%20Symbolite%20functions%20are%20accessible%20from%20the%20%60symbolite.real%60%20module%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Parameter%2C%20Simulator%2C%20System%2C%20Variable%2C%20assign%2C%20initial)%3A%0A%20%20%20%20from%20symbolite%20import%20real%0A%0A%20%20%20%20class%20ParametrizedForce(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%20Force%3A%20Parameter%20%3D%20assign(default%3Dreal.sin(x))%0A%0A%20%20%20%20%20%20%20%20eq%20%3D%20x.derive()%20%3C%3C%20Force%0A%0A%20%20%20%20Simulator(ParametrizedForce).solve(save_at%3Drange(3))%0A%20%20%20%20return%20ParametrizedForce%2C%20real%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%20Note%20how%20%60F%60%20is%20a%20function%20of%20%60x%60.%20Parameters%20which%20depend%20on%20variables%20cannot%20be%20changed%20after%20model%20compilation%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ParametrizedForce%2C%20Simulator%2C%20real)%3A%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20Simulator(ParametrizedForce).solve(%0A%20%20%20%20%20%20%20%20%20%20%20%20save_at%3Drange(3)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20values%3D%7BParametrizedForce.Force%3A%20real.cos(ParametrizedForce.x)%7D%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20except%20ValueError%20as%20ve%3A%0A%20%20%20%20%20%20%20%20%23%20Poincare%20Raises%20a%20ValueError%20when%20the%20functional%20dependece%20of%20a%20parameter%20is%20changed%0A%20%20%20%20%20%20%20%20print(%22ValueError%3A%22%2C%20ve)%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%20Instead%20we%20must%20recompile%20the%20model%20with%20the%20new%20value%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ParametrizedForce%2C%20Simulator%2C%20real)%3A%0A%20%20%20%20%23%20create%20a%20new%20simulator%20with%20the%20new%20formula%20for%20Force%0A%20%20%20%20new_sim%20%3D%20Simulator(ParametrizedForce(Force%3Dreal.cos(ParametrizedForce.x)))%0A%20%20%20%20new_sim.solve(save_at%3Drange(3))%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%20Model%20Reports%0A%20%20%20%20Aside%20for%20its%20use%20in%20simulation%2C%20Poincare%20is%20meant%20to%20be%20a%20centralized%20for%20source%20for%20all%20information%20concerning%20the%20system.%20To%20ensure%20consistency%20between%20analytical%20formulations%20and%20numerical%20implementations%2C%20we%20can%20use%20the%20%60model_report()%60%20function%20to%20generate%20LaTeX%20code%20for%20a%20report%20with%20all%20relevant%20model%20data%20(equations%2C%20variables%20and%20parameters)%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ParametrizedForce)%3A%0A%20%20%20%20from%20poincare%20import%20model_report%0A%0A%20%20%20%20print(model_report(ParametrizedForce))%0A%20%20%20%20return%20(model_report%2C)%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%20instead%20of%20printing%20the%20output%20a%20file%20path%20can%20be%20passed%20for%20%60model_report()%60%20to%20write%20on%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ParametrizedDecay%2C%20model_report)%3A%0A%20%20%20%20model_report(ParametrizedDecay%2C%20path%3D%22Parametrized_Decay_report.tex%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%20There%20are%20also%20three%20additional%20arguments%20to%20control%20how%20the%20report%20is%20generated%3A%0A%20%20%20%20-%20%60standalone%60%3A%20decides%20wether%20it%20should%20compile%20as%20a%20standalone%20document%20(by%20including%20headers%20such%20as%20%22%5Cdocumentclass%22%2C%20%22%5Cbegin%7Bdocument%7D%22)%20or%20is%20meant%20to%20be%20added%20to%20a%20an%20existing%20document%3B%20when%20a%20path%20is%20passed%20it%20also%20controls%20if%20it%20overwrites%20existing%20contents%20(if%20%60True%60)%20or%20it%20appends%20(if%20%60False%60).%20It%20is%20%60True%60%20by%20default.%0A%20%20%20%20-%20%60transform%60%3A%20a%20dictionary%20%7Bcomponent%3A%20latex%20expression%7D%20to%20replace%20the%20name%20of%20certain%20components.%20E.g.%3A%20%60%60%60%20transform%20%3D%20%7BParametrizedForce.Force%3A%20%22F%22%7D%60%60%60%20replaces%20%22Force%22%20for%20%22F%22%20in%20the%20report.%0A%20%20%20%20-%20%60replace_algebraics%60%3A%20whether%20to%20replace%20parameters%20that%20depend%20on%20other%20parameters%20and%20variables%20for%20their%20expressions%20in%20dependence%20or%20leave%20them%20es%20is%2C%20is%20is%20%60False%60%20by%20default.%20E.g.%3A%20passing%20%60replace_algebracis%20%3D%20True%60%20replaces%20%22Force%22%20with%20%22sin(t)%22%20in%20the%20report.%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%20Units%0A%0A%20%20%20%20poincar%C3%A9%20also%20supports%20functions%20through%0A%20%20%20%20%5B%60pint%60%5D(https%3A%2F%2Fgithub.com%2Fhgrecco%2Fpint)%0A%20%20%20%20and%20%5B%60pint-pandas%60%5D(https%3A%2F%2Fgithub.com%2Fhgrecco%2Fpint-pandas).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Derivative%2C%20Parameter%2C%20Simulator%2C%20System%2C%20Variable%2C%20assign%2C%20initial%2C%20np)%3A%0A%20%20%20%20import%20pint%0A%0A%20%20%20%20unit%20%3D%20pint.UnitRegistry()%0A%0A%20%20%20%20class%20UnitModel(System)%3A%0A%20%20%20%20%20%20%20%20x%3A%20Variable%20%3D%20initial(default%3D1%20*%20unit.m)%0A%20%20%20%20%20%20%20%20v%3A%20Derivative%20%3D%20x.derive(initial%3D0%20*%20unit.m%20%2F%20unit.s)%0A%20%20%20%20%20%20%20%20w%3A%20Parameter%20%3D%20assign(default%3D1%20*%20unit.Hz)%0A%20%20%20%20%20%20%20%20eq%20%3D%20v.derive()%20%3C%3C%20-(w**2)%20*%20x%0A%0A%20%20%20%20result_3%20%3D%20Simulator(UnitModel).solve(save_at%3Dnp.array(range(3))%20*%20unit.s)%0A%20%20%20%20return%20(result_3%2C)%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%20The%20columns%20have%20units%20of%20%60m%60%20and%20%60m%2Fs%60%2C%20respectively.%0A%20%20%20%20%60pint%60%20raises%20a%20%60DimensionalityError%60%20if%20we%20try%20to%20add%20them%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(result_3)%3A%0A%20%20%20%20from%20pint%20import%20DimensionalityError%0A%0A%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20result_3%5B%22x%22%5D%20%2B%20result_3%5B%22v%22%5D%0A%20%20%20%20except%20DimensionalityError%20as%20de%3A%0A%20%20%20%20%20%20%20%20print(%22DimensionalityError%3A%20%22%2C%20de)%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%20We%20can%20remove%20the%20units%20with%3A%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(result_3)%3A%0A%20%20%20%20result_3.pint.dequantify()%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%20which%20allows%20to%20plot%20the%20DataFrame%20with%20%60.plot()%60.%0A%20%20%20%20%22%22%22)%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
bb22b3ca8d3807ec2f3133ff98cccb84