import%20marimo%0A%0A__generated_with%20%3D%20%220.11.25%22%0Aapp%20%3D%20marimo.App(%0A%20%20%20%20app_title%3D%22SCvxGEN%20-%20Brachistochrone%22%2C%0A%20%20%20%20layout_file%3D%22data%3Aapplication%2Fjson%3Bbase64%2CewogICJ0eXBlIjogInNsaWRlcyIsCiAgImRhdGEiOiB7fQp9%22%2C%0A)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%20Brachistochrone%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20%23%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20mo.hstack(%5Bmo.image(src%3D%22brachistochrone.svg%22%2C%20width%3D400)%5D%2C%20justify%3D%22center%22)%0A%20%20%20%20return%20(mo%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Optimal%20control%20problem%0A%0A%20%20%20%20%20%20%20%20%24%24%0A%20%20%20%20%20%20%20%20%5Clarge%0A%20%20%20%20%20%20%20%20%5Cbegin%7Baligned%7D%0A%20%20%20%20%20%20%20%20%26%5Cunderset%7B%5Crule%7B0pt%7D%7B10pt%7D%5Csmall%5Ctheta%7D%7B%5Ctext%7Bminimize%7D%7D%20%26%20t_%7B%5Cscriptsize%5Cmathrm%7Bf%7D%7D%20%5C%5C%5B1em%5D%0A%20%20%20%20%20%20%20%20%26%5Ctext%7Bsubject%20to%7D%20%26%20%5Cdot%7Bx%7D(t)%20%26%3D%20v(t)%20%5Csin%5Ctheta(t)%20%5C%5C%0A%20%20%20%20%20%20%20%20%26%20%26%20%5Cdot%7By%7D(t)%20%26%3D%20-v(t)%20%5Ccos%5Ctheta(t)%20%26%5Cforall%5C%2Ct%20%26%5Cin%20%5B0%2C%20t_%7B%5Cscriptsize%5Cmathrm%7Bf%7D%7D%5D%20%5C%5C%0A%20%20%20%20%20%20%20%20%26%20%26%20%5Cdot%7Bv%7D(t)%20%26%3D%20g%20%5Ccos%5Ctheta(t)%20%5C%5C%5B1em%5D%0A%20%20%20%20%20%20%20%20%26%20%26%20x(0)%20%26%3D%200%2C%20%5Censkip%5C%20%5C%20x(t_%7B%5Cscriptsize%5Cmathrm%7Bf%7D%7D)%20%3D%2010%20%5C%5C%0A%20%20%20%20%20%20%20%20%26%20%26%20y(0)%20%26%3D%2010%2C%20%5Censkip%20y(t_%7B%5Cscriptsize%5Cmathrm%7Bf%7D%7D)%20%3D%205%20%5C%5C%0A%20%20%20%20%20%20%20%20%26%20%26%20v(0)%20%26%3D%200%2C%20%5Censkip%5C%20%5C%20v(t_%7B%5Cscriptsize%5Cmathrm%7Bf%7D%7D)%20%3D%20%5Ctext%7Bfree%7D%0A%20%20%20%20%20%20%20%20%5Cend%7Baligned%7D%0A%20%20%20%20%20%20%20%20%24%24%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20scvxgen%20as%20scvx%0A%20%20%20%20return%20(scvx%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Parameters%0A%0A%20%20%20%20%20%20%20%20%24%24%0A%20%20%20%20%20%20%20%20%5Cbegin%7Balign*%7D%0A%20%20%20%20%20%20%20%20g%20%26%3A%20%5Ctext%7Bacceleration%20due%20to%20gravity%7D%0A%20%20%20%20%20%20%20%20%5Cend%7Balign*%7D%0A%20%20%20%20%20%20%20%20%24%24%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(scvx)%3A%0A%20%20%20%20parameters%20%3D%20scvx.Parameters('g')%0A%20%20%20%20parameters%0A%20%20%20%20return%20(parameters%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20States%0A%0A%20%20%20%20%20%20%20%20%24%24%0A%20%20%20%20%20%20%20%20%5Cbegin%7Balign*%7D%0A%20%20%20%20%20%20%20%20x%20%26%3A%20%5Ctext%7Bhorizontal%20position%7D%20%5C%5C%0A%20%20%20%20%20%20%20%20y%20%26%3A%20%5Ctext%7Bvertical%20position%7D%20%5C%5C%0A%20%20%20%20%20%20%20%20v%20%26%3A%20%5Ctext%7Bspeed%7D%0A%20%20%20%20%20%20%20%20%5Cend%7Balign*%7D%0A%20%20%20%20%20%20%20%20%24%24%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(scvx)%3A%0A%20%20%20%20states%20%3D%20scvx.States('x%20y%20v')%0A%0A%20%20%20%20states%0A%20%20%20%20return%20(states%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Controls%0A%0A%20%20%20%20%20%20%20%20%24%24%0A%20%20%20%20%20%20%20%20%5Cbegin%7Balign*%7D%0A%20%20%20%20%20%20%20%20%5Ctheta%20%26%3A%20%5Ctext%7Bangle%20between%20gravity%20vector%20and%20instantaneous%20tangent%7D%0A%20%20%20%20%20%20%20%20%5Cend%7Balign*%7D%0A%20%20%20%20%20%20%20%20%24%24%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(scvx)%3A%0A%20%20%20%20controls%20%3D%20scvx.Controls('theta')%0A%20%20%20%20controls%0A%20%20%20%20return%20(controls%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Dynamics%0A%0A%20%20%20%20%20%20%20%20%24%24%0A%20%20%20%20%20%20%20%20%5Cbegin%7Balign*%7D%0A%20%20%20%20%20%20%20%20%5Cdot%7Bx%7D%20%26%3D%20v%20%5Csin%5Ctheta%20%5C%5C%0A%20%20%20%20%20%20%20%20%5Cdot%7By%7D%20%26%3D%20-v%20%5Ccos%5Ctheta%20%5C%5C%0A%20%20%20%20%20%20%20%20%5Cdot%7Bv%7D%20%26%3D%20g%20%5Ccos%5Ctheta%0A%20%20%20%20%20%20%20%20%5Cend%7Balign*%7D%0A%20%20%20%20%20%20%20%20%24%24%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(controls%2C%20parameters%2C%20scvx%2C%20states)%3A%0A%20%20%20%20g%2C%20%3D%20parameters%3B%0A%20%20%20%20x%2C%20y%2C%20v%20%3D%20states%3B%0A%20%20%20%20theta%2C%20%3D%20controls%3B%0A%0A%20%20%20%20sin%20%3D%20scvx.sympy.sin%0A%20%20%20%20cos%20%3D%20scvx.sympy.cos%0A%20%20%20%20pi%20%3D%20float(scvx.sympy.pi)%0A%20%20%20%20return%20cos%2C%20g%2C%20pi%2C%20sin%2C%20theta%2C%20v%2C%20x%2C%20y%0A%0A%0A%40app.cell%0Adef%20_(cos%2C%20g%2C%20scvx%2C%20sin%2C%20theta%2C%20v)%3A%0A%20%20%20%20dynamics%20%3D%20scvx.Dynamics(%0A%20%20%20%20%20%20%20%20%20v%20*%20sin(theta)%2C%0A%20%20%20%20%20%20%20%20-v%20*%20cos(theta)%2C%0A%20%20%20%20%20%20%20%20%20g%20*%20cos(theta)%0A%20%20%20%20)%0A%0A%20%20%20%20dynamics%0A%20%20%20%20return%20(dynamics%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Numerical%20values%0A%0A%20%20%20%20%20%20%20%20Reference%3A%20https%3A%2F%2Fopenmdao.github.io%2Fdymos%2Fexamples%2Fbrachistochrone%2Fbrachistochrone.html%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(controls%2C%20parameters%2C%20pi%2C%20scvx%2C%20states)%3A%0A%20%20%20%20time%20%3D%20scvx.Time(guess%3D2%2C%20t_min_factor%3D0.25%2C%20t_max_factor%3D5)%0A%0A%20%20%20%20parameters.g.set_value(9.81)%0A%0A%20%20%20%20states.set_initial(0%2C%2010%2C%200)%0A%20%20%20%20states.set_final(10%2C%205%2C%20scvx.Free())%0A%20%20%20%20states.set_minimum(0%2C%200%2C%200)%0A%20%20%20%20states.set_maximum(10%2C%2010%2C%2010)%0A%0A%20%20%20%20controls.set_initial(5%20*%20pi%20%2F%20180)%0A%20%20%20%20controls.set_final(100.5%20*%20pi%20%2F%20180)%0A%20%20%20%20controls.set_minimum(0)%0A%20%20%20%20controls.set_maximum(100.5%20*%20pi%20%2F%20180)%0A%20%20%20%20return%20(time%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Settings%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(scvx)%3A%0A%20%20%20%20settings%20%3D%20scvx.Settings(N_disc%3D2%2C%20N_prop%3D20%2C%20convex_solver%3D'PIPG'%2C%20w_cost%3D1%2C%20w_slack%3D10%2C%20w_trust%3D10)%0A%20%20%20%20return%20(settings%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Problem%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(controls%2C%20dynamics%2C%20parameters%2C%20scvx%2C%20settings%2C%20states%2C%20time)%3A%0A%20%20%20%20problem%20%3D%20scvx.Problem(time%3Dtime%2C%20parameters%3Dparameters%2C%20states%3Dstates%2C%20controls%3Dcontrols%2C%20dynamics%3Ddynamics%2C%20settings%3Dsettings)%0A%20%20%20%20return%20(problem%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Generate%20code%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(problem)%3A%0A%20%20%20%20problem.generate_code()%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Solve%20the%20problem%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(problem)%3A%0A%20%20%20%20problem.solve()%3B%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%23%23%20Plot%20the%20solution%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(scvx%2C%20states)%3A%0A%20%20%20%20states.plot()%3B%0A%20%20%20%20scvx.plotting.render_svg()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(controls%2C%20scvx)%3A%0A%20%20%20%20controls.plot()%3B%0A%20%20%20%20scvx.plotting.render_svg()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(scvx)%3A%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20scvx.plotting.setup_plotting()%0A%20%20%20%20return%20(plt%2C)%0A%0A%0A%40app.cell%0Adef%20_(plt%2C%20scvx%2C%20states)%3A%0A%20%20%20%20fig1%2C%20ax1%20%3D%20plt.subplots(figsize%3D(4.5%2C%203.5))%0A%20%20%20%20ax1.plot(states.x.sim%2C%20states.y.sim%2C%20label%3D'Simulation')%0A%20%20%20%20ax1.plot(states.x.sol%2C%20states.y.sol%2C%20'o'%2C%20color%3D'dodgerblue'%2C%20alpha%3D0.75%2C%20label%3D'Solution')%0A%20%20%20%20ax1.set_xlabel(r'%24x(t)%24')%0A%20%20%20%20ax1.set_ylabel(r'%24y(t)%24')%0A%20%20%20%20ax1.legend()%0A%20%20%20%20ax1.set_title(%22Optimal%20path%20(Earth)%22%2C%20pad%3D25)%0A%20%20%20%20scvx.plotting.render_svg()%0A%20%20%20%20return%20ax1%2C%20fig1%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20What%20about%20Mars%3F%0A%0A%20%20%20%20%20%20%20%20Modifying%20parameters%20on%20the%20fly%20(without%20recompilation%20of%20the%20C%20code)%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(problem)%3A%0A%20%20%20%20problem.solve(modified_parameters%3D%7B'g'%3A%203.71%7D)%3B%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(plt%2C%20scvx%2C%20states)%3A%0A%20%20%20%20fig2%2C%20ax2%20%3D%20plt.subplots(figsize%3D(4.5%2C%203.5))%0A%20%20%20%20ax2.plot(states.x.sim%2C%20states.y.sim%2C%20label%3D'Simulation')%0A%20%20%20%20ax2.plot(states.x.sol%2C%20states.y.sol%2C%20'o'%2C%20alpha%3D0.75%2C%20label%3D'Solution')%0A%20%20%20%20ax2.set_xlabel(r'%24x(t)%24')%0A%20%20%20%20ax2.set_ylabel(r'%24y(t)%24')%0A%20%20%20%20ax2.legend()%0A%20%20%20%20ax2.set_title(%22Optimal%20path%20(Mars)%22%2C%20pad%3D25)%0A%20%20%20%20scvx.plotting.render_svg()%0A%20%20%20%20return%20ax2%2C%20fig2%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
ce879696b3c0fa023156ce224f1fed4d077cd871c07a66a74a3f88c7741d9358