Powell's Method (Powell, 1964) is a derivative-free optimizer that minimises along a set of search directions, then updates the direction set to capture local curvature. Each outer iteration: line-search along every direction di, then add the cumulative displacement as a new direction (replacing the one that gave the largest decrease). HumpDay's
Powell is a faithful pure-Python port of scipy's method='Powell' with bounded golden-section / Brent-style line search and the standard direction-set update.
HumpDay's Powell at a glance
- Initial direction set: identity matrix — coordinate directions.
- Line search: bounded Brent search per direction, clipped to the unit cube.
- Direction update: after a full sweep, add xfinal − xstart as a new direction, replacing the direction that gave the largest decrease (standard Powell update).
- Convergence:
ftol = 1e-12on relative function change. Tightened from scipy's default 1e-4 so the algorithm uses its budget on smooth basins.
Interactive 3D Visualization
See Powell in action on 3D optimization surfaces:
Loading 3D visualization...
Requires WebGL support
Instructions: Choose a test function and algorithm, then click Start to watch the step-by-step optimization process.
Implementation Details
| Component | Details | Links |
|---|---|---|
| Original Algorithm |
Michael J.D. Powell Conjugate direction method for unconstrained optimization Derivative-free approach using line searches Published: 1964 |
Wikipedia |
| Reference Implementation |
SciPy optimize.minimize Method: 'Powell' scipy.optimize.minimize(method='powell') Package: scipy |
SciPy Docs Source |
| HumpDay Python |
HumpDay PowellPure-Python port of scipy's Powell with direction-set update and bounded Brent line search. No required dependencies. File: humpday/optimizers/scipy_algorithms.py
|
Source |
| HumpDay JavaScript |
Browser PowellMirrors the Python port. Class: Powell
|
JS Port |
Performance Characteristics
- Best for: Smooth, low-dimensional objectives where conjugate directions capture curvature without needing gradients.
- Worst for: High dimensions — the direction-set update degrades and the per-iteration cost grows.
- Per outer iteration: n line searches (each is a 1-D Brent search inside
[0, 1]), plus the direction-set update. - Relative to scipy.optimize Powell at
n_trials=200, n_dim=2: ties on sphere and Ackley; a small (2×) gap on Rosenbrock from the interpreter tax on the line searches. See SOTA status for the live numbers.
Educational Resources
- Powell's Method Wikipedia
- SciPy Optimization Guide
- Numerical Recipes (Chapter on Multidimensional Minimization)
Algorithm Theory
- Conjugate Directions: Method builds orthogonal search directions
- Line Search: Uses golden section or Brent's method for 1D optimization
- Direction Updates: Replaces oldest direction with new conjugate direction
- Quadratic Convergence: Finite termination on quadratic functions in n steps