是否可以设置初始值以用于优化?

Is it possible to set initial values to use in optimisation?

我目前正在使用 SQSLP,并像这样定义我的设计变量:

p.model.add_design_var('indeps.upperWeights', lower=np.array([1E-3, 1E-3, 1E-3]))
p.model.add_design_var('indeps.lowerWeights', upper=np.array([-1E-3, -1E-3, -1E-3]))
p.model.add_constraint('cl', equals=1)
p.model.add_objective('cd')

p.driver = om.ScipyOptimizeDriver()

但是,它坚持对两个变量都尝试 [1, 1, 1]。由于程序的结构,我无法在组件中使用 val=[...] 进行覆盖。

是否可以让优化器接受一些初始值,而不是尝试将没有默认值的任何值设置为 1?

默认情况下,OpenMDAO 将变量初始化为值 1.0(这往往会避免在初始化为零时意外被零除)。

  1. 在输入或输出上指定 shape=... 会导致变量值由 1.0

  2. 填充
  3. 指定 val=... 使用给定值作为默认值。

但这只是默认值。通常,当您 运行 优化时,您需要为手头的给定问题指定变量的初始值。这是在设置之后通过问题对象完成的。

问题中的 set_valget_val 方法允许用户转换单位。 (这里以牛顿为例)

p.set_val('indeps.upperWeights', np.array([1E-3, 1E-3, 1E-3]), units='N')
p.set_val('indeps.upperWeights', np.array([-1E-3, -1E-3, -1E-3]), units='N')

有相应的 get_val 方法可以在优化后以所需的单位检索值。

您还可以像访问字典一样访问问题对象,尽管这样做会移除指定单位的能力(您会以其本机单位获取变量值)。

p['indeps.upperWeights'] = np.array([1E-3, 1E-3, 1E-3])
p['indeps.upperWeights'] = np.array([-1E-3, -1E-3, -1E-3])