Skip to content

TimeResponseData.to_pandas() fails if there are no states in a NonlinearIOSystem #957

Closed
@joaoantoniocardoso

Description

@joaoantoniocardoso

TimeResponseData.to_pandas() fails if there are no states in a NonlinearIOSystem:

import control as ct

class System:
    @classmethod
    def _outputs(cls, t, x, u, params: dict):
        v = u[0]
        i = u[1]
        k = u[2]

        return k*v**2 + i

    @classmethod
    def build(cls):
        return ct.NonlinearIOSystem(
            None,
            cls._outputs,
            name="system",
            states=None,
            inputs=('v', 'i', 'V'),
            outputs=('I',),
            params=params,
        )

T = np.arange(100)   # simulation time in seconds
U = np.ones(shape=(3, len(T)))

sys = System.build()
ydata = ct.input_output_response(sys, T=T, U=U, solve_ivp_method="Radau").to_pandas()

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[106], [line 28](vscode-notebook-cell:?execution_count=106&line=28)
     [25](vscode-notebook-cell:?execution_count=106&line=25) U = np.ones(shape=(3, len(T)))
     [27](vscode-notebook-cell:?execution_count=106&line=27) sys = System.build()
---> [28](vscode-notebook-cell:?execution_count=106&line=28) ydata = ct.input_output_response(sys, T=T, U=U, solve_ivp_method="Radau").to_pandas()
     [29](vscode-notebook-cell:?execution_count=106&line=29) ydata

File [~/workspace_TCC/repo_2022_2/.env/lib/python3.10/site-packages/control/timeresp.py:655](https://file+.vscode-resource.vscode-cdn.net/home/joaoantoniocardoso/workspace_TCC/repo_2022_2/models/2020/panel/~/workspace_TCC/repo_2022_2/.env/lib/python3.10/site-packages/control/timeresp.py:655), in TimeResponseData.to_pandas(self)
    [650](https://file+.vscode-resource.vscode-cdn.net/home/joaoantoniocardoso/workspace_TCC/repo_2022_2/models/2020/panel/~/workspace_TCC/repo_2022_2/.env/lib/python3.10/site-packages/control/timeresp.py:650) data.update(
    [651](https://file+.vscode-resource.vscode-cdn.net/home/joaoantoniocardoso/workspace_TCC/repo_2022_2/models/2020/panel/~/workspace_TCC/repo_2022_2/.env/lib/python3.10/site-packages/control/timeresp.py:651)     {name: self.u[i] for i, name in enumerate(self.input_labels)})
    [652](https://file+.vscode-resource.vscode-cdn.net/home/joaoantoniocardoso/workspace_TCC/repo_2022_2/models/2020/panel/~/workspace_TCC/repo_2022_2/.env/lib/python3.10/site-packages/control/timeresp.py:652) data.update(
    [653](https://file+.vscode-resource.vscode-cdn.net/home/joaoantoniocardoso/workspace_TCC/repo_2022_2/models/2020/panel/~/workspace_TCC/repo_2022_2/.env/lib/python3.10/site-packages/control/timeresp.py:653)     {name: self.y[i] for i, name in enumerate(self.output_labels)})
    [654](https://file+.vscode-resource.vscode-cdn.net/home/joaoantoniocardoso/workspace_TCC/repo_2022_2/models/2020/panel/~/workspace_TCC/repo_2022_2/.env/lib/python3.10/site-packages/control/timeresp.py:654) data.update(
--> [655](https://file+.vscode-resource.vscode-cdn.net/home/joaoantoniocardoso/workspace_TCC/repo_2022_2/models/2020/panel/~/workspace_TCC/repo_2022_2/.env/lib/python3.10/site-packages/control/timeresp.py:655)     {name: self.x[i] for i, name in enumerate(self.state_labels)})
    [657](https://file+.vscode-resource.vscode-cdn.net/home/joaoantoniocardoso/workspace_TCC/repo_2022_2/models/2020/panel/~/workspace_TCC/repo_2022_2/.env/lib/python3.10/site-packages/control/timeresp.py:657) return pandas.DataFrame(data)

TypeError: 'NoneType' object is not iterable

Not optimal, but as a workaround, I'm introducing a state:

class System:
    @classmethod
    def _updates(cls, t, x, u, params: dict):
        return 0

    @classmethod
    def _outputs(cls, t, x, u, params: dict):
        v = u[0]
        i = u[1]
        k = u[2]

        return k*v**2 + i

    @classmethod
    def build(cls):
        return ct.NonlinearIOSystem(
            cls._updates,
            cls._outputs,
            name="system",
            states=1,
            inputs=('v', 'i', 'V'),
            outputs=('I',),
            params=params,
        )

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions