Проверьте частные производные и ошибку конечных разностей

В связи с моим предыдущим вопросом Проверка масштабированного параболоида и производных, я вижу, что вы исправили связанные чтобы запустить проблему один раз. Я хотел попробовать, но у меня все еще есть проблема с проверкой производных и конечными различиями, показанными в следующем коде:

""" Unconstrained optimization of the scaled paraboloid component."""

from __future__ import print_function
import sys
import numpy as np

from openmdao.api import IndepVarComp, Component, Problem, Group, ScipyOptimizer

class Paraboloid(Component):

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

        self.add_param('X', val=np.array([0.0, 0.0]))
        self.add_output('f_xy', val=0.0)

    def solve_nonlinear(self, params, unknowns, resids):
        X = params['X']
        x = X[0]
        y = X[1]
        unknowns['f_xy'] = (1000.*x-3.)**2 + (1000.*x)*(0.01*y) + (0.01*y+4.)**2 - 3.

    def linearize(self, params, unknowns, resids):
        """ Jacobian for our paraboloid."""
        X = params['X']
        J = {}

        x = X[0]
        y = X[1]

        J['f_xy', 'X'] = np.array([[ 2000000.0*x - 6000.0 + 10.0*y,
                                    0.0002*y + 0.08 + 10.0*x]])

        return J

if __name__ == "__main__":

    top = Problem()

    root = top.root = Group()
    #root.fd_options['force_fd'] = True    # Error if uncommented

    root.add('p1', IndepVarComp('X', np.array([3.0, -4.0])))
    root.add('p', Paraboloid())

    root.connect('p1.X', 'p.X')

    top.driver = ScipyOptimizer()
    top.driver.options['optimizer'] = 'SLSQP'

    top.driver.add_desvar('p1.X',
                          lower=np.array([-1000.0, -1000.0]),
                          upper=np.array([1000.0, 1000.0]),
                          scaler=np.array([1000., 0.001]))
    top.driver.add_objective('p.f_xy')


    top.setup()
    top.check_partial_derivatives()
    top.run()
    top.check_partial_derivatives()

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

Первая проверка работает нормально, но вторая check_partial_derivatives дает странные результаты для FD:

[...]
Partial Derivatives Check

----------------
Component: 'p'
----------------
  p: 'f_xy' wrt 'X'

    Forward Magnitude : 1.771706e-04
    Reverse Magnitude : 1.771706e-04
         Fd Magnitude : 9.998228e-01

    Absolute Error (Jfor - Jfd) : 1.000000e+00
    Absolute Error (Jrev - Jfd) : 1.000000e+00
    Absolute Error (Jfor - Jrev): 0.000000e+00

    Relative Error (Jfor - Jfd) : 1.000177e+00
    Relative Error (Jrev - Jfd) : 1.000177e+00
    Relative Error (Jfor - Jrev): 0.000000e+00

    Raw Forward Derivative (Jfor)

[[ -1.77170624e-04  -8.89040341e-10]]

    Raw Reverse Derivative (Jrev)

[[ -1.77170624e-04  -8.89040341e-10]]

    Raw FD Derivative (Jfd)

[[ 0.99982282  0.        ]]

Minimum of -27.333333 found at ([  6.66666658e-03  -7.33333333e+02])

И (может быть, не связано), когда я пытаюсь установить root.fd_options['force_fd'] = True (просто посмотреть), я получаю ошибку при первой проверке:

Partial Derivatives Check

----------------
Component: 'p'
----------------
Traceback (most recent call last):
  File "C:\Program Files (x86)\Wing IDE 101 5.0\src\debug\tserver\_sandbox.py", line 59, in 
  File "d:\rlafage\OpenMDAO\OpenMDAO\openmdao\core\problem.py", line 1827, in check_partial_derivatives
    u_size = np.size(dunknowns[u_name])
  File "d:\rlafage\OpenMDAO\OpenMDAO\openmdao\core\vec_wrapper.py", line 398, in __getitem__
    return self._dat[name].get()
  File "d:\rlafage\OpenMDAO\OpenMDAO\openmdao\core\vec_wrapper.py", line 223, in _get_scalar
    return self.val[0]
IndexError: index 0 is out of bounds for axis 0 with size 0

Я работаю с OpenMDAO HEAD (d1e12d4).


person relf    schedule 04.04.2016    source источник


Ответы (1)


Это просто проблема размера шага для этой конечной разницы. 2-й ФД возникает в другой точке (оптимум), и в этой точке он должен быть более чувствительным.

пробовал с центральной разницей

top.root.p.fd_options['form'] = 'central'

И получил гораздо лучшие результаты.

----------------
Component: 'p'
----------------
p: 'f_xy' wrt 'X'

Forward Magnitude : 1.771706e-04
Reverse Magnitude : 1.771706e-04
     Fd Magnitude : 1.771738e-04

Исключение, когда вы устанавливаете «fd», является реальной ошибкой, связанной с масштабированием des_var, являющегося массивом. Спасибо за отчет об этом; мы получим историю, чтобы исправить это.

person Kenneth Moore    schedule 04.04.2016