Source code for openmdao.test_suite.components.branin

"""
Test objects for the single-discipline Branin (or Branin-Hoo) problem.

The Branin, or Branin-Hoo, function has three global minima. The recommended
values of a, b, c, r, s and t are:
a = 1
b = 5.1/(4pi2),
c = 5/pi,
r = 6,
s = 10 and
t = 1/(8pi).

This function is usually evaluated on the square x0 ~ [-5, 10], x1 ~ [0, 15].

The global minimum can be found at f(x) = 0.397887
"""
import numpy as np

import openmdao.api as om


[docs]class Branin(om.ExplicitComponent): """ The Branin test problem. This version is the standard version and contains two continuous parameters. """
[docs] def setup(self): """ Define the independent variables, output variables, and partials. """ # Inputs self.add_input('x0', 0.0) self.add_input('x1', 0.0) # Outputs self.add_output('f', val=0.0)
[docs] def setup_partials(self): self.declare_partials(of='f', wrt=['x0', 'x1'])
[docs] def compute(self, inputs, outputs): """ Define the function f(xI, xC). When Branin is used in a mixed integer problem, x0 is integer and x1 is continuous. """ x0 = inputs['x0'] x1 = inputs['x1'] a = 1.0 b = 5.1/(4.0*np.pi**2) c = 5.0/np.pi d = 6.0 e = 10.0 f = 1.0/(8.0*np.pi) outputs['f'] = a*(x1 - b*x0**2 + c*x0 - d)**2 + e*(1-f)*np.cos(x0) + e
[docs] def compute_partials(self, inputs, partials): """ Provide the Jacobian. """ x0 = inputs['x0'] x1 = inputs['x1'] a = 1.0 b = 5.1/(4.0*np.pi**2) c = 5.0/np.pi d = 6.0 e = 10.0 f = 1.0/(8.0*np.pi) partials['f', 'x1'] = 2.0*a*(x1 - b*x0**2 + c*x0 - d) partials['f', 'x0'] = 2.0*a*(x1 - b*x0**2 + c*x0 - d)*(-2.*b*x0 + c) - e*(1.-f)*np.sin(x0)
[docs]class BraninDiscrete(om.ExplicitComponent): """ The Branin test problem. This version defines a Discrete Variable in OpenMDAO. X0 is integer. """
[docs] def setup(self): """ Define the independent variables, output variables, and partials. """ # Inputs self.add_discrete_input('x0', 0) self.add_input('x1', 0.0) # Outputs self.add_output('f', val=0.0)
[docs] def setup_partials(self): self.declare_partials(of='f', wrt=['x1'])
[docs] def compute(self, inputs, outputs, discrete_inputs, discrete_outputs): """ Define the function f(xI, xC). Here, x0 is integer and x1 is continuous. """ x0 = discrete_inputs['x0'] x1 = inputs['x1'] a = 1.0 b = 5.1/(4.0*np.pi**2) c = 5.0/np.pi d = 6.0 e = 10.0 f = 1.0/(8.0*np.pi) outputs['f'] = a*(x1 - b*x0**2 + c*x0 - d)**2 + e*(1-f)*np.cos(x0) + e
[docs] def compute_partials(self, inputs, partials, discrete_inputs): """ Provide the Jacobian. """ x0 = discrete_inputs['x0'] x1 = inputs['x1'] a = 1.0 b = 5.1/(4.0*np.pi**2) c = 5.0/np.pi d = 6.0 e = 10.0 f = 1.0/(8.0*np.pi) partials['f', 'x1'] = 2.0*a*(x1 - b*x0**2 + c*x0 - d)
#partials['f', 'x0'] = 2.0*a*(x1 - b*x0**2 + c*x0 - d)*(-2.*b*x0 + c) - e*(1.-f)*np.sin(x0)