#! /usr/bin/env python # def himmelblau ( m, x ): #*****************************************************************************80 # ## HIMMELBLAU computes the Himmelblau function. # # Discussion: # # This function has 4 global minima: # # X* = ( 3, 2 ), F(X*) = 0. # X* = ( 3.58439, -1.84813 ), F(X*) = 0. # X* = ( -3.77934, -3.28317 ), F(X*) = 0. # X* = ( -2.80512, 3.13134 ), F(X*) = 0. # # Suggested starting points are # # (+1,+1), # (-1,+1), # (-1,-1), # (+1,-1), # # Licensing: # # This code is distributed under the GNU LGPL license. # # Modified: # # 23 January 2016 # # Author: # # John Burkardt # # Reference: # # David Himmelblau, # Applied Nonlinear Programming, # McGraw Hill, 1972, # ISBN13: 978-0070289215, # LC: T57.8.H55. # # Parameters: # # Input, integer M, the number of variables. # # Input, real X(M), the argument of the function. # # Output, real F, the value of the function at X. # f = ( x[0] ** 2 + x[1] - 11.0 ) ** 2 \ + ( x[0] + x[1] ** 2 - 7.0 ) ** 2 return f def himmelblau_test ( ): #*****************************************************************************80 # ## HIMMELBLAU_TEST works with the Himmelblau function. # # Licensing: # # This code is distributed under the GNU LGPL license. # # Modified: # # 23 January 2016 # # Author: # # John Burkardt # import numpy as np import platform from compass_search import compass_search from r8vec_print import r8vec_print print ( '' ) print ( 'HIMMELBLAU_TEST:' ) print ( ' Python version: %s' % ( platform.python_version ( ) ) ) print ( ' Test COMPASS_SEARCH with the Himmelblau function.' ) m = 2 delta_tol = 0.00001 delta = 0.3 k_max = 20000 x = np.array ( [ 1.0, 1.0 ] ) r8vec_print ( m, x, ' Initial point X0:' ) print ( '' ) print ( ' F(X0) = %g' % ( himmelblau ( m, x ) ) ) x, fx, k = compass_search ( himmelblau, m, x, delta_tol, delta, k_max ) r8vec_print ( m, x, ' Estimated minimizer X1:' ) print ( '' ) print ( ' F(X1) = %g, number of steps = %d' % ( fx, k ) ) x = np.array ( [ -1.0, 1.0 ] ) r8vec_print ( m, x, ' Initial point X0:' ) print ( '' ) print ( ' F(X0) = %g' % ( himmelblau ( m, x ) ) ) x, fx, k = compass_search ( himmelblau, m, x, delta_tol, delta, k_max ) r8vec_print ( m, x, ' Estimated minimizer X1:' ) print ( '' ) print ( ' F(X1) = %g, number of steps = %d' % ( fx, k ) ) x = np.array ( [ -1.0, -1.0 ] ) r8vec_print ( m, x, ' Initial point X0:' ) print ( '' ) print ( ' F(X0) = %g' % ( himmelblau ( m, x ) ) ) x, fx, k = compass_search ( himmelblau, m, x, delta_tol, delta, k_max ) r8vec_print ( m, x, ' Estimated minimizer X1:' ) print ( '' ) print ( ' F(X1) = %g, number of steps = %d' % ( fx, k ) ) x = np.array ( [ 1.0, -1.0 ] ) r8vec_print ( m, x, ' Initial point X0:' ) print ( '' ) print ( ' F(X0) = %g' % ( himmelblau ( m, x ) ) ) x, fx, k = compass_search ( himmelblau, m, x, delta_tol, delta, k_max ) r8vec_print ( m, x, ' Estimated minimizer X1:' ) print ( '' ) print ( ' F(X1) = %g, number of steps = %d' % ( fx, k ) ) # # Demonstrate Himmelblau minimizers. # x = np.array ( [ 3.0, 2.0 ] ) r8vec_print ( m, x, ' Correct Himmelblau minimizer X1*:' ) print ( '' ) print ( ' F(X*) = %g' % ( himmelblau ( m, x ) ) ) x = np.array ( [ 3.58439, -1.84813 ] ) r8vec_print ( m, x, ' Correct Himmelblau minimizer X2*:' ) print ( '' ) print ( ' F(X*) = %g' % ( himmelblau ( m, x ) ) ) x = np.array ( [ -3.77934, -3.28317 ] ) r8vec_print ( m, x, ' Correct Himmelblau minimizer X3*:' ) print ( '' ) print ( ' F(X*) = %g' % ( himmelblau ( m, x ) ) ) x = np.array ( [ -2.80512, 3.13134 ] ) r8vec_print ( m, x, ' Correct Himmelblau minimizer X4*:' ) print ( '' ) print ( ' F(X*) = %g' % ( himmelblau ( m, x ) ) ) # # Terminate. # print ( '' ) print ( 'HIMMELBLAU_TEST' ) print ( ' Normal end of execution.' ) return if ( __name__ == '__main__' ): from timestamp import timestamp timestamp ( ) himmelblau_test ( ) timestamp ( )