2016-04-04 15 views
0

In Bezug auf meine vorherige Frage Scaled paraboloid and derivatives checking, sehe ich, dass Sie im Zusammenhang mit dem Ausführen des Problems einmal behoben. Ich wollte versuchen, aber ich habe immer noch ein Problem mit dem Derivaten Überprüfung und finiten Differenzen im folgenden Code gezeigt:Überprüfen Sie partielle Ableitungen und endliche Differenzen Fehler

""" 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'])) 

Erste Kontrolle funktioniert gut, aber die zweiten check_partial_derivatives gibt seltsame Ergebnisse für 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]) 

Und (nicht verwendet werden), wenn ich versuche, ich einen Fehler während der ersten Kontrolle bekommen zu setzen root.fd_options['force_fd'] = True (nur um zu sehen):

 
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 

ich arbeite mit OpenMDAO HEAD (d1e12d4).

Antwort

2

Dies ist nur ein Schrittgrößenproblem für diese endliche Differenz. Der zweite FD tritt an einem anderen Punkt (dem Optimum) auf und muss an diesem Punkt empfindlicher sein.

habe ich versucht, mit zentralem Unterschied

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

Und bekam viele bessere Ergebnisse.

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

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

Die Ausnahme, wenn Sie ‚fd‘ gesetzt ist ein echter zum Scaler des des_var bezogenen Fehler ein Array sein. Danke für den Bericht dazu; wir werden eine Geschichte erfinden, um es zu beheben.

Verwandte Themen