Я хочу решить MDA для Селлара, используя нелинейный решатель Ньютона для Группы.Я определил Дисциплины с производными (используя 'compute_partials'), но я хочу проверить количество обращений к Дисциплине 'compute' и 'compute_partials', когда вынуждаем или нет дисциплины не использовать свои аналитические производные (используя 'Declare_partials' в Задачеопределение).Проблема в том, что кажется, что функция 'compute_partials' все еще вызывается, хотя я заставляю ее не использовать.Вот пример (Sellar)
Итак, для Дисциплины 2 я добавляю счетчик и у меня есть
from openmdao.test_suite.components.sellar import SellarDis1, SellarDis2
class SellarDis2withDerivatives(SellarDis2):
"""
Component containing Discipline 2 -- derivatives version.
"""
def _do_declares(self):
# Analytic Derivs
self.declare_partials(of='*', wrt='*')
self.exec_count_d = 0
def compute_partials(self, inputs, J):
"""
Jacobian for Sellar discipline 2.
"""
y1 = inputs['y1']
if y1.real < 0.0:
y1 *= -1
J['y2', 'y1'] = .5*y1**-.5
J['y2', 'z'] = np.array([[1.0, 1.0]])
self.exec_count_d += 1
Я создаю аналогичный MDA как в документах OpendMDAO , новызывая SellarDis2withDerivatives, которые я создал, и SellarDis1withDerivatives и меняя нелинейный_сольвер для Newton_solver () следующим образом
cycle.add_subsystem('d1', SellarDis1withDerivatives(), promotes_inputs=['x', 'z', 'y2'], promotes_outputs=['y1'])
cycle.add_subsystem('d2', SellarDis2withDerivatives(), promotes_inputs=['z', 'y1'], promotes_outputs=['y2'])
# Nonlinear Block Gauss Seidel is a gradient free solver
cycle.nonlinear_solver = NewtonSolver()
cycle.linear_solver = DirectSolver()
Затем я запускаю следующую задачу
prob2 = Problem()
prob2.model = SellarMDA()
prob2.setup()
prob2.model.cycle.d1.declare_partials('*', '*', method='fd')
prob2.model.cycle.d2.declare_partials('*', '*', method='fd')
prob2['x'] = 2.
prob2['z'] = [-1., -1.]
prob2.run_model()
count = prob2.model.cycle.d2.exec_count_d
print("Number of derivatives calls (%i)"% (count))
И в результате я получаю
=====
цикл
NL: ньютон сходится за 3 итерации Количество вызовов производных (3)
Следовательно, похоже, что функция'compute_partials' все еще называется как-то (даже если производные вычисляются с помощью FD).Есть ли у кого объяснение?