我在OpenMDAO中运行一个非线性优化问题,我知道它的最佳解决方案(我只想验证解决方案)。我正在使用fromSLSQP
的驱动程序配置。ScipyOptimizer
openmdao.api
我有 3 个设计变量 A、B 和 C,它们各自的设计空间(A 的最小到最大A 等等)和一个目标函数 Z。正如我所说,我知道所有三个设计变量的最佳值(我们称它们为 A sol、 B sol和 C sol),它们产生 Z 的最小值(称之为 Z sol)。
当我运行这个问题时,我得到的 Z 值大于 Z sol,表明它不是最优解。当我将 C sol分配给 C 并仅使用 A 和 B 作为设计变量来运行问题时,我得到的 Z 值更接近 Z sol并且实际上小于我之前得到的值(在 3 个设计变量场景中)。
为什么我要观察这种行为?在这两种情况下不应该ScipyOptimizer
给出相同的解决方案吗?
编辑:添加一些代码..
from openmdao.api import IndepVarComp, Group, Problem
from openmdao.api import ScipyOptimizer
class RootGroup(Group):
def __init__(self):
super(RootGroup, self).__init__()
self.add('desvar_f', IndepVarComp('f', 0.08))
self.add('desvar_twc', IndepVarComp('tool_wear_compensation', 0.06))
self.add('desvar_V', IndepVarComp('V', 32.0))
# Some more config (adding components, connections etc.)
class TurningProblem_singlepart(Problem):
def __init__(self):
super(TurningProblem_singlepart, self).__init__()
self.root = RootGroup()
self.driver = ScipyOptimizer()
self.driver.options['optimizer'] = 'SLSQP'
self.driver.add_desvar('desvar_f.f', lower=0.08, upper=0.28)
self.driver.add_desvar('desvar_twc.tool_wear_compensation', lower=0.0, upper=0.5)
self.driver.add_desvar('desvar_V.V', lower=32.0, upper=70.0)
self.driver.add_objective('Inverse_inst.comp_output')
# Other config
这段代码给了我不正确的结果。当我desvar_twc
从两个类中删除并为其分配最佳值(从我拥有的解决方案中)时,我得到了相当正确的结果,即目标函数的答案小于前一个场景。