Source code for mathtoolspy.solver.minimize_algorithm_ndim_powell

# -*- coding: utf-8 -*-

# mathtoolspy
# -----------
# A fast, efficient Python library for mathematically operations, like
# integration, solver, distributions and other useful functions.
# 
# Author:   sonntagsgesicht, based on a fork of Deutsche Postbank [pbrisk]
# Version:  0.3, copyright Wednesday, 18 September 2019
# Website:  https://github.com/sonntagsgesicht/mathtoolspy
# License:  Apache License 2.0 (see LICENSE file)


from mathtoolspy.solver import minimize_algorithm_1dim_brent


[docs]class MinimizeAlgorithmNDimPowell(object): ''' The minimazation with the Powell algorithm. Press, et al., 'Numerical Recipes in C', 2nd ed, Powell (p.412). Minimization of a function func of n variables. Input consists of an initial starting point p[0..n-1]; an inital matrix xi[0..n-1,0..n-1], whose columns contain the initial set of directions (usually the n unit vectors); and ftol, the fractional tolerance in the function value such that failure to decrease by more than this amount on one iteration signals doneness. On output, p is set to best point found, xi is the then-current direction set, fret is the returned function value at p. The routine linmin is used. *** Initial matrix xi[0..n-1,0..n-1], whose columns contain the initial set of directions (usually the n unit vectors). On output xi is the then-current direction set. *** Initial starting point p[0..n-1]. On output p is set to best point found. ''' TINY = 1.0e-25 TOL = 2.0e-4 def __init__(self): self.brent = minimize_algorithm_1dim_brent
[docs] def FindMinimun(self, fct, initial_point, tol): ndim = initial_point.count() # On output Powell sets the initial point to best point found. tpoint = initial_point # Choose the unit vectors as initial set of directions. directions = self._initialize_directions(ndim) # Locate the minimum and store the number of iterations. r = self.powell(directions, tpoint, ndim, tol, fct) return r
def _initialize_directions(self, ndim): ret = ((0 if i != j else 1 for i in range(ndim)) for j in range(ndim)) return ret
[docs] def powell(self, initial_xvalues, initial_fvalues, ndim, tol, fct): p = initial_fvalues xi = initial_xvalues