我有一个简单的最优控制问题,我必须找到一个阶跃函数f ( t ) 以最大化目标函数 ( IMODE=6
)。现在f ( t ) 为 [0, 10) 中的t定义,使得f具有 10 个不同的等间距值。(即f ( t )= f 0对于 0 ≤ t < 1 等)。此外, f本身只取 0 到 10 之间的整数值(包括 0 和 10)。
首先,我认为m.time=np.linspace(0, 10, 11)
我[0, 1, 2, ..., 10]
的时间网格中的点。然后我f=m.MV(lb=0, ub=10, integer=True)
使用 APPT 解决了问题m.options.SOLVER = 1
,只是忽略了f (10) 的值。
这很好解决,我能够获得一个整数解决方案。看起来,结果是 f 的线性插值,而不是我想要的f的阶跃函数插值。阅读文档后,我认为 MV_TYPE 是我需要的标志。因此,我尝试通过设置将f切换为阶跃函数,m.options.MV_TYPE=0
但这给了我与m.options.MV_TYPE=1
. (告诉我我完全误解了 MV_TYPE 应该做什么。)所以对于我的第一个问题:什么是MV_TYPE 标志在做什么?我读到的是 MV_TYPE=0 用阶跃函数对所有 MV 变量进行插值,而 MV_TYPE=1 用线性插值对所有 MV 变量进行插值。但是,使用 MV_TYPE 的两个选项进行两次单独运行会产生具有相同目标函数值的相同解决方案。
其次,有没有更好的方法来做我想做的事?(强制我的控件采用不连续阶跃函数的形式)。我在文档(示例 #17 of 18)中看到,制作阶跃函数的适当方法基本上是使时间网格足够精细以覆盖接缝。事实上,类似的东西m.time=[0, 0.999, 1, 1.999, 2, 2.999, ..., 9, 9.999]
对我来说是一个合理的网格。但是,那么我的f=m.MV
行将导致f
有 20 个独立值(而不是我想要的 10 个)。是否有强制 MV 在时间点t=0
和t=0.999
(以及在等处相同的值t=1
)t=1.999
以确保我的函数是阶跃函数的值?
我不禁觉得我在这里遗漏了一些明显的东西!