Contact Homework Home

Search

Week 8

Link to completed assignment

Problem 15.1

(a) The first thing we need to do is plot the Rosenbrock function, $$f = (1-x)^2 + 100(y-x^2)^2$$


      import matplotlib
      matplotlib.use('Agg')
      import matplotlib.pyplot as plt
      from mpl_toolkits import mplot3d
      import numpy as np

      def rosenbrock(x, y):
          return ((1 - x)**2 + 100*(y - x**2)**2)

      x = np.linspace(-1,1,1000)
      y = np.linspace(-1,1,1000)

      X, Y = np.meshgrid(x, y)
      F = rosenbrock(X, Y)

      fig = plt.figure()
      ax = plt.axes(projection='3d')
      ax.set_xlabel('x')
      ax.set_ylabel('y')
      ax.set_title('Rosenbrock function')
      surf = ax.plot_surface(X, Y, F, cmap='viridis', linewidth=0, antialiased=False)
      plt.savefig('./plots/search.png')
    
Rosenbrock Function Plot
Rosenbrock Function Plot

(b) Now, we will use the downhill simplex method to search for the function's minimum, starting from x = y = -1. Using the scipy.optimize.minimize function, we are able to determine the number of algorithm iterations and function evaluations used, as well as the final values of where the minimum is located.


      import numpy as np
      from scipy.optimize import minimize

      def rosenbrock(x):
        return ((1 - x[:-1])**2 + 100*(x[1:] - x[:-1]**2)**2)

      x0 = np.array([-1, -1])

      print(minimize(rosenbrock, x0, method='Nelder-Mead'))
  

Algorithm iterations 67
Function evaluations 125
Final minimum location (0.99999886, 0.99999542)

(c) We will now repeat this process in 10D instead of 2D, using the following D-dimensional generalization of the Rosenbrock function: $$f = \sum_{i=1}^{D-1} (1-x_{i-1})^2 + 100(x_i - x_{i-1}^2)^2$$ Starting with all xi at -1, we will again count the algorithm iterations and function evaluations.


      import numpy as np
      from scipy.optimize import minimize

      def rosenbrock(x):
        d = len(x)
        sum = 0
        for i in range(d):
          xi = x[i]
          xprev = x[i-1]
          new = (1-xprev)**2 + 100*(xi - xprev**2)**2
          sum = sum + new
        return sum

      x0 = np.array([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1])

      print(minimize(rosenbrock, x0, method='Nelder-Mead'))
  

Algorithm iterations 1048
Function evaluations 1459
Final minimum location (0.01023648, 0.01024337, 0.01023174, 0.01019699, 0.01016837, 0.01022307, 0.01023505, 0.0102289 , 0.01024435, 0.01018521)

(d) Now, we will repeat and compare the 2D and 10D Rosenbrock search with the conjugate gradient method.

(e) Now, we will repeat and compare the 2D and 10D Rosenbrock search with CMA-ES.

(f) Finally, we will explore how these algorithms perform in higher dimensions. We will specifically take a look at the D-dimensional generalization of the Rosenbrock function being evaluated by the Nelder-Mead method of various dimensions.


      import numpy as np
      from scipy.optimize import minimize

      Dim_analysis = [2, 3, 4, 5, 10, 12, 15]

      for D in Dim_analysis:

          def rosenbrock(x):
              d = len(x)
              sum = 0
              for i in range(d):
                  xi = x[i]
                  xprev = x[i-1]
                  new = (1-xprev)**2 + 100*(xi - xprev**2)**2
                  sum = sum + new
              return sum

          x0 = -1*np.ones(D)

          print(minimize(rosenbrock, x0, method='Nelder-Mead'))
    

Dimensions 2 3 4 5 10 12 15
Algorithm iterations 40 86 134 180 1048 1789 2341
Function evaluations 70 151 229 301 1459 2401* 3000*
*Maximum number of function evaluations was exceeded.