2
0
mirror of https://github.com/boostorg/math.git synced 2026-01-24 06:02:08 +00:00
Commit Graph

104 Commits

Author SHA1 Message Date
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
770aafe543 Correct function pointer usage. 2020-07-07 11:54:11 +01:00
jzmaddock
1f04d60436 Correct Jamfile mpfr configuration. 2020-07-06 12:52:02 +01:00
jzmaddock
f18e4c4f84 Fix case of header name, fix C++11 requirement on one test. 2020-07-06 08:21:45 +01:00
jzmaddock
b670912bc5 Fix up data generators for C++03 etc. 2020-07-05 21:28:00 +01:00
jzmaddock
1e0179c883 Remove dispatching via mpl and stick to boost::integral_constant.
Simplify the dispatching logic to use mpl::if_ and broken compiler workarounds less often.
Fixes: https://github.com/boostorg/type_traits/issues/133.
2020-01-13 15:14:48 +00: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
jzmaddock
75f77481a0 Update Lanczos generator program.
Add lanczos approximations for multiprecision types up to 100 digit precision.
Add tests for new approximations.
2019-10-18 17:58:31 +01:00
pabristow
0ab00c3f9d [CI SKIP] changes to get inspect program problem-free, but one test failure in recurrence.cpp 2019-08-23 09:25:22 +01:00
jzmaddock
5376702cc7 pFq: Add tests. 2019-07-17 18:24:07 +01:00
jzmaddock
472e34efc4 Merge branch 'develop' into hypergeometric_soc_2014 2019-07-02 18:12:43 +01:00
pabristow
02ff33c49a Several broken/missing links corrected, and lambert_w_errors_graph.cpp added. Passes local inspect.exe except on link to Boost.Test floating point that may work when built in situ. [CI SKIP] for now. 2019-05-30 16:55:15 +01:00
jzmaddock
dc7ecc0581 1F1: Exclude values very close to 1 from logarithmic testing for now.
Add tests for log and regularized cases.
Log cases still have many failures and are not yet tested.
2019-05-13 18:07:47 +01:00
jzmaddock
648ebfdc25 1F1: Add regularized version. 2019-04-17 18:27:42 +01:00
jzmaddock
52e4ee3c79 1F1: Update tests for previous changes, improve error testing code. 2019-04-14 09:51:45 +01:00
jzmaddock
91731ab5fa 1F1: Fix up b < 0 domain for extended precision types.
Update docs for b < 0 case.
2019-04-08 18:25:40 +01:00
jzmaddock
01f80a651b 1F1: Improve error plot code. 2019-04-05 18:57:10 +01:00
jzmaddock
31cc6ee069 1F1: Add missing doc files.
[CI SKIP]
2019-03-16 16:58:58 +00:00
jzmaddock
092fcf278f 1F1: begin to document error rates and testing methodology.
[CI SKIP]
2019-03-14 12:04:42 +00:00
jzmaddock
bfb204937e Hypergeometric 1F1: Tentatively fix more issues. 2018-11-07 16:23:35 +00:00
jzmaddock
cd626ffc89 1F1: Correct erroneous test data.
[CI SKIP]
2018-10-27 13:37:27 +01:00
jzmaddock
52079d2d23 Merge branch 'develop' into hypergeometric_soc_2014
Fixed Conflicts:
	doc/equations/generate.sh
2018-10-18 11:11:13 +01:00
jzmaddock
bed980e202 Merge branch 'develop' into lambertw 2018-08-30 10:17:19 +01:00
jzmaddock
c04b83bf15 LambertW: Moved some files around, deleted dead ones. 2018-08-22 19:33:49 +01:00
jzmaddock
658945d508 Improve sinc approximations and add better tests.
Fixes: https://svn.boost.org/trac10/ticket/13606 and https://svn.boost.org/trac10/ticket/13603.
2018-06-17 19:10:46 +01:00
John Maddock
519d7d5962 Add first error plots [CI SKIP] 2018-03-06 19:29:26 +00:00
jzmaddock
e348578b0f erfc: improve accuracy in exp calculation, add error plot generator program. 2018-03-02 19:23:41 +00:00
jzmaddock
da9d77ef2e Hypergeometric: Begin fixing errors from large params in 1F1 2018-01-20 17:48:51 +00:00
jzmaddock
5a1f4d90ba Hypergeometric: start testing larger arguments to 1F1 and begin to fix the errors. 2018-01-20 17:46:57 +00:00
jzmaddock
be326922dc Math: add start of 1F1 implementation. 2017-11-19 11:58:26 +00:00
jzmaddock
587f2d8918 Math.Hypergeometric: Add 2F0 function and tests.
Also fix a couple of warnings in test_data.hpp, and improve the continued fraction form in 0F1.
2017-11-15 18:27:35 +00:00
jzmaddock
e9f0791f7e Simplify and clean up Gauss constant generation program.
[CI skip]
2017-09-09 19:44:24 +01:00
jzmaddock
c8c02ba9a7 Add Gauss constant generation program. 2017-09-06 19:56:36 +01:00
jzmaddock
3287c922ea Fix some corner cases in the beta functions.
Add better tests for the incomplete beta derivative.
Update docs to match.
2015-09-11 12:02:04 +01:00
jzmaddock
7fa11a133f Add Heuman Lambda Function. 2015-02-19 19:33:56 +00:00
jzmaddock
072d6ef395 Add Jacobi Zeta Function. 2015-02-19 16:49:03 +00:00
jzmaddock
c1200bf7cd Add initial version of Elliptic Integral D. 2015-02-17 19:03:50 +00:00
jzmaddock
110a5327b2 Apply more special cases to RD and RG plus tests. 2015-02-15 18:48:33 +00:00
jzmaddock
cbb1d9cb5f Add RF(x, y, 0) as a special case. 2015-02-15 11:34:44 +00:00
jzmaddock
11d4d7eb11 [Carlson elliptic Integrals] Add ellint_rg plus tests. 2015-01-08 13:43:37 +00:00
jzmaddock
64bf08fce4 [Carlson Elliptic Integrals] Add special cases for RF. 2015-01-07 19:00:25 +00:00
jzmaddock
89fcff4266 [Carlson Elliptic Integrals] Update RD to use Carlson's latest methods. Add more RD test cases. Update copyright info. 2015-01-07 18:24:08 +00:00
jzmaddock
b3d11e9545 [Ellint Carlson] Update RJ to carlson's latest algorithm. Add missing include to ellint_rc.hpp. Add more test cases for RJ special cases. 2015-01-05 11:46:34 +00:00
jzmaddock
26f063eca4 Fix accuracy issue in cos_pi.
Add tests for cos_pi and sin_pi.
Doc regen.
2014-11-16 17:18:17 +00:00
jzmaddock
eb2525b516 Merge branch 'develop' into bernoulli-tgamma
Conflicts:
	doc/equations/bernoulli_numbers2.mml
	doc/equations/bernoulli_numbers2.png
	doc/equations/bernoulli_numbers2.svg
	doc/equations/generate.sh
	doc/equations/tangent_numbers.png
	doc/equations/tangent_numbers.svg
	doc/math.qbk
	include/boost/cstdfloat.hpp
	include/boost/math/policies/error_handling.hpp
	include/boost/math/special_functions/detail/bernoulli_details.hpp
2014-10-18 17:49:49 +01:00
jzmaddock
9860071f84 Remove all references to tr1 components.
Update data generators to use Boost.Multiprecision.
2014-09-28 18:09:27 +01:00