OpenMDAO add_desvar默认下限

时间:2016-01-22 19:47:43

标签: openmdao

如果在通过 add_desvar 方法定义设计变量时没有指定下限,则看起来该变量的默认下限设置为 sys.float_info.min (在我的机器上是2.2250738585072014e-308)(看起来这是在分发的文件 openmdao / core / driver.py 中的第330行左右完成的(1.5.0 Α))。

执行问题的 setup()方法后,可以通过打印 get_desvar_metadata()的结果来看到这一点。

以下是基于分发提供的 paraboloid_optimized_constrained.py 示例的示例:

""" Constrained optimization of the paraboloid component."""

from __future__ import print_function

from openmdao.api import IndepVarComp, Component, Problem, Group, ExecComp, ScipyOptimizer
from openmdao.recorders.dump_recorder import DumpRecorder


class Paraboloid(Component):
    """ Evaluates the equation f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3 """

    def __init__(self):
    super(Paraboloid, self).__init__()

    self.add_param('x', val=0.0)
    self.add_param('y', val=0.0)

    self.add_output('f_xy', val=0.0)

def solve_nonlinear(self, params, unknowns, resids):
    """f(x,y) = (x-3)^2 + xy + (y+4)^2 - 3"""

    x = params['x']
    y = params['y']

    unknowns['f_xy'] = (x-3.0)**2 + x*y + (y+4.0)**2 - 3.0

def linearize(self, params, unknowns, resids):
    """ Jacobian for our paraboloid."""

    x = params['x']
    y = params['y']
    J = {}

    J['f_xy', 'x'] = 2.0*x - 6.0 + y
    J['f_xy', 'y'] = 2.0*y + 8.0 + x
    return J

if __name__ == "__main__":

    dr = DumpRecorder()
    top = Problem()

    root = top.root = Group()

    root.add('p1', IndepVarComp('x', 3.0))
    root.add('p2', IndepVarComp('y', -4.0))
    root.add('p', Paraboloid())

    # Constraint Equation
    root.add('con', ExecComp('c = x-y'))

    root.connect('p1.x', 'p.x')
    root.connect('p2.y', 'p.y')
    root.connect('p.x', 'con.x')
    root.connect('p.y', 'con.y')

    top.driver = ScipyOptimizer()

    top.driver.options['optimizer'] = 'SLSQP'

    top.driver.add_recorder(dr)


    # top.driver.add_desvar('p1.x', lower=-50, upper=50)
    top.driver.add_desvar('p1.x')
    top.driver.add_desvar('p2.y', lower=-50, upper=50)
    top.driver.add_objective('p.f_xy')

    top.driver.add_constraint('con.c', lower=15.0, upper=1.0E99)

    top.setup()

    print( 'desvars_metadata = ', top.driver.get_desvar_metadata())

    top.run()

    print('\n')
    print('Minimum of %f found at (%f, %f)' % (top['p.f_xy'], top['p.x'], top['p.y']))

    print(' c = x-y = ', top['p.x'] - top['p.y'],   (top['p.x'] - top['p.y']) >= 15.0),  

    # Expected Output
    # Minimum of -27.083333 found at (7.166667, -7.833333)

pass

通过打印设计变量获得的结果'元数据是

desvars_metadata =  OrderedDict([('p1.x', OrderedDict([('lower', 2.2250738585072014e-308), ('upper', 1.7976931348623157e+308), ('adder', 0.0), ('scaler', 1.0), ('size', 1)])), ('p2.y', OrderedDict([('lower', -50.0), ('upper', 50.0), ('adder', 0.0), ('scaler', 1.0), ('size', 1)]))])

在python docs中, sys.float_info.min 被描述为"最小正标准化浮点数"这是一个非常小的正数。不应该是默认的最小界限是最大的负浮动吗?设计变量只能是正数吗?你能帮我理解这里发生了什么吗?

由于

1 个答案:

答案 0 :(得分:2)

感谢您报告此事。你是对的;这是一个错误,您提供的修复是正确的修复。我今天要修理一下。