Scipy odeint - 每个时间步 tx 中参数的不同值
Scipy odeint - different values of arguments in each timestep tx
我正在尝试使用 SciPy 来模拟一些动态模型。
我有模型定义:
def model(y, t, control_signal):
dy/dt = some_function_of_time_and_y
return dy
我定义了要模拟模型的时间戳列表:t_list=np.linspace(0, 5, 100)
。我想使用为每个时间戳定义的 control_signal
值来模拟模型。我试图通过使用来实现:
controls = [list_of_values]
scipy.integrate.odeint(model, 0, t_list, args=(controls))
但我得到 The size of the array returned by func (5) does not match the size of y0 (1).
好像
我的 controls
被解释为模型状态,而不是每个时间戳中的输入。如何将 controls
作为每个时间戳的值传递?
谢谢!
在scipy.interpolate.interp1d
中可以定义插值方式为"zero-hold"或0阶样条,即分段常数,用`kind="zero"。使用它来定义控件的时间依赖性。
contfunc = interp1d(t_list,control, kind="zero");
def model(y, t, control_signal):
u = contfunc(t);
dydt = some_function_of_time_and_y_and_u
return dydt
尺寸错误可能是另一个问题。要对其进行调试,请使用调试器(如果可用)或为输入和输出的 size/shape 添加打印语句。状态和导数应该是相同大小的平面数组。
不要忘记将最大时间步长设置为小于控件的步长,这应该无关紧要,但可能会导致奇怪的错误。
我正在尝试使用 SciPy 来模拟一些动态模型。
我有模型定义:
def model(y, t, control_signal):
dy/dt = some_function_of_time_and_y
return dy
我定义了要模拟模型的时间戳列表:t_list=np.linspace(0, 5, 100)
。我想使用为每个时间戳定义的 control_signal
值来模拟模型。我试图通过使用来实现:
controls = [list_of_values]
scipy.integrate.odeint(model, 0, t_list, args=(controls))
但我得到 The size of the array returned by func (5) does not match the size of y0 (1).
好像
我的 controls
被解释为模型状态,而不是每个时间戳中的输入。如何将 controls
作为每个时间戳的值传递?
谢谢!
在scipy.interpolate.interp1d
中可以定义插值方式为"zero-hold"或0阶样条,即分段常数,用`kind="zero"。使用它来定义控件的时间依赖性。
contfunc = interp1d(t_list,control, kind="zero");
def model(y, t, control_signal):
u = contfunc(t);
dydt = some_function_of_time_and_y_and_u
return dydt
尺寸错误可能是另一个问题。要对其进行调试,请使用调试器(如果可用)或为输入和输出的 size/shape 添加打印语句。状态和导数应该是相同大小的平面数组。
不要忘记将最大时间步长设置为小于控件的步长,这应该无关紧要,但可能会导致奇怪的错误。