2
0
mirror of https://github.com/boostorg/math.git synced 2026-02-26 04:42:22 +00:00
Commit Graph

158 Commits

Author SHA1 Message Date
jzmaddock
09c0d37178 Merge pull request #418 from boostorg/mp_erf
Update multiprecision erf to improve precision and performance.
2020-08-20 18:21:44 +01:00
Evan Miller
d7141cd353 Jacobi Theta functions (#394)
* Jacobi Theta functions

Implementations, tests, and ULP plotting programs are provided for the
four Jacobi Theta functions per #373. Twenty-four public C++ functions
are provided in all, covering various precision-preserving scenarios.

Documentation for collaborators is provided in the code comments. Proper
documentation for end users will be provided when the implementation and
APIs are finalized.

Some tests are failing; this implementation is meant to start a
conversation. The core dilemma faced by the author was that large values
of |q| resulted in slow convergence, and sometimes wildly inaccurate
results. Following the implementation note in DLMF 20.14, I added code
to switch over to the imaginary versions of the theta functions when |q|
> 0.85.  This restored accuracy such that all of the identity tests
passed for a loose-enough epsilon, but then lost precision to the point
that the Wolfram Alpha spot checks failed. It is the author's hope that
someone with floating-point experience can tame the exponential dragons
and squeeze the ULPs back down to a reasonable range when |q| is large.

When #392 is merged I will add more thorough value tests, although I
fully expect them to fail until the underlying precision issues are
resolved.

As a final note, the precision issues do not affect the z=0 case - the
ULP plots indicate these return values within 2 ULP across all valid
|q|. So that's a start.

* [CI SKIP] Jacobi theta: Add special-value tests and more

* Add tests covering z=0 special values from MathWorld

* Add missing real_concept header

* Replace M_PI and friends with constants::pi etc

* Use BOOST_MATH_STD_USING in more places

* Jacobi theta: Test two more of Watson's identities [CI SKIP]

See https://mathworld.wolfram.com/JacobiThetaFunctions.html

(Equations 48 and 49)

* Improve precision of Jacobi theta functions [CI SKIP]

Rewrite the private imaginary versions to use double-sided summations
following DLMF 20.13.4 and 20.13.5. This cuts down the worst of the
precision issues by a factor of 10, and gets more of the tests to pass.

I am confident enough in the code path to eliminate the compile-time
__JACOBI_THETA_USE_IMAGINARY flag. In fact the imaginary-z code paths
are now enabled for all |q| > 0.04, i.e. most legal values of q.

More extensive tests will be needed to illuminate any remaining
precision issues.

* Jacobi theta: Make changes suggested in #394 [CI SKIP]

* Add LICENSE notice to main file

* Document convergence criteria

* Eliminate eps*eps = 0 logic. This causes some disagreement with the
zero returned by Wolfram Alpha for z=0, q > 0.99 in the fourth function.
Mathematically, the fourth function is never exactly zero, so I don't
trust Wolfram here.

* Per code-review comments, remove multiplications by floating-point 2.

* Tweak the plotting programs to display their titles, and to uniformly
use `float` as their CoarseType and `long double` as their
`PreciseType`.

* Add quadrature tests to Jacobi theta functions [CI SKIP]

The quadrature tests revealed a problem in the m1 functions: they too
should switch to the _IMAGINARY logic for q > exp(-pi), or will suffer
from slow convergence. Fix them.

Also tighten tolerances for many tests from sqrt(eps) to 100 * eps.

* Test Jacobi thetas against elliptic functions and elliptic integrals [CI SKIP]

See:

* https://dlmf.nist.gov/22.2
* https://dlmf.nist.gov/20.9#i

* Test Jacobi Thetas against their Laplace transforms [CI SKIP]

See:

* https://dlmf.nist.gov/20.10#ii

I did find some disagreement, and dropped the negative sign from the
theta1 equation. DLMF's theta2 and theta3 Laplace transform equations do
not agree at all with the computed values - will need to investigate.

In the meantime, the two implemented equations agree to 4 EPS so I am
keeping them.

* Add a note on using log1p with Jacobi theta functions [CI SKIP]

See discussion:

* https://github.com/boostorg/math/pull/394#issuecomment-655871762

* Add random data tests to Jacobi Theta functions [CI SKIP]

Add a test data generator program for the Jacobi theta functions.
This program will produce data for the tau parameterization, so that
precision isn't lost during the log-transformation. This distinguishes
it from the Wolfram Alpha data, which is parameterized by q.

A few of these new random-data tests are failing, but not by obscene
margins (< 100 EPS). These failures will be addressed when the test
tolerances are finalized.

* Add small-tau tests and simplify Jacobi Theta code [CI SKIP]

Add tests for small tau (i.e. large q). The tests are failing with mean
~ 200 EPS and max ~ 800 EPS. These look like worst-case input, and
should be the focus of future accuracy improvements.

This commit also simplifies the _IMAGINARY code by abstracting all of
the loops into a single svelte function.

* Add user documentation for Jacobi Theta functions [CI SKIP]

* Add function graphs to Jacobi Theta docs [CI SKIP]

* Define Jacobi Theta test tolerances [CI SKIP]

* Add implementation note on Jacobi theta functions [CI SKIP]

* Consolidate Jacobi Theta ULPs plotting programs [CI SKIP]

* Fix q domain checking of jacobi_theta4 [CI SKIP]

* Add ULPs plots to Jacobi Theta docs [CI SKIP]

Also add the built HTML files for easy evaluation. A full rebuild is
needed for the new docs to appear in the indexes.

* Add missing Jacobi Theta ULPs plots [CI SKIP]

* Add LaTeX source for Jacobi Theta equations [CI SKIP]

* Remove unused Jacobi Theta PNG equations [CI SKIP]

* Add Jacobi Theta performance script [CI SKIP]

Provided by @NAThompson.

* Remove vestigial eps*eps check from jacobi_theta3 [CI SKIP]

* Update Jacobi Theta docs per code review comments [CI SKIP]

* Enable arg promotion for Jacobi Theta functions [CI SKIP]

Add Jacobi theta functions to the instantiation tests and fix up
everything needed to make them pass. This changes the function
signatures to use promote_args.

* Fix Jacobi Theta plotting script [CI SKIP]

This script broke when the promote_args API was added.

* Change Jacobi Theta convergence criterion [CI SKIP]

Compare the non-oscillating part of the delta to the previous one.
This avoids some headaches comparing the delta to the partial sum,
because the partial sum can be a small number due to the oscillating
component alternating signs.

Because successive terms involve either q^n^2 or exp(-(pi*n)^2),
convergence should still happen pretty quickly. Graphs have been updated
and tests still passs with no noticeable difference.
2020-08-15 18:51:47 -04:00
jzmaddock
2b428c94e5 Add new erf/erfc plots to docs.
[CI SKIP]
2020-08-15 12:41:30 +01:00
jzmaddock
b5d925de98 Minor update for pow<N>():
Add a few more constexpr tests for the corner cases.
Document the constexpr-ness.
See https://github.com/boostorg/math/issues/354.
2020-07-06 19:29:28 +01:00
NAThompson
646005eaca Take care of overflow. [CI SKIP] 2020-05-31 11:35:46 -04:00
Nick
1186f1a7ff rsqrt (#361)
* rsqrt

* Link docs into math.qbk. [CI SKIP]

* Demo performance with a compiler that generates good instructions [CI SKIP]
2020-05-30 22:34:56 -04:00
Nick
b682c76f96 Update daubechies.qbk 2020-05-14 10:44:12 -04:00
Nick
c59659f4ed Reinch's modification to Clenshaw recurrence (#339)
* Reinch's modification to Clenshaw recurrence. [CI SKIP]

* Convert Chebyshev tests to math_unit_test.hpp

* Performance of translated Chebyshev Clenshaw recurrence. [CI SKIP]

* Prepare to use modified Clenshaw recurrence in Chebyshev transform.

* Remove unused headers from Chebyshev transform test [CI SKIP]

* Update Chebyshev transform tests to use math_unit_test.hpp
2020-04-25 09:01:05 -04:00
Nick
58561d7f92 Add 2 Daubechies graphs to documentation. 2020-03-26 05:39:10 -04:00
NAThompson
8c621d8be4 Sketch out Daubechies wavelet class [CI SKIP] 2020-03-10 07:15:52 -04:00
Nick Thompson
0661b37716 Remove typos from docs. 2020-03-08 11:37:08 -04:00
Nick Thompson
3fa4267dda Add documentation for Daubechies scaling function [CI SKIP] 2020-03-08 11:08:27 -04:00
NAThompson
3424b2b7bd Merge branch 'develop' into daubechies_attempt_2 2020-01-25 08:12:13 +08:00
jzmaddock
cb1b9c102e Fix typo from https://github.com/boostorg/math/pull/309 and change latex in comment to match the new equation. 2020-01-24 13:10:47 +00:00
Brian Wignall
740a73c523 Fix typos 2020-01-12 15:30:30 -05:00
Brian Wignall
56740d2257 Fix more typos, after another typochecker bug fix 2019-12-26 09:33:10 -05:00
Brian Wignall
8b277e3ff3 Fix more typos 2019-12-26 09:18:02 -05:00
Brian Wignall
e3a45bd10b Fix typos, after fixing bug in typochecker 2019-12-25 22:42:26 -05:00
Brian Wignall
3c976e5e09 Fix typos 2019-12-24 21:42:09 -05:00
Brian Wignall
df17d11299 Fix more typos, via latest version of typochecker tool 2019-12-20 10:41:42 -05:00
Brian Wignall
54770599d5 Fix more typos 2019-12-16 13:35:48 -05:00
Brian Wignall
ccff3fd1b3 Fix typos 2019-12-01 08:06:17 -05:00
NAThompson
d7e4bf780b Continuous Daubechies wavelets [CI SKIP] 2019-10-27 14:12:34 -04:00
jzmaddock
3934e61d7c Update history and regenerate docs.
Tweak some hypergeometric html file names for consistency.
[CI SKIP]
2019-10-20 20:08:19 +01:00
jzmaddock
566ed597f6 Sterling: fix expected error rates, update docs. 2019-10-12 19:35:44 +01:00
NAThompson
1f0c1bb8dc Documentation for Jacobi polynomials. 2019-08-28 16:21:03 -04:00
Nick
b543139d3a Merge pull request #233 from boostorg/gegenbauer_1
Gegenbauer polynomials
2019-08-27 07:47:58 -04:00
NAThompson
1c6b7b50a3 Gegenbauer polynomials: Add gegenbauer_prime and kick off build. 2019-08-23 09:23:34 -04:00
Nick
cf48e191a6 Merge pull request #240 from boostorg/cardinal_b_spline_derivatives
Cardinal B-spline derivatives
2019-08-18 09:21:41 -04:00
pabristow
327c825dfa [CI SKIP] More cosmetic and link edits to get Inspect.exe passes except for links to [@boost: which shoudl work OK when built for the documentation. Ready to merge with develop, touch wood. 2019-08-12 17:53:50 +01:00
pabristow
d922852f3b [CI SKIP] Editorial/cosmetic changes complete, apart from getting up to date with develop and a last re-re-re-through! 2019-08-12 15:52:06 +01:00
NAThompson
5c8fcb4cd5 Cardinal B-spline derivatives. 2019-08-12 10:07:06 -04:00
pabristow
765b4e7148 [CI SKIP] Expressions and removal of many [space] after [greek] now wrong since Quickbook error has been fixed, but more remain and also emquad match instead of [: or [expression . Special functions done but distirbutions still to redo. 2019-08-12 14:06:25 +01:00
NAThompson
e327be5887 Cardinal B-spline derivatives [CI SKIP] 2019-08-11 14:52:47 -04:00
pabristow
43d00e16b7 [CI SKIP]Edotiral work part 2, up to sf/ellint_intro 2019-08-09 17:57:20 +01:00
pabristow
2bda67e466 [CI SKIP] corrected accent etc in refs hypergeometric.gbk 2019-08-09 16:35:25 +01:00
pabristow
3af9b5c503 [CI SKIP] Use JM version of hypergeometric.gbk 2019-08-09 16:16:59 +01:00
pabristow
fee0884df4 [CI SKIP] Use JM version of hypergeometric.gbk 2019-08-09 16:13:10 +01:00
pabristow
6981dc12f9 [CI SKIP]Editorial work using changes in math.css, part one. 2019-08-09 13:22:33 +01:00
jzmaddock
b28d3f34ea hypergeometrics: indent equations.
[CI SKIP]
2019-08-08 11:31:26 +01:00
pabristow
44e3ed82fa [CI SKIP] typos in hypergeometrics and added a FAQ 2019-08-07 15:14:50 +01:00
pabristow
ccb508194f [CI SKIP] Added missing example file and more index entries 2019-08-07 09:07:11 +01:00
pabristow
d26d90d7b3 Merge branch 'develop' of https://github.com/boostorg/math into develop
Many edits to provide equation indents, dozens of typos, and misc amendments, mainly cosmetic, and new index entries for better indexes [CI SKIP].
2019-08-06 15:37:40 +01:00
pabristow
df5a6f5ac6 Many edits to provide equation indents, dozens of typos, and misc amendments, mainly cosmetic, and new index entries for better indexes 2019-08-06 15:33:22 +01:00
jzmaddock
c159693d7e 1F1: tidy up docs and suppress/fix some compiler warnings. 2019-08-05 13:17:42 +01:00
NAThompson
9efeb19046 Gegenbauer polynomials: Graphs and documentation. [CI SKIP] 2019-08-04 15:59:12 -04:00
NAThompson
a733b75005 Gegenbauer polynomials: Implement derivatives. [CI SKIP] 2019-08-04 15:15:52 -04:00
jzmaddock
88dd510a4f Merge pull request #148 from boostorg/hypergeometric_soc_2014
Hypergeometrics
2019-08-03 21:54:34 +01:00
jzmaddock
9350bda2bd 1F1: Fix documentation typos.
[CI SKIP]
2019-08-03 10:11:38 +01:00
jzmaddock
3130c30e4f pFq: Add tests for hypergeometric_pFq_precision.
Update docs.
Document recurrence tools.
2019-08-01 15:19:01 +01:00