【发布时间】:2023-03-20 08:21:01
【问题描述】:
我有点困惑如何在各个设计变量上指定 FD 步长。在旧的 OpenMDAO 中,可以在添加 desvar 时指定步长。在新版本中add_desvar 没有这个参数,所以我尝试在IndepVarComp 的fd_options 上设置它,也不起作用。这对我来说不是那么直观,我必须将它设置在下游组件上。但是如果我不得不这样做,我将如何在设置时将它设置在每个单独的参数上?我可能遗漏了一些东西,但您能否让我知道如何在下面的示例中使用prob.root.sub.p1 和force_fd 设置整个问题的步长。
from openmdao.api import Component, Group, Problem, IndepVarComp
class MyComp(Component):
def __init__(self):
super(MyComp, self).__init__()
# Params
self.add_param('x1', 3.0, step_size = 1e-2)
self.add_param('x2', 3.0)
# Unknowns
self.add_output('y', 5.5)
def solve_nonlinear(self, params, unknowns, resids):
""" Doesn't do much. """
unknowns['y'] = 7.0*params['x1']**2 + 7.0*params['x2']**2
prob = Problem()
prob.root = Group()
sub = prob.root.add('sub', Group())
comp = prob.root.add('comp', MyComp())
p1 = sub.add('p1', IndepVarComp([('x1', 3.0), ('x2', 3.0)]))
# this has no effect
prob.root.sub.p1.fd_options['step_size'] = 1.0e-1
prob.root.connect('sub.p1.x1', 'comp.x1')
prob.root.connect('sub.p1.x2', 'comp.x2')
prob.root.fd_options['force_fd'] = True
prob.setup(check=False)
prob.run()
J = prob.calc_gradient(['sub.p1.x1', 'sub.p1.x2'], ['comp.y'], return_format='dict')
print J
如果我在System.fd_jacobian 中打印 mydict 以及我看到的步长:
('mydict', {'shape': 1, 'step_size': 0.01, 'pathname': 'comp.x1', 'val': 3.0, 'promoted_name': 'comp.x1', 'top_promoted_name': 'comp.x1', 'size': 1})
('FD', 'comp.x1', 0.01)
('mydict', {'val': 3.0, 'promoted_name': 'comp.x2', 'shape': 1, 'pathname': 'comp.x2', 'top_promoted_name': 'comp.x2', 'size': 1})
('FD', 'comp.x2', 1e-06)
{'comp.y': {'sub.p1.x1': array([[ 42.07]]), 'sub.p1.x2': array([[ 42.000007]])}}
谢谢!
【问题讨论】:
标签: openmdao