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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      pFad - Phonifier reborn

      Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

      Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


      Alternative Proxies:

      Alternative Proxy

      pFad Proxy

      pFad v3 Proxy

      pFad v4 Proxy