OpenMDAO 元模型不尊重训练数据

J_C*_*ode 2 python optimization openmdao

我使用 OpenMDAO 半结构化元模型作为 Dymos 优化的一部分。有两个输入值,因此范围是二维的。通常,这工作得很好。然而,我最近注意到,对于一组特定的训练数据,它无法正确插值。

我使用元模型 html 可视化工具来查看发生的情况,可以看到拟合是错误的。将鼠标悬停在某些数据点上,我可以看到它们正确显示输入数据值。然而,将光标向任意方向稍微远离该点,插值结果就会大不相同。这意味着元模型“拟合”不会经过训练数据点,甚至在某些区域接近它。

使用“线性”方法时出现此问题。我将其改为使用“lagrange2”,现在看起来拟合得好多了。不过,这种方法的计算量似乎非常大,因为我的优化尚未完成,而且它已经是使用“线性”所需时间的 3 倍以上。因此,我希望能够回到“线性”。

有谁知道为什么会发生这种情况以及如何解决该问题?非常感谢所有帮助。谢谢。

Ken*_*ore 5

半结构化元模型很棘手。对于这个二维表,它假设数据可以分解为两个连续的插值,一个在行之间,一个在这些线上的点之间。如果您的各个方面都有足够的点来匹配您选择的顺序,那么它的行为就像结构化插值一样。不幸的是,半结构化网格可能会丢失数据,导致您最终可能从很远的地方推断子维度。这是一个例子:

x, y
[0.1, 0.1]
[0.1, 0.2]
[0.2, 0.1]
[0.2, 0.2]
[0.8, 0.8]
[0.8, 0.9]
Run Code Online (Sandbox Code Playgroud)

如果您尝试计算 [0.21, 0.15] 处的值,则 x 中的下一行会在 0.8 处找到,并且它的外推距离其定义值很远,这将导致内插值发生突然变化。

您可以尝试以下一些操作:

  1. 您可以尝试交换桌子上的尺寸,看看是否有更好的行为。(因此,如果您的表是 X,Y,请尝试 Y,X。)它依赖于数据,但可能有助于使外推发生在更合适的方向上。

  2. 您可以尝试 OpenMDAO 非结构化元模型。会有性能成本。

  3. 通过向非结构化元模型添加一些关键点,您也许可以获得更好的性能。我会寻找可以防止内部推断的点 - 在上面的情况下,添加 (0.8, 0.1) 和 (0.8, 0.2) 的值可以帮助定义在这个广泛范围内的行为。

  4. 最终,如果您可以将数据转换为完全结构化的元模型,则可以消除内部外推,此外还可以利用一些更快的算法。

最终,半结构化元模型最适合用于具有明确定义区域的数据,您不希望在任何内部外推区域中查询表。