Finite difference weights for any derivative order on arbitrarily spaced grids.
Project Description
finitediff
==========
.. image:: http://hera.physchem.kth.se:9090/api/badges/bjodah/finitediff/status.svg
:target: http://hera.physchem.kth.se:9090/bjodah/finitediff
:alt: Build status
.. image:: https://img.shields.io/pypi/v/finitediff.svg
:target: https://pypi.python.org/pypi/finitediff
:alt: PyPI version
.. image:: https://img.shields.io/badge/python-2.7,3.4,3.5-blue.svg
:target: https://www.python.org/
:alt: Python version
.. image:: https://img.shields.io/pypi/l/finitediff.svg
:target: https://github.com/bjodah/finitediff/blob/master/LICENSE
:alt: License
.. image:: http://hera.physchem.kth.se/~finitediff/branches/master/htmlcov/coverage.svg
:target: http://hera.physchem.kth.se/~finitediff/branches/master/htmlcov
:alt: coverage
``finitediff`` containts two implementations (`Fortran 90
<src/finitediff_fort.f90>`_ and `C++ <finitediff/include/finitediff_templated.hpp>`_) version of Begnt Fornberg's
formulae for generation of finite difference weights on aribtrarily
spaced one dimensional grids. The finite difference weights can be
used for optimized inter-/extrapolation data series for up to
arbitrary derivative order. Python_ bindings are provided.
.. _Python: https://www.python.org
.. _finitediff: https://github.com/bjodah/finitediff
Capabilities
============
``finitediff`` currently provides callbacks for estimation of derivatives
or interpolation either at a single point or over an array (available
from the Python bindings).
The user may also manually generate the corresponding weights. (see
``calculate_weights``)
Documentation
-------------
Autogenerated API documentation for latest stable release is found here:
`<https://bjodah.github.io/finitediff/latest>`_
(and the development version for the current master branch is found here:
`<http://hera.physchem.kth.se/~finitediff/branches/master/html>`_).
Examples
--------
Generating finite difference weights is simple using C++11:
.. code:: C++
#include "finitediff_templated.hpp"
#include <vector>
#include <string>
#include <iostream>
int main(){
const unsigned max_deriv = 2;
std::vector<std::string> labels {"0th derivative", "1st derivative", "2nd derivative"};
std::vector<double> x {0, 1, -1, 2, -2}; // Fourth order of accuracy
auto coeffs = finitediff::generate_weights(x, max_deriv);
for (unsigned deriv_i = 0; deriv_i <= max_deriv; deriv_i++){
std::cout << labels[deriv_i] << ": ";
for (unsigned idx = 0; idx < x.size(); idx++){
std::cout << coeffs[deriv_i*x.size() + idx] << " ";
}
std::cout << std::endl;
}
}
::
$ cd examples/
$ g++ -std=c++11 demo.cpp -I../include
$ ./a.out
Zeroth derivative (interpolation): 1 -0 0 0 -0
First derivative: -0 0.666667 -0.666667 -0.0833333 0.0833333
Second derivative: -2.5 1.33333 1.33333 -0.0833333 -0.0833333
and of course using the python bindings:
.. code:: python
>>> from finitediff import get_weights
>>> import numpy as np
>>> c = get_weights(np.array([-1., 0, 1]), 0, maxorder=1)
>>> np.allclose(c[:, 1], [-.5, 0, .5])
True
see the ``examples/`` directory for more examples.
Installation
------------
The simplest way to install finitediff is to use
`conda package manager <http://conda.pydata.org/docs/>`_:
::
$ conda install -c bjodah finitediff pytest
alternatively, you may also use `pip`:
::
$ python -m pip install --user finitediff
(you can skip the ``--user`` flag if you have got root permissions), to run the
tests you need ``pytest`` too:
::
$ python -m pip install --user --upgrade pytest
$ python -m pytest --pyargs finitediff
Dependencies
============
You need either a C++ or a Fortran 90 compiler. On debian based linux systems you may install one by issuing::
$ sudo apt-get install gfortran g++
See `setup.py <setup.py>`_ for optional (Python) dependencies.
Notes
=====
There is a git subtree under finitediff, update through::
git subtree pull --prefix finitediff/external/newton_interval newton_interval master --squash
where the repo "newton_interval" is https://github.com/bjodah/newton_interval.git
First time you need to add it::
git subtree add --prefix finitediff/external/newton_interval git://github.com/bjodah/newton_interval master
References
==========
The algortihm is a Fortran 90 rewrite of:
http://dx.doi.org/10.1137/S0036144596322507
::
@article{fornberg_classroom_1998,
title={Classroom note: Calculation of weights in finite difference formulas},
author={Fornberg, Bengt},
journal={SIAM review},
volume={40},
number={3},
pages={685--691},
year={1998},
publisher={SIAM}
doi={10.1137/S0036144596322507}
}
Which is based on an article of the same author:
http://dx.doi.org/10.1090/S0025-5718-1988-0935077-0
::
@article{fornberg_generation_1988,
title={Generation of finite difference formulas on arbitrarily spaced grids},
author={Fornberg, Bengt},
journal={Mathematics of computation},
volume={51},
number={184},
pages={699--706},
year={1988}
doi={10.1090/S0025-5718-1988-0935077-0}
}
License
=======
The source code is Open Source and is released under the very permissive
`"simplified (2-clause) BSD license" <https://opensource.org/licenses/BSD-2-Clause>`_.
See `LICENSE <LICENSE>`_ for further details.
Authors
=======
See file `AUTHORS <AUTHORS>`_ in root.
==========
.. image:: http://hera.physchem.kth.se:9090/api/badges/bjodah/finitediff/status.svg
:target: http://hera.physchem.kth.se:9090/bjodah/finitediff
:alt: Build status
.. image:: https://img.shields.io/pypi/v/finitediff.svg
:target: https://pypi.python.org/pypi/finitediff
:alt: PyPI version
.. image:: https://img.shields.io/badge/python-2.7,3.4,3.5-blue.svg
:target: https://www.python.org/
:alt: Python version
.. image:: https://img.shields.io/pypi/l/finitediff.svg
:target: https://github.com/bjodah/finitediff/blob/master/LICENSE
:alt: License
.. image:: http://hera.physchem.kth.se/~finitediff/branches/master/htmlcov/coverage.svg
:target: http://hera.physchem.kth.se/~finitediff/branches/master/htmlcov
:alt: coverage
``finitediff`` containts two implementations (`Fortran 90
<src/finitediff_fort.f90>`_ and `C++ <finitediff/include/finitediff_templated.hpp>`_) version of Begnt Fornberg's
formulae for generation of finite difference weights on aribtrarily
spaced one dimensional grids. The finite difference weights can be
used for optimized inter-/extrapolation data series for up to
arbitrary derivative order. Python_ bindings are provided.
.. _Python: https://www.python.org
.. _finitediff: https://github.com/bjodah/finitediff
Capabilities
============
``finitediff`` currently provides callbacks for estimation of derivatives
or interpolation either at a single point or over an array (available
from the Python bindings).
The user may also manually generate the corresponding weights. (see
``calculate_weights``)
Documentation
-------------
Autogenerated API documentation for latest stable release is found here:
`<https://bjodah.github.io/finitediff/latest>`_
(and the development version for the current master branch is found here:
`<http://hera.physchem.kth.se/~finitediff/branches/master/html>`_).
Examples
--------
Generating finite difference weights is simple using C++11:
.. code:: C++
#include "finitediff_templated.hpp"
#include <vector>
#include <string>
#include <iostream>
int main(){
const unsigned max_deriv = 2;
std::vector<std::string> labels {"0th derivative", "1st derivative", "2nd derivative"};
std::vector<double> x {0, 1, -1, 2, -2}; // Fourth order of accuracy
auto coeffs = finitediff::generate_weights(x, max_deriv);
for (unsigned deriv_i = 0; deriv_i <= max_deriv; deriv_i++){
std::cout << labels[deriv_i] << ": ";
for (unsigned idx = 0; idx < x.size(); idx++){
std::cout << coeffs[deriv_i*x.size() + idx] << " ";
}
std::cout << std::endl;
}
}
::
$ cd examples/
$ g++ -std=c++11 demo.cpp -I../include
$ ./a.out
Zeroth derivative (interpolation): 1 -0 0 0 -0
First derivative: -0 0.666667 -0.666667 -0.0833333 0.0833333
Second derivative: -2.5 1.33333 1.33333 -0.0833333 -0.0833333
and of course using the python bindings:
.. code:: python
>>> from finitediff import get_weights
>>> import numpy as np
>>> c = get_weights(np.array([-1., 0, 1]), 0, maxorder=1)
>>> np.allclose(c[:, 1], [-.5, 0, .5])
True
see the ``examples/`` directory for more examples.
Installation
------------
The simplest way to install finitediff is to use
`conda package manager <http://conda.pydata.org/docs/>`_:
::
$ conda install -c bjodah finitediff pytest
alternatively, you may also use `pip`:
::
$ python -m pip install --user finitediff
(you can skip the ``--user`` flag if you have got root permissions), to run the
tests you need ``pytest`` too:
::
$ python -m pip install --user --upgrade pytest
$ python -m pytest --pyargs finitediff
Dependencies
============
You need either a C++ or a Fortran 90 compiler. On debian based linux systems you may install one by issuing::
$ sudo apt-get install gfortran g++
See `setup.py <setup.py>`_ for optional (Python) dependencies.
Notes
=====
There is a git subtree under finitediff, update through::
git subtree pull --prefix finitediff/external/newton_interval newton_interval master --squash
where the repo "newton_interval" is https://github.com/bjodah/newton_interval.git
First time you need to add it::
git subtree add --prefix finitediff/external/newton_interval git://github.com/bjodah/newton_interval master
References
==========
The algortihm is a Fortran 90 rewrite of:
http://dx.doi.org/10.1137/S0036144596322507
::
@article{fornberg_classroom_1998,
title={Classroom note: Calculation of weights in finite difference formulas},
author={Fornberg, Bengt},
journal={SIAM review},
volume={40},
number={3},
pages={685--691},
year={1998},
publisher={SIAM}
doi={10.1137/S0036144596322507}
}
Which is based on an article of the same author:
http://dx.doi.org/10.1090/S0025-5718-1988-0935077-0
::
@article{fornberg_generation_1988,
title={Generation of finite difference formulas on arbitrarily spaced grids},
author={Fornberg, Bengt},
journal={Mathematics of computation},
volume={51},
number={184},
pages={699--706},
year={1988}
doi={10.1090/S0025-5718-1988-0935077-0}
}
License
=======
The source code is Open Source and is released under the very permissive
`"simplified (2-clause) BSD license" <https://opensource.org/licenses/BSD-2-Clause>`_.
See `LICENSE <LICENSE>`_ for further details.
Authors
=======
See file `AUTHORS <AUTHORS>`_ in root.
Release history Release notifications
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Filename, size & hash SHA256 hash help | File type | Python version | Upload date |
---|---|---|---|
finitediff-0.3.5.tar.gz (127.9 kB) Copy SHA256 hash SHA256 | Source | None | Mar 14, 2017 |