首页 > 解决方案 > 理解物理意义上的复杂步骤

问题描述

我想我理解数字/算法上的复杂步骤是什么。

但问题仍然存在。前两个问题可能有相同的答案。

1- 我用复杂的步骤替换了“Betz_limit”示例的偏导数计算,并删除了分析梯度。查看记录的 design_var 演变,没有一个值是复杂的?他们不应该以某种方式显示为a + bi吗?或者它总是踏入真实的空间。?

2- 绑定图片“cs”,用于物理概念。例如梁长度 (m)、质量目标 (kg) 和载荷约束 (Nm) 的设计变量。我可以使用显式组件来计算这些(纯python)或外部代码组件(纯fortran)。在数值上,它们都可以处理复数,但显然质量是一个实数值。因此,当我们说能够处理复数时,它只是处理 a+bi 的问题(实际质量始终为“a”而 b 始终等于 0?)

3-步长如何。我知道不会有任何减法取消错误,但如果我有一个设计变量标准化/缩放到 1 和 0.8 到 1.2 的范围。将步长减小到 1e-10 没有意义。我在那里有点困惑。

标签: openmdao

解决方案


使用复数算术计算导数近似值的能力是基于复数算术的数学。您应该阅读该理论,以更好地了解它的工作原理以及如何通过复杂步长与有限差分来解决步长问题。

对于复杂步骤方法,您无法做出任何物理解释。您只是利用复杂算术的数学特性以比 FD 更准确的方式逼近导数。因此,关键是您的代码设置为正确执行复数运算。

有时,工程分析确实会利用复数。一个航空航天的例子是Jukowski 变换。在电气工程中,复数一直用于交流电路的潮流分析。如果你有这样的分析,那么你不能轻易地使用复数步来逼近导数,因为分析本身已经很复杂了。在这些情况下,在技术上可以使用更通用的一类数字,称为超对偶数字,但 OpenMDAO 不支持这一点。所以如果你有这样的分析,你就不能使用复杂的步骤。

此外,偶尔有一些方法的实现不是复杂步骤安全的,这将阻止您使用它,除非您定义了一个新的复杂步骤安全版本。最简单的例子是np.absolute()python 的 numpy 库中的方法。这个的实现,当传递一个复数时,将返回数字的绝对大小:

abs(a+bj) = sqrt(1^2 + 1^2) = 1.4142

虽然在数学上不是不正确的,但这种实现会弄乱复阶导数近似。相反,您需要一个替代版本,它提供:

abs(a+bj) = abs(a) + abs(b)*j

因此,总而言之,您需要注意这些未正确实现的功能,无法与复杂步骤一起使用。如果您有这些功能,则需要使用它们的替代复杂步骤安全版本。此外,如果您的分析本身使用复数,那么您也不能使用复步导数近似。

关于您的步长问题,我再次请您参阅本文以获取更多详细信息。基本思想是,在没有减法抵消的情况下,您可以自由地使用非常小的步长和复杂的步长,而不必担心由于数值问题而失去准确性。因此,通常您将使用 1e-20 更小的步长。由于复杂步长精度标度为 step^2,因此使用如此小的步长可以有效地得到准确的结果。在大多数情况下,您不必担心扩展问题,只要您采取足够小的步骤即可。


推荐阅读