Размер шага FD для отдельных переменных проекта

Я немного запутался в том, как указать размеры шага FD для отдельных переменных проекта. В старом OpenMDAO можно было указать размер шага при добавлении десвара. В новой версии у add_desvar нет этого аргумента, поэтому я попытался установить его в fd_options IndepVarComp, что тоже не сработало. Для меня это не настолько интуитивно понятно, что я должен установить его на нижестоящем компоненте. Но если бы мне пришлось сделать это таким образом, как бы я установил его для каждого отдельного параметра во время установки? Я, вероятно, что-то упустил, но не могли бы вы сообщить мне, как это сделать в приведенном ниже примере, где я пытаюсь установить размер шага 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

Если я напечатаю mydict в System.fd_jacobian и размер шага я увижу:

('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]])}}

Спасибо!


person frza    schedule 06.11.2015    source источник


Ответы (1)


Однако вы правы, у нас также было это на старом add_parametercall (эквивалент add_desvar сейчас) в классическом OpenMDAO, и мы еще не реализовали его повторно, поэтому, похоже, нам все еще нужно это сделать.

В то же время, единственный способ контролировать размер шага на уровне var — это установить step_size в нисходящей цели IndepVarComp соединения, что вы делаете с x1 в своем примере. Это обходной путь, который сделает то, что вы хотите, но, к сожалению, он немного неинтуитивен и, возможно, утомителен для широковещательных соединений.

person Kenneth Moore    schedule 06.11.2015