OpenMDAOで非線形最適化問題を実行していますが、これは最適解を知っています (解を検証したいだけです)。fromSLSQP
のドライバー構成を使用しています。ScipyOptimizer
openmdao.api
3 つの設計変数 A、B、C、それぞれの設計空間 (A の A最小から A最大など)、および単一の目的関数 Z があります。前述のように、3 つの設計変数すべての最適値を知っています。 (それらを A sol、 B sol、 C solと呼びましょう) Z の最小値を生成します (Z solと呼びます)。
この問題を実行すると、Z solよりも大きい Z の値が得られます。これは、最適解ではないことを示しています。C solを Cに割り当て、設計変数として A と B のみを使用して問題を実行すると、Z solにはるかに近く、実際には以前に取得した値よりも小さい Z の値が得られます (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
し、(私が持っているソリューションから) 最適な値を割り当てると、かなり正しい結果、つまり前のシナリオよりも少ない目的関数の答えが得られます。