【问题标题】:Scipy odeint - different values of arguments in each timestep txScipy odeint - 每个时间步 tx 中的不同参数值
【发布时间】:2020-07-17 16:38:49
【问题描述】:

我正在尝试使用 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 作为每个时间戳的值传递?

谢谢!

【问题讨论】:

  • 使用args=(controls,) 传递附加参数,以确保它是包含controls 值的长度为1 的元组。 (我不确定这是否会完全解决您的所有问题,但肯定是一个需要解决的问题。)

标签: python scipy simulation ode


【解决方案1】:

scipy.interpolate.interp1d 中,您可以将插值模式定义为“零保持”或 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

尺寸错误可能是另一个问题。要对其进行调试,请使用调试器(如果可用)或为输入和输出的大小/形状添加打印语句。状态和导数应该是相同大小的平面数组。

不要忘记将最大时间步设置为小于控件的步长,这无关紧要,但可能会导致奇怪的错误。

【讨论】:

  • 一维插值是我所需要的。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-01-14
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多