Skip to content

solve_flat_ocp and scalar timepts #1110

@roryyorke

Description

@roryyorke

flowing from gh-1101, which complains about the code in question,

solve_flat_ocp argument timepts is advertised in the docstring as being allowed to be scalar:

    timepts : float or 1D array_like
        The list of points for evaluating cost and constraints, as well as
        the time horizon.  If given as a float, indicates the final time for
        the trajectory (corresponding to xf)

but this doesn't work:

import numpy as np
import control as ct
import control.flatsys as fs

f = fs.LinearFlatSystem(ct.ss(ct.tf([1],[1,1])))

def terminal_cost(x, u):
    return (x-5).dot(x-5)+u.dot(u)

traj1 = fs.solve_flat_ocp(f, [0, 1], x0=[23],
                          terminal_cost=terminal_cost)

traj2 = fs.solve_flat_ocp(f, 1, x0=[23],
                          terminal_cost=terminal_cost)

teval = np.linspace(0,1,101)

r1 = traj1.response(teval)
r2 = traj2.response(teval)

assert np.max(abs(r1.x-r2.x)) == 0
assert np.max(abs(r1.u-r2.u)) == 0
assert np.max(abs(r1.y-r2.y)) == 0

produces with master @ ebff125

Traceback (most recent call last):
  File "/home/rory/projects/pycontrol/pyflakes/flatbug2.py", line 13, in <module>
    traj2 = fs.solve_flat_ocp(f, 1, x0=[23],
                              terminal_cost=terminal_cost)
  File "/home/rory/src/python-control/control/flatsys/flatsys.py", line 725, in solve_flat_ocp
    T0 = timepts[0] if len(timepts) > 1 else T0
                                             ^^
UnboundLocalError: cannot access local variable 'T0' where it is not associated with a value

I think the fix is as below. Diff also removes Tf, which is not used in the function. With this diff the test script runs with error.

@@ -721,8 +721,7 @@ def solve_flat_ocp(
 
     # Process final time
     timepts = np.atleast_1d(timepts)
-    Tf = timepts[-1]
-    T0 = timepts[0] if len(timepts) > 1 else T0
+    T0 = timepts[0] if len(timepts) > 1 else 0
 
     # Process keyword arguments
     if trajectory_constraints is None:

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions