如果我在通过add_desvar方法定义设计变量时没有指定下限,看起来变量的默认下限设置为等于sys.float_info.min(在我的机器上是 2.2250738585072014e-308)(它看起来这是在发行版(1.5.0 Alpha) 的文件openmdao/core/driver.py的第 330 行左右完成的。
这可以通过在执行问题的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 文档中,sys.float_info.min被描述为“最小正归一化浮点数”,这是一个非常小的正数。默认的最小界限不应该是最大的负浮点数吗?设计变量只能是正数吗?你能帮我理解这里发生了什么吗?
谢谢