2

我有一个简单的最优控制问题,我必须找到一个阶跃函数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=0t=0.999(以及在等处相同的值t=1t=1.999以确保我的函数是阶跃函数的值?

我不禁觉得我在这里遗漏了一些明显的东西!

4

1 回答 1

1

你的理解MV_TYPE是正确的。从MV_TYPE 的文档中

MV_TYPE 指定 MV 端点之间的零阶保持 (0) 或一阶线性 (1) 插值。当 MV_STEP_HOR 为 2 或更大时,MV_TYPE 仅应用于允许调整的每个段。MV 段在其他方面等于先前的时间段。MV_TYPE 仅在 NODES 的数量在 3 到 6 之间时影响解。当 NODES=2 时并不重要,因为端点之间没有插值节点。

它可能会给出相同的答案,因为m.options.NODES=2默认情况下。设置m.options.NODES>=3可能会导致整数类型 MV 的问题,MV_TYPE=1因为线性插值点也需要是整数。如果您仍想使用NODES=2但需要更多模拟分辨率,请尝试以下操作:

m.time = [0,0.5,0.9999,1,1.5,1.9999,2,2.5,2.9999,3]
于 2021-07-22T18:00:47.403 回答