我想我了解数字/算法上要执行的复杂步骤。
但是问题仍然存在。前两个问题可能具有相同的答案。
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没有任何意义。我有点困惑。
答案 0 :(得分:0)
使用复杂算术来计算导数近似值的能力基于复杂算术的数学。 您应该阅读有关the theory的信息,以更好地了解其工作原理以及如何通过复数步长法与有限差分法解决步长问题。
您无法对复杂步骤方法进行任何物理解释。您只是利用复杂算术的数学属性以比FD更精确的方式近似导数。因此,关键在于您的代码已设置为正确执行复数运算。
有时,工程分析实际上确实利用了复数。 Jukowski Transformation是航空航天业的一个例子。在电气工程中,load-flow analysis交流电路始终会出现复数。如果您有这样的分析,则由于分析本身已经很复杂,因此您将无法轻松地使用复杂步骤来近似导数。在这些情况下,从技术上讲,可以使用更通用的数字类hyper dual numbers,但OpenMDAO不支持此类型。因此,如果您进行了这样的分析,则无法使用复杂步骤。
此外,偶尔会有一些方法不是复杂步骤安全的实现,除非您定义了新的复杂步骤安全版本,否则这些方法的实现将使您无法使用它。最简单的示例是python的numpy库中的np.absolute()
方法。传递复数时,此方法的实现将返回该数字的绝对大小:
abs(a+bj) = sqrt(1^2 + 1^2) = 1.4142
虽然在数学上不是不正确的,但此实现会弄乱复数步导数近似值。 相反,您需要提供以下版本的备用版本:
abs(a+bj) = abs(a) + abs(b)*j
因此,总而言之,您需要注意这些不能正确实现以用于复杂步骤的功能。如果具有这些功能,则需要使用它们的替代的复杂步骤安全版本。同样,如果您的分析本身使用复数,那么您也不能使用复步导数近似。
关于步长问题,我再次请您参考this paper,以获取更多详细信息。基本思想是,无需减法消除,您就可以随意使用非常小步长和复杂步长,而不必担心由于数值问题而导致精度降低。因此,通常您将使用较小的1e-20作为步长。由于复步精度scalea的步长为^ 2,因此使用如此小的步长可以有效地获得准确的结果。如果您只走了很小的一步,您就不必担心大多数情况下的扩展问题。