コード例 #1
0
    def test_time_dep_ode(self):
        t0 = 1.2
        T = 5.7
        ocp = Ocp(t0=t0, T=5.7)

        x = ocp.state()
        ocp.set_der(x, ocp.t**2)

        ocp.subject_to(ocp.at_t0(x) == 0)

        tf = t0 + T
        x_ref = tf**3 / 3 - t0**3 / 3

        ocp.solver('ipopt')
        opts = {"abstol": 1e-9, "reltol": 1e-9}
        for method in [
                MultipleShooting(intg='rk'),
                MultipleShooting(intg='cvodes', intg_options=opts),
                MultipleShooting(intg='idas', intg_options=opts),
                DirectCollocation()
        ]:
            ocp.method(method)
            sol = ocp.solve()
            ts, xs = sol.sample(x, grid='control')
            x_ref = ts**3 / 3 - t0**3 / 3
            assert_array_almost_equal(xs, x_ref)
コード例 #2
0
    def test_basic_t0_free(self):
        xf = 2
        t0 = 0
        for T in [2]:
            for x0 in [0, 1]:
                for b in [1, 2]:
                    for method in [
                            MultipleShooting(N=4, intg='rk'),
                            MultipleShooting(N=4, intg='cvodes'),
                            MultipleShooting(N=4, intg='idas'),
                            DirectCollocation(N=4)
                    ]:
                        ocp = Ocp(t0=FreeTime(2), T=T)

                        x = ocp.state()
                        u = ocp.control()

                        ocp.set_der(x, u)
                        ocp.subject_to(u <= b)
                        ocp.subject_to(-b <= u)

                        ocp.add_objective(ocp.tf)
                        ocp.subject_to(ocp.at_t0(x) == x0)
                        ocp.subject_to(ocp.at_tf(x) == xf)
                        ocp.subject_to(ocp.t0 >= 0)

                        ocp.solver('ipopt')

                        ocp.method(method)

                        sol = ocp.solve()

                        ts, xs = sol.sample(x, grid='control')

                        self.assertAlmostEqual(xs[0], x0, places=6)
                        self.assertAlmostEqual(xs[-1], xf, places=6)
                        self.assertAlmostEqual(ts[0], t0)
                        self.assertAlmostEqual(ts[-1], t0 + T)
コード例 #3
0
def bang_bang_problem(stage_method):
    ocp = Ocp(T=FreeTime(1))

    p = ocp.state()
    v = ocp.state()
    u = ocp.control()

    ocp.set_der(p, v)
    ocp.set_der(v, u)

    ocp.subject_to(u <= 1)
    ocp.subject_to(-1 <= u)

    ocp.add_objective(ocp.T)
    ocp.subject_to(ocp.at_t0(p) == 0)
    ocp.subject_to(ocp.at_t0(v) == 0)
    ocp.subject_to(ocp.at_tf(p) == 1)
    ocp.subject_to(ocp.at_tf(v) == 0)

    ocp.solver('ipopt')

    ocp.method(stage_method)

    return (ocp, ocp.solve(), p, v, u)
コード例 #4
0
ファイル: bounce.py プロジェクト: xinsongyan/rockit
# After bounce 1
stage2, p2, v2 = create_bouncing_ball_stage(ocp)
ocp.subject_to(stage2.at_t0(v2) == -0.9 * stage1.at_tf(v1))
ocp.subject_to(stage2.at_t0(p2) == stage1.at_tf(p1))
ocp.subject_to(stage2.t0 == stage1.tf)
ocp.subject_to(stage2.at_tf(p2) == 0)

# After bounce 2
stage3, p3, v3 = create_bouncing_ball_stage(ocp)
ocp.subject_to(stage3.at_t0(v3) == -0.9 * stage2.at_tf(v2))
ocp.subject_to(stage3.at_t0(p3) == stage2.at_tf(p2))
ocp.subject_to(stage3.t0 == stage2.tf)
ocp.subject_to(stage3.at_tf(v3) == 0)
ocp.subject_to(stage3.at_tf(p3) == 0.5)  # Stop at a half meter!

ocp.solver('ipopt')

# Solve
sol = ocp.solve()

# Plot the 3 bounces
plt.figure()
ts1, ps1 = sol(stage1).sample(p1, grid='integrator')
ts2, ps2 = sol(stage2).sample(p2, grid='integrator')
ts3, ps3 = sol(stage3).sample(p3, grid='integrator')
plt.plot(ts1, ps1)
plt.plot(ts2, ps2)
plt.plot(ts3, ps3)

plt.show(block=True)
コード例 #5
0
    def test_dae_casadi(self):
        # cross check with dae_colloation

        xref = 0.1  # chariot reference

        l = 1.  #- -> crane, + -> pendulum
        m = 1.
        M = 1.
        g = 9.81

        ocp = Ocp(T=5)

        x = ocp.state()
        y = ocp.state()
        w = ocp.state()
        dx = ocp.state()
        dy = ocp.state()
        dw = ocp.state()

        xa = ocp.algebraic()
        u = ocp.control()

        ocp.set_der(x, dx)
        ocp.set_der(y, dy)
        ocp.set_der(w, dw)
        ddx = (w - x) * xa / m
        ddy = g - y * xa / m
        ddw = ((x - w) * xa - u) / M
        ocp.set_der(dx, ddx)
        ocp.set_der(dy, ddy)
        ocp.set_der(dw, ddw)
        ocp.add_alg((x - w) * (ddx - ddw) + y * ddy + dy * dy + (dx - dw)**2)

        ocp.add_objective(
            ocp.at_tf((x - xref) * (x - xref) + (w - xref) * (w - xref) +
                      dx * dx + dy * dy))
        ocp.add_objective(
            ocp.integral((x - xref) * (x - xref) + (w - xref) * (w - xref)))

        ocp.subject_to(-2 <= (u <= 2))

        ocp.subject_to(ocp.at_t0(x) == 0)
        ocp.subject_to(ocp.at_t0(y) == l)
        ocp.subject_to(ocp.at_t0(w) == 0)
        ocp.subject_to(ocp.at_t0(dx) == 0)
        ocp.subject_to(ocp.at_t0(dy) == 0)
        ocp.subject_to(ocp.at_t0(dw) == 0)
        #ocp.subject_to(xa>=0,grid='integrator_roots')

        ocp.set_initial(y, l)
        ocp.set_initial(xa, 9.81)

        # Pick an NLP solver backend
        # NOTE: default scaling strategy of MUMPS leads to a singular matrix error
        ocp.solver(
            'ipopt', {
                "ipopt.linear_solver": "mumps",
                "ipopt.mumps_scaling": 0,
                "ipopt.tol": 1e-12
            })

        # Pick a solution method
        method = DirectCollocation(N=50)
        ocp.method(method)

        # Solve
        sol = ocp.solve()

        assert_array_almost_equal(
            sol.sample(xa, grid='integrator', refine=1)[1][0],
            9.81011622448889)
        assert_array_almost_equal(
            sol.sample(xa, grid='integrator', refine=1)[1][1],
            9.865726317147214)
        assert_array_almost_equal(
            sol.sample(xa, grid='integrator')[1][0], 9.81011622448889)
        assert_array_almost_equal(
            sol.sample(xa, grid='integrator')[1][1], 9.865726317147214)
        assert_array_almost_equal(
            sol.sample(xa, grid='control')[1][0], 9.81011622448889)
        assert_array_almost_equal(
            sol.sample(xa, grid='control')[1][1], 9.865726317147214)
コード例 #6
0
ファイル: test_stage.py プロジェクト: xinsongyan/rockit
    def test_stage_cloning_t0_T(self):
        for t0_stage, t0_sol_stage in [(None, 0), (-1, -1),
                                       (FreeTime(-1), -1)]:
            for T_stage, T_sol_stage in [(None, 2), (2, 2), (FreeTime(1), 2)]:
                kwargs = {}
                if t0_stage is not None:
                    kwargs["t0"] = t0_stage
                if T_stage is not None:
                    kwargs["T"] = T_stage
                stage = Stage(**kwargs)

                p = stage.state()
                v = stage.state()
                u = stage.control()

                stage.set_der(p, v)
                stage.set_der(v, u)

                stage.subject_to(u <= 1)
                stage.subject_to(-1 <= u)

                stage.add_objective(stage.tf)
                stage.subject_to(stage.at_t0(p) == 0)
                stage.subject_to(stage.at_t0(v) == 0)
                stage.subject_to(stage.at_tf(p) == 1)
                stage.subject_to(stage.at_tf(v) == 0)
                stage.method(MultipleShooting(N=2))

                for t0, t0_sol in ([] if t0_stage is None else [
                    (None, t0_sol_stage)
                ]) + [(-1, -1), (FreeTime(-1), -1)]:
                    for T, T_sol in ([] if T_stage is None else [
                        (None, T_sol_stage)
                    ]) + [(2, 2), (FreeTime(1), 2)]:
                        ocp = Ocp()

                        kwargs = {}
                        if t0 is not None:
                            kwargs["t0"] = t0
                        if T is not None:
                            kwargs["T"] = T
                        mystage = ocp.stage(stage, **kwargs)

                        if mystage.is_free_starttime():
                            ocp.subject_to(mystage.t0 >= t0_sol)

                        ocp.solver('ipopt')

                        sol = ocp.solve()

                        tolerance = 1e-6

                        ts, ps = sol(mystage).sample(p,
                                                     grid='integrator',
                                                     refine=10)

                        ps_ref = np.hstack(
                            ((0.5 * np.linspace(0, 1, 10 + 1)**2)[:-1],
                             np.linspace(0.5, 1.5, 10 + 1) -
                             0.5 * np.linspace(0, 1, 10 + 1)**2))
                        np.testing.assert_allclose(ps, ps_ref, atol=tolerance)

                        ts_ref = t0_sol + np.linspace(0, 2, 10 * 2 + 1)

                        ts, vs = sol(mystage).sample(v,
                                                     grid='integrator',
                                                     refine=10)
                        np.testing.assert_allclose(ts, ts_ref, atol=tolerance)

                        vs_ref = np.hstack((np.linspace(0, 1, 10 + 1)[:-1],
                                            np.linspace(1, 0, 10 + 1)))
                        np.testing.assert_allclose(vs, vs_ref, atol=tolerance)

                        u_ref = np.array([1.0] * 10 + [-1.0] * 11)
                        ts, us = sol(mystage).sample(u,
                                                     grid='integrator',
                                                     refine=10)
                        np.testing.assert_allclose(us, u_ref, atol=tolerance)