]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/math/doc/sf/jacobi_elliptic.qbk
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / math / doc / sf / jacobi_elliptic.qbk
CommitLineData
7c673cae
FG
1[/
2Copyright (c) 2012 John Maddock
3Use, modification and distribution are subject to the
4Boost Software License, Version 1.0. (See accompanying file
5LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6]
7
8[section:jacobi Jacobi Elliptic Functions]
9
10[section:jac_over Overvew of the Jacobi Elliptic Functions]
11
12There are twelve Jacobi Elliptic functions, of which the three copolar functions ['sn], ['cn] and ['dn] are the most important
13as the other nine can be computed from these three
14[footnote [@http://en.wikipedia.org/wiki/Jacobi_elliptic_functions Wikipedia: Jacobi elliptic functions]]
15[footnote [@http://mathworld.wolfram.com/JacobiEllipticFunctions.html Weisstein, Eric W. "Jacobi Elliptic Functions." From MathWorld - A Wolfram Web Resource.]]
16[footnote [@http://dlmf.nist.gov/22 Digital Library of Mathematical Functions: Jacobian Elliptic Functions]].
17
18These functions each take two arguments: a parameter, and a variable as described below.
19
20Like all elliptic functions these can be parameterised in a number of ways:
21
22* In terms of a parameter ['m].
23* In terms of the elliptic modulus ['k] where ['m = k[super 2]].
24* In terms of the modular angle [alpha], where ['m = sin[super 2][alpha]].
25
26In our implementation, these functions all take the elliptic modulus /k/ as the parameter.
27
28In addition the variable /u/ is sometimes expressed as an amplitude [phi], in our implementation we always use /u/.
29
30Finally note that our functions all take the elliptic modulus as the first argument - this is for alignment with
31the Elliptic Integrals.
32
33There are twenve functions for computing the twelve individual Jacobi elliptic functions: __jacobi_cd, __jacobi_cn, __jacobi_cs,
34__jacobi_dc, __jacobi_dn, __jacobi_ds, __jacobi_nc, __jacobi_nd, __jacobi_ns, __jacobi_sc, __jacobi_sd and __jacobi_sn.
35
36They are all called as for example:
37
38 jacobi_cs(k, u);
39
40Note however that these individual functions are all really thin wrappers around the function __jacobi_elliptic which calculates
41the three copolar functions ['sn], ['cn] and ['dn] in a single function call. Thus if you need more than one of these functions
42for a given set of arguments, it's most efficient to use __jacobi_elliptic.
43
44[endsect]
45
46[section:jacobi_elliptic Jacobi Elliptic SN, CN and DN]
47
48[heading Synopsis]
49
50``
51 #include <boost/math/special_functions/jacobi_elliptic.hpp>
52``
53
54 namespace boost { namespace math {
55
56 template <class T, class U, class V>
57 ``__sf_result`` jacobi_elliptic(T k, U u, V* pcn, V* pdn);
58
59 template <class T, class U, class V, class Policy>
60 ``__sf_result`` jacobi_elliptic(T k, U u, V* pcn, V* pdn, const Policy&);
61
62 }} // namespaces
63
64[heading Description]
65
66The function __jacobi_elliptic calculates the three copolar Jacobi elliptic functions
67['sn(u, k)], ['cn(u, k)] and ['dn(u, k)]. The returned value is
68['sn(u, k)], and if provided, ['*pcn] is
69set to ['cn(u, k)], and ['*pdn] is set to ['dn(u, k)].
70
71The functions are defined as follows, given:
72
73[equation jacobi1]
74
75The the angle [phi] is called the ['amplitude] and:
76
77[equation jacobi2]
78
79[note ['[phi]] is called the amplitude.
80
81['k] is called the modulus.
82
83]
84
85[caution Rather like other elliptic functions, the Jacobi functions
86are expressed in a variety of different ways. In particular,
87the parameter /k/ (the modulus) may also be expressed using a modular
88angle [alpha], or a parameter /m/. These are related by:
89
90k = sin[alpha]
91
92m = k[super 2] = sin[super 2][alpha]
93
94So that the function ['sn] (for example) may be expressed as
95either:
96
97sn(u, k)
98
99sn(u \\ [alpha])
100
101sn(u| m)
102
103To further complicate matters, some texts refer to the ['complement
104of the parameter m], or 1 - m, where:
105
1061 - m = 1 - k[super 2] = cos[super 2][alpha]
107
108This implementation uses /k/ throughout, and makes this the first argument
109to the functions: this is for alignment with the elliptic integrals which match the requirements
110of the [@http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf
111Technical Report on C++ Library Extensions]. However, you should
112be extra careful when using these functions!]
113
114[optional_policy]
115
116The following graphs illustrate how these functions change as /k/ changes: for small /k/
117these are sine waves, while as /k/ tends to 1 they become hyperbolic functions:
118
119[graph jacobi_sn]
120
121[graph jacobi_cn]
122
123[graph jacobi_dn]
124
125[heading Accuracy]
126
127These functions are computed using only basic arithmetic operations and trigomometric functions, so
128there isn't much variation in accuracy over differing platforms.
129Typically errors are trivially small for small angles, and as is typical for cyclic
130functions, grow as the angle increases.
131Note that only results for the widest floating point type on the
132system are given as narrower types have __zero_error. All values
133are relative errors in units of epsilon.
134
135[table_jacobi_cn]
136
137[table_jacobi_dn]
138
139[table_jacobi_sn]
140
141[heading Testing]
142
143The tests use a mixture of spot test values calculated using the online
144calculator at [@http://functions.wolfram.com/ functions.wolfram.com],
145and random test data generated using
146MPFR at 1000-bit precision and this implementation.
147
148[heading Implementation]
149
150For ['k > 1] we apply the relations:
151
152[equation jacobi3]
153
154Then filter off the special cases:
155
156['sn(0, k) = 0] and ['cn(0, k) = dn(0, k) = 1].
157
158['sn(u, 0) = sin(u), cn(u, 0) = cos(u) and dn(u, 0) = 1].
159
160['sn(u, 1) = tanh(u), cn(u, 1) = dn(u, 1) = 1 / cosh(u)].
161
162And for ['k[super 4] < [epsilon]] we have:
163
164[equation jacobi4]
165
166Otherwise the values are calculated using the method of [@http://dlmf.nist.gov/22.20#SS2 arithmetic geometric means].
167
168[endsect]
169
170[section:jacobi_cd Jacobi Elliptic Function cd]
171
172[heading Synopsis]
173
174``
175 #include <boost/math/special_functions/jacobi_elliptic.hpp>
176``
177
178 namespace boost { namespace math {
179
180 template <class T, class U>
181 ``__sf_result`` jacobi_cd(T k, U u);
182
183 template <class T, class U, class Policy>
184 ``__sf_result`` jacobi_cd(T k, U u, const Policy& pol);
185
186 }} // namespaces
187
188[heading Description]
189
190This function returns the Jacobi elliptic function ['cd].
191
192[optional_policy]
193
194This function is a trivial wrapper around __jacobi_elliptic, with:
195
196['cd(u, k) = cn(u, k) / dn(u, k)]
197
198[graph jacobi_cd]
199
200[endsect]
201
202[section:jacobi_cn Jacobi Elliptic Function cn]
203
204[heading Synopsis]
205
206``
207 #include <boost/math/special_functions/jacobi_elliptic.hpp>
208``
209
210 namespace boost { namespace math {
211
212 template <class T, class U>
213 ``__sf_result`` jacobi_cn(T k, U u);
214
215 template <class T, class U, class Policy>
216 ``__sf_result`` jacobi_cn(T k, U u, const Policy& pol);
217
218 }} // namespaces
219
220[heading Description]
221
222This function returns the Jacobi elliptic function ['cn].
223
224[optional_policy]
225
226This function is a trivial wrapper around __jacobi_elliptic.
227
228[graph jacobi_cn]
229
230[endsect]
231
232[section:jacobi_cs Jacobi Elliptic Function cs]
233
234[heading Synopsis]
235
236``
237 #include <boost/math/special_functions/jacobi_elliptic.hpp>
238``
239
240 namespace boost { namespace math {
241
242 template <class T, class U>
243 ``__sf_result`` jacobi_cs(T k, U u);
244
245 template <class T, class U, class Policy>
246 ``__sf_result`` jacobi_cs(T k, U u, const Policy& pol);
247
248 }} // namespaces
249
250[heading Description]
251
252This function returns the Jacobi elliptic function ['cs].
253
254[optional_policy]
255
256This function is a trivial wrapper around __jacobi_elliptic, with:
257
258['cs(u, k) = cn(u, k) / sn(u, k)]
259
260[graph jacobi_cs]
261
262[endsect]
263
264[section:jacobi_dc Jacobi Elliptic Function dc]
265
266[heading Synopsis]
267
268``
269 #include <boost/math/special_functions/jacobi_elliptic.hpp>
270``
271
272 namespace boost { namespace math {
273
274 template <class T, class U>
275 ``__sf_result`` jacobi_dc(T k, U u);
276
277 template <class T, class U, class Policy>
278 ``__sf_result`` jacobi_dc(T k, U u, const Policy& pol);
279
280 }} // namespaces
281
282[heading Description]
283
284This function returns the Jacobi elliptic function ['dc].
285
286[optional_policy]
287
288This function is a trivial wrapper around __jacobi_elliptic, with:
289
290['dc(u, k) = dn(u, k) / cn(u, k)]
291
292[graph jacobi_dc]
293
294[endsect]
295
296[section:jacobi_dn Jacobi Elliptic Function dn]
297
298[heading Synopsis]
299
300``
301 #include <boost/math/special_functions/jacobi_elliptic.hpp>
302``
303
304 namespace boost { namespace math {
305
306 template <class T, class U>
307 ``__sf_result`` jacobi_dn(T k, U u);
308
309 template <class T, class U, class Policy>
310 ``__sf_result`` jacobi_dn(T k, U u, const Policy& pol);
311
312 }} // namespaces
313
314[heading Description]
315
316This function returns the Jacobi elliptic function ['dn].
317
318[optional_policy]
319
320This function is a trivial wrapper around __jacobi_elliptic.
321
322[graph jacobi_dn]
323
324[endsect]
325
326[section:jacobi_ds Jacobi Elliptic Function ds]
327
328[heading Synopsis]
329
330``
331 #include <boost/math/special_functions/jacobi_elliptic.hpp>
332``
333
334 namespace boost { namespace math {
335
336 template <class T, class U>
337 ``__sf_result`` jacobi_ds(T k, U u);
338
339 template <class T, class U, class Policy>
340 ``__sf_result`` jacobi_ds(T k, U u, const Policy& pol);
341
342 }} // namespaces
343
344[heading Description]
345
346This function returns the Jacobi elliptic function ['ds].
347
348[optional_policy]
349
350This function is a trivial wrapper around __jacobi_elliptic, with:
351
352['ds(u, k) = dn(u, k) / sn(u, k)]
353
354[graph jacobi_ds]
355
356[endsect]
357
358[section:jacobi_nc Jacobi Elliptic Function nc]
359
360[heading Synopsis]
361
362``
363 #include <boost/math/special_functions/jacobi_elliptic.hpp>
364``
365
366 namespace boost { namespace math {
367
368 template <class T, class U>
369 ``__sf_result`` jacobi_nc(T k, U u);
370
371 template <class T, class U, class Policy>
372 ``__sf_result`` jacobi_nc(T k, U u, const Policy& pol);
373
374 }} // namespaces
375
376[heading Description]
377
378This function returns the Jacobi elliptic function ['nc].
379
380[optional_policy]
381
382This function is a trivial wrapper around __jacobi_elliptic, with:
383
384['nc(u, k) = 1 / cn(u, k)]
385
386[graph jacobi_nc]
387
388[endsect]
389
390[section:jacobi_nd Jacobi Elliptic Function nd]
391
392[heading Synopsis]
393
394``
395 #include <boost/math/special_functions/jacobi_elliptic.hpp>
396``
397
398 namespace boost { namespace math {
399
400 template <class T, class U>
401 ``__sf_result`` jacobi_nd(T k, U u);
402
403 template <class T, class U, class Policy>
404 ``__sf_result`` jacobi_nd(T k, U u, const Policy& pol);
405
406 }} // namespaces
407
408[heading Description]
409
410This function returns the Jacobi elliptic function ['nd].
411
412[optional_policy]
413
414This function is a trivial wrapper around __jacobi_elliptic, with:
415
416['nd(u, k) = 1 / dn(u, k)]
417
418[graph jacobi_nd]
419
420[endsect]
421
422[section:jacobi_ns Jacobi Elliptic Function ns]
423
424[heading Synopsis]
425
426``
427 #include <boost/math/special_functions/jacobi_elliptic.hpp>
428``
429
430 namespace boost { namespace math {
431
432 template <class T, class U>
433 ``__sf_result`` jacobi_ns(T k, U u);
434
435 template <class T, class U, class Policy>
436 ``__sf_result`` jacobi_ns(T k, U u, const Policy& pol);
437
438 }} // namespaces
439
440[heading Description]
441
442This function returns the Jacobi elliptic function ['ns].
443
444[optional_policy]
445
446This function is a trivial wrapper around __jacobi_elliptic, with:
447
448['ns(u, k) = 1 / sn(u, k)]
449
450[graph jacobi_ns]
451
452[endsect]
453
454[section:jacobi_sc Jacobi Elliptic Function sc]
455
456[heading Synopsis]
457
458``
459 #include <boost/math/special_functions/jacobi_elliptic.hpp>
460``
461
462 namespace boost { namespace math {
463
464 template <class T, class U>
465 ``__sf_result`` jacobi_sc(T k, U u);
466
467 template <class T, class U, class Policy>
468 ``__sf_result`` jacobi_sc(T k, U u, const Policy& pol);
469
470 }} // namespaces
471
472[heading Description]
473
474This function returns the Jacobi elliptic function ['sc].
475
476[optional_policy]
477
478This function is a trivial wrapper around __jacobi_elliptic, with:
479
480['sc(u, k) = sn(u, k) / cn(u, k)]
481
482[graph jacobi_sc]
483
484[endsect]
485
486[section:jacobi_sd Jacobi Elliptic Function sd]
487
488[heading Synopsis]
489
490``
491 #include <boost/math/special_functions/jacobi_elliptic.hpp>
492``
493
494 namespace boost { namespace math {
495
496 template <class T, class U>
497 ``__sf_result`` jacobi_sd(T k, U u);
498
499 template <class T, class U, class Policy>
500 ``__sf_result`` jacobi_sd(T k, U u, const Policy& pol);
501
502 }} // namespaces
503
504[heading Description]
505
506This function returns the Jacobi elliptic function ['sd].
507
508[optional_policy]
509
510This function is a trivial wrapper around __jacobi_elliptic, with:
511
512['sd(u, k) = sn(u, k) / dn(u, k)]
513
514[graph jacobi_sd]
515
516[endsect]
517
518[section:jacobi_sn Jacobi Elliptic Function sn]
519
520[heading Synopsis]
521
522``
523 #include <boost/math/special_functions/jacobi_elliptic.hpp>
524``
525
526 namespace boost { namespace math {
527
528 template <class T, class U>
529 ``__sf_result`` jacobi_sn(T k, U u);
530
531 template <class T, class U, class Policy>
532 ``__sf_result`` jacobi_sn(T k, U u, const Policy& pol);
533
534 }} // namespaces
535
536[heading Description]
537
538This function returns the Jacobi elliptic function ['sn].
539
540[optional_policy]
541
542This function is a trivial wrapper around __jacobi_elliptic.
543
544[graph jacobi_sn]
545
546[endsect]
547
548
549[endsect]
550