我正在使用有限差分方案来查找梯度。 可以说我在一个组件中有2个输出(y1,y2)和1个输入(x)。事先我知道y1对x的灵敏度与y2对x的灵敏度不同。这样我可能会有两种不同的步骤;
self.declare_partials(of=y1, wrt=x, method='fd',step=0.01, form='central')
self.declare_partials(of=y2, wrt=x, method='fd',step=0.05, form='central')
没有任何东西(从算法上)阻止我,但尚不清楚在这种情况下,openmdao梯度计算到底会做什么?
它是否通过查看步长比或简单地独立对待步长从而交换计算时间来交换步长不同的情况下的信息?
答案 0 :(得分:0)
我刚刚对此进行了测试,它对两个不同的步长执行了两次有限差分,并且只保存了每个步骤的请求输出。我认为我们无法按照您所建议的那样对比率做任何事情,因为使用不同的步进大小来解析单个输出的原因是因为您不相信较小(或较大)步进大小下输出的准确性。>
答案 1 :(得分:0)
这是一个有关API效果的公平问题。在典型的FD应用程序中,每个设计变量对于正向和反向差异仅获得1个函数调用,而对于中央差异则仅获得2个函数调用。
但是,在这种情况下,您已经为两个不同的输出要求了两个不同的步长,两者都具有中心差。因此,在这里,您将获得4个函数调用来计算所有导数。 dy1_dx将使用.01的步长进行计算,而dy2_dx将使用.05的步长进行计算。
两个不同的FD调用之间没有串扰,并且最终您得到的函数调用要比仅通过以下方式指定单个步长时要多:
self.declare_partials(of='*', wrt=x, method='fd',step=0.05, form='central')
如果成本可以承受,并且精度得到提高,则可以使用此方法为不同的输出获得不同的步长。