Flexible function solvers
Project description
What is flexsolve?
flexsolve presents a flexible set of function solvers by defining alternative tolerance conditions for accepting a solution. These solvers also implement methods like Wegstein and Aitken-Steffensen acceleration to reach solutions quicker.
Installation
Get the latest version of flexsolve from PyPI. If you have an installation of Python with pip, simple install it with:
$ pip install flexsolve
To get the git version, run:
$ git clone git://github.com/yoelcortes/flexsolve
Documentation
Flexsolve includes the following solvers:
Solve x where f(x) = x:
fixed_point: Simple fixed point iteration.
wegstein: Wegstein’s accelerated iteration method.
aitken: Aitken-Steffensen accelerated iteration method.
Solve x where f(x) = 0 and x0 < x < x1:
bisection: Simple bisection method
false_position: Simple false position method.
IQ_interpolation: Quadratic interpolation solver (similar to scipy.optimize.brentq)
bounded_wegstein: False position method with Wegstein acceleration.
bounded_aitken: False position method with Aitken-Steffensen acceleration.
Solve x where f(x) = 0:
secant: Simple secant method.
wegstein_secant: Secant method with Wegstein acceleration.
aitken_secant: Secant method with Aitken acceleration.
Parameters for each solver are pretty consitent and straight forward:
f: objective function in the form of f(x, *args).
x: Root guess. Solver begins the iteration by evaluating f(x).
x0, x1: Root bracket. Solution must lie within x0 and x1.
xtol=1e-8: Solver stops when the root lies within xtol.
ytol=5e-8: Solver stops when the f(x) lies within ytol of the root.
yval=0: Root offset. Solver will find x where f(x) = yval.
args=(): Arguments to pass to f.
Here are some exmples using flexsolve’s Profiler object to test and compare different solvers:
>>> import flexsolve as flx
>>> from scipy import optimize as opt
>>> x0, x1 = [-5, 5]
>>> f = lambda x: x**3 - 40 + 2*x
>>> p = flx.Profiler(f) # When called, it returns f(x) and saves the results.
>>> opt.brentq(p, x0, x1, xtol=1e-8)
3.225240462778411
>>> p.archive('[Scipy] Brent-Q') # Save/archive results with given name
>>> opt.brenth(p, x0, x1)
3.2252404627917794
>>> p.archive('[Scipy] Brent-H')
>>> flx.IQ_interpolation(p, x0, x1)
3.225240462796626
>>> p.archive('IQ-interpolation')
>>> flx.bounded_wegstein(p, x0, x1)
3.225240462790051
>>> p.archive('Wegstein')
>>> x_aitken = flx.bounded_aitken(p, x0, x1)
3.2252404627883218
>>> p.archive('Aitken')
>>> p.plot(r'$f(x) = 0 = x^3 + 2 \cdot x - 40$ where $-5 < x < 5$')
>>> p = flx.Profiler(f)
>>> x_guess = -5
>>> flx.wegstein_secant(p, x_guess)
3.22524046279178
>>> p.archive('Wegstein')
>>> flx.aitken_secant(p, x_guess)
3.22524046279178
>>> p.archive('Aitken')
>>> flx.secant(p, x_guess)
3.2252404627918057
>>> p.archive('Secant')
>>> opt.newton(p, x_guess)
3.2252404627918065
>>> p.archive('[Scipy] Newton')
>>> p.plot(r'$f(x) = 0 = x^3 + 2 \cdot x - 40$')
>>> # Note that x = 40/x^2 - 2/x is the same
>>> # objective function as x**3 - 40 + 2*x = 0
>>> f = lambda x: 40/x**2 - 2/x
>>> p = flx.Profiler(f)
>>> x_guess = 5.
>>> flx.wegstein(p, x_guess)
3.2252404626726996
>>> p.archive('Wegstein')
>>> flx.aitken(p, x_guess)
3.2252404627250075
>>> p.archive('Aitken')
>>> p.plot(r'$f(x) = x = \frac{40}{x^2} - \frac{2}{x}$',
... markbounds=False)
>>> # Fixed iteration is non-convergent for this equation,
>>> # so we do not include it here
Bug reports
To report bugs, please use the eqsolvers’s Bug Tracker at:
License information
See LICENSE.txt for information on the terms & conditions for usage of this software, and a DISCLAIMER OF ALL WARRANTIES.
Although not required by the eqsolvers license, if it is convenient for you, please cite eqsolvers if used in your work. Please also consider contributing any changes you make back, and benefit the community.
Citation
To cite eqsolvers in publications use:
Yoel Cortes-Pena (2019). flexsolve: Flexible function solvers. https://github.com/yoelcortes/flexsolve
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for flexsolve-0.2.8-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | d2ab9579664bc09b0f345be385e4f255641b1f4d06825e14ca4ab1e33830dedd |
|
MD5 | 43ab9659c48c140399f57674a5b4e232 |
|
BLAKE2b-256 | a858d44282123023ebbe9bffbad96263e29d00396708c9bb7de7565310ea763e |