mirror of
https://github.com/fjosw/pyerrors.git
synced 2025-05-14 19:43:41 +02:00
feat: Added numerical integration of generic functions (#201)
* feat: Added numerical integration of generic functions * refactored integration routines * tests: two trivial tests for integration added. * docs: quad docstring corrected. * Small bugfix for integration without obs --------- Co-authored-by: Fabian Joswig <fabian.joswig@ed.ac.uk>
This commit is contained in:
parent
8736d1cd3c
commit
6dcd0c3518
4 changed files with 141 additions and 2 deletions
51
tests/integrate_test.py
Normal file
51
tests/integrate_test.py
Normal file
|
@ -0,0 +1,51 @@
|
|||
import numpy as np
|
||||
import autograd.numpy as anp
|
||||
import pyerrors as pe
|
||||
|
||||
|
||||
def test_integration():
|
||||
def f(p, x):
|
||||
return p[0] * x + p[1] * x**2 - p[2] / x
|
||||
|
||||
def F(p, x):
|
||||
return p[0] * x**2 / 2. + p[1] * x**3 / 3. - anp.log(x) * p[2]
|
||||
|
||||
def check_ana_vs_int(p, l, u, **kwargs):
|
||||
numint_full = pe.integrate.quad(f, p, l, u, **kwargs)
|
||||
numint = numint_full[0]
|
||||
|
||||
anaint = F(p, u) - F(p, l)
|
||||
diff = (numint - anaint)
|
||||
|
||||
if isinstance(numint, pe.Obs):
|
||||
numint.gm()
|
||||
anaint.gm()
|
||||
|
||||
assert(diff.is_zero())
|
||||
else:
|
||||
assert(np.isclose(0, diff))
|
||||
|
||||
pobs = np.array([pe.cov_Obs(1., .1**2, '0'), pe.cov_Obs(2., .2**2, '1'), pe.cov_Obs(2.2, .17**2, '2')])
|
||||
lobs = pe.cov_Obs(.123, .012**2, 'l')
|
||||
uobs = pe.cov_Obs(1., .05**2, 'u')
|
||||
|
||||
check_ana_vs_int(pobs, lobs, uobs)
|
||||
check_ana_vs_int(pobs, lobs.value, uobs)
|
||||
check_ana_vs_int(pobs, lobs, uobs.value)
|
||||
check_ana_vs_int(pobs, lobs.value, uobs.value)
|
||||
for i in range(len(pobs)):
|
||||
p = [pi for pi in pobs]
|
||||
p[i] = pobs[i].value
|
||||
check_ana_vs_int(p, lobs, uobs)
|
||||
|
||||
check_ana_vs_int([pi.value for pi in pobs], lobs, uobs)
|
||||
check_ana_vs_int([pi.value for pi in pobs], lobs.value, uobs.value)
|
||||
|
||||
check_ana_vs_int(pobs, lobs, uobs, epsabs=1.e-9, epsrel=1.236e-10, limit=100)
|
||||
assert(len(pe.integrate.quad(f, pobs, lobs, uobs, full_output=True)) > 2)
|
||||
|
||||
r1, _ = pe.integrate.quad(F, pobs, 1, 0.1)
|
||||
r2, _ = pe.integrate.quad(F, pobs, 0.1, 1)
|
||||
assert r1 == -r2
|
||||
iamzero, _ = pe.integrate.quad(F, pobs, 1, 1)
|
||||
assert iamzero == 0
|
Loading…
Add table
Add a link
Reference in a new issue