如何在OpenMDAO中仅计算约束梯度,不计算目标函数梯度?
解决OpenMDAO仅计算约束梯度不计算目标梯度的问题
问题根源
你调用的prob.driver._compute_totals是驱动程序的内部方法,会受优化驱动的配置逻辑影响(比如驱动默认会预计算目标函数梯度以支持优化流程),因此即便指定了仅计算约束梯度,仍会触发目标相关组件的偏导数计算。
核心解决方案
直接使用OpenMDAO问题实例的compute_totals方法,而非驱动程序的内部方法。该方法会严格按照你指定的of(输出变量)和wrt(输入变量)计算总梯度,不会额外触发无关组件的偏导数计算。
修改示例代码的最后一行:
print('computing constraint partials') res = prob.compute_totals(of='y1', wrt='x')
验证结果
运行修改后的代码,只会打印I need these partials,不会触发comp2的compute_partials方法,完全符合仅计算约束梯度的需求。
进阶优化(针对优化流程场景)
如果是在优化过程中需要控制梯度计算范围,可以通过以下方式配置:
- 使用
driver.declare_coloring并指定includes参数,明确只包含约束相关变量,进一步减少不必要的计算:prob.driver.declare_coloring(includes=['y1'], wrt=['x'], show_summary=True) - 若优化逻辑确实不需要目标梯度,可通过调整驱动的导数计算选项,禁用目标函数的梯度计算(需根据具体驱动类型调整)。
内容的提问来源于stack exchange,提问作者kilojoules
相关产品推荐
相关产品推荐

