Closed
Description
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,
)