comparison libinterp/corefcn/ellipj.cc @ 16584:2f766ceeb03e

Add ellipj, ellipke, and expint functions from Octave Forge * ellipj.cc, ellipke.m, expint.m: New files. * libinterp/corefcn/module.mk (COREFCN_SRC): Add ellipj.cc to the list. * scripts/specfun/module.mk (specfun_FCN_FILES): Add ellipke.m and expint.m to the list. * __unimplemented__.m (missing_functions): Remove ellipj, ellipke, and expint from the list. * arith.txi: Include ellipj, ellipke, and expint docstrings. * NEWS: Mention ellipj, ellipke, and expint.
author Mike Miller <mtmiller@ieee.org>
date Wed, 24 Apr 2013 23:22:50 -0400
parents
children 1a3bfb14b5da
comparison
equal deleted inserted replaced
16583:e74ef19d2268 16584:2f766ceeb03e
1 /*
2 Copyright (C) 2001 Leopoldo Cerbaro <redbliss@libero.it>
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3 of the License, or
7 (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; If not, see <http://www.gnu.org/licenses/>.
16
17 Compute the Jacobi elliptic functions sn(u|m), cn(u|m) and dn(u|m) for
18 argument u (real or complex) and parameter m.
19
20 usage: [sn,cn,dn] = ellipj(u,m[,tol])
21
22 u and can be complex.
23 m is restricted to 0 <= m <= 1.
24 They can be scalars, matrix and scalar, scalar and matrix,
25 column and row, conformant matrices.
26
27 modified so u can be complex. Leopoldo Cerbaro redbliss@libero.it
28
29 Ref: Abramowitz, Milton and Stegun, Irene A
30 Handbook of Mathematical Functions, Dover, 1965
31 Chapter 16 (Sections 16.4, 16.13 and 16.15)
32
33 Based upon ellipj.m made by David Billinghurst <David.Billinghurst@riotinto.com>
34 and besselj.cc
35
36 Author: Leopoldo Cerbaro <redbliss@libero.it>
37 Created: 15 December 2001
38 */
39
40 #ifdef HAVE_CONFIG_H
41 #include <config.h>
42 #endif
43
44 #include "defun.h"
45 #include "error.h"
46 #include "lo-ieee.h"
47
48 static void
49 gripe_ellipj_arg ( const char *arg)
50 {
51 error ("ellipj: expecting scalar or matrix as %s argument", arg);
52 }
53
54 const double eps = 2.220446049e-16;
55 const int Nmax = 16;
56
57 static void
58 sncndn ( double u, double m, double& sn, double& cn, double& dn, double& err) {
59 /* real */
60 double sqrt_eps, m1, t=0., si_u, co_u, se_u, ta_u, b, c[Nmax], a[Nmax], phi;
61 int n, Nn, ii;
62
63 if (m < 0. || m > 1.) {
64 warning ("ellipj: expecting 0. <= m <= 1."); /* -lc- */
65 sn = cn = dn = lo_ieee_nan_value ();
66 return;
67 }
68 sqrt_eps = sqrt(eps);
69 if (m < sqrt_eps) {
70 /* # For small m, ( Abramowitz and Stegun, Section 16.13 ) */
71 /*{{{*/
72 si_u = sin(u);
73 co_u = cos(u);
74 t = 0.25*m*(u-si_u*co_u);
75 sn = si_u - t * co_u;
76 cn = co_u + t * si_u;
77 dn = 1.0 - 0.5*m*si_u*si_u;
78 /*}}}*/
79 } else if ( (1.0 - m) < sqrt_eps ) {
80 /* For m1 = (1-m) small ( Abramowitz and Stegun, Section 16.15 ) */
81 /*{{{*/
82 m1 = 1.0-m;
83 si_u = sinh(u);
84 co_u = cosh(u);
85 ta_u = tanh(u);
86 se_u = 1.0/co_u;
87 sn = ta_u + 0.25*m1*(si_u*co_u-u)*se_u*se_u;
88 cn = se_u - 0.25*m1*(si_u*co_u-u)*ta_u*se_u;
89 dn = se_u + 0.25*m1*(si_u*co_u+u)*ta_u*se_u;
90 /*}}}*/
91 } else {
92 /*{{{*/
93 /*
94 // Arithmetic-Geometric Mean (AGM) algorithm
95 // ( Abramowitz and Stegun, Section 16.4 )
96 */
97
98 a[0] = 1.0;
99 b = sqrt(1.0-m);
100 c[0] = sqrt(m);
101 for (n = 1; n<Nmax; ++n) {
102 a[n] = (a[n-1]+b)/2;
103 c[n] = (a[n-1]-b)/2;
104 b = sqrt(a[n-1]*b);
105 if ( c[n]/a[n] < eps) break;
106 }
107 if ( n >= Nmax-1) {
108 // fprintf(stderr, "Not enough workspace\n");
109 err = 1.;
110 return;
111 }
112 Nn = n;
113 for ( ii = 1; n>0; ii = ii*2, --n) ; // pow(2, Nn)
114 phi = ii*a[Nn]*u;
115 for ( n = Nn; n > 0; --n) {
116 t = phi;
117 phi = (asin((c[n]/a[n])* sin(phi))+phi)/2.;
118 }
119 sn = sin(phi);
120 cn = cos(phi);
121 dn = cn/cos(t-phi);
122 /*}}}*/
123 }
124 return;
125 }
126
127 static void
128 sncndn ( Complex& u, double m,
129 Complex& sn, Complex& cn, Complex& dn, double& err) {
130 double m1 = 1.-m, ss1, cc1, dd1;
131
132 sncndn( imag(u), m1, ss1, cc1, dd1, err);
133 if ( real(u) == 0.) {
134 /* u is pure imag: Jacoby imag. transf. */
135 /*{{{*/
136 sn = Complex (0. , ss1/cc1);
137 cn = 1/cc1; // cn.imag = 0.;
138 dn = dd1/cc1; // dn.imag = 0.;
139 /*}}}*/
140 } else {
141 /* u is generic complex */
142 /*{{{*/
143 double ss, cc, dd, ddd;
144
145 sncndn( real(u), m, ss, cc, dd, err);
146 ddd = cc1*cc1 + m*ss*ss*ss1*ss1;
147 sn = Complex (ss*dd1/ddd, cc*dd*ss1*cc1/ddd);
148 cn = Complex (cc*cc1/ddd, -ss*dd*ss1*dd1/ddd);
149 dn = Complex (dd*cc1*dd1/ddd, -m*ss*cc*ss1/ddd);
150 /*}}}*/
151 }
152 return;
153 }
154
155 DEFUN (ellipj, args, nargout,
156 "-*- texinfo -*-\n\
157 @deftypefn {Loadable Function} {[@var{sn}, @var{cn}, @var{dn}] =} \
158 ellipj (@var{u}, @var{m}, @var{err})\n\
159 Compute the Jacobi elliptic functions sn, cn, dn of complex argument and real parameter.\n\
160 \n\
161 If @var{m} is a scalar, the results are the same size as @var{u}.\n\
162 If @var{u} is a scalar, the results are the same size as @var{m}.\n\
163 If @var{u} is a column vector and @var{m} is a row vector, the\n\
164 results are matrices with @code{length (@var{u})} rows and\n\
165 @code{length (@var{m})} columns. Otherwise, @var{u} and\n\
166 @var{m} must conform and the results will be the same size.\n\
167 \n\
168 The value of @var{u} may be complex.\n\
169 The value of @var{m} must be 0 <= m <= 1. .\n\
170 \n\
171 If requested, @var{err} contains the following status information\n\
172 and is the same size as the result.\n\
173 \n\
174 @enumerate 0\n\
175 @item\n\
176 Normal return.\n\
177 @item\n\
178 Error---no computation, algorithm termination condition not met,\n\
179 return @code{NaN}.\n\
180 @end enumerate\n\
181 @end deftypefn")
182 {
183 octave_value_list retval;
184
185 int nargin = args.length ();
186
187 if (nargin == 2 ) {
188 octave_value u_arg = args(0);
189 octave_value m_arg = args(1);
190
191 if (m_arg.is_scalar_type ()) { // m is scalar
192 double m = args(1).double_value ();
193
194 if (! error_state) {
195
196 if (u_arg.is_scalar_type ()) { /* u scalar */
197 /*{{{*/
198 if (u_arg.is_real_type ()) { // u real
199 double u = args(0).double_value ();
200
201 if (! error_state) {
202 double sn, cn, dn;
203 double err=0;
204 octave_value result;
205
206 sncndn(u, m, sn, cn, dn, err);
207 retval (0) = sn;
208 retval (1) = cn;
209 retval (2) = dn;
210 if (nargout > 3)
211 retval(3) = err;
212 } else
213 gripe_ellipj_arg ( "first");
214
215 } else { // u complex
216 Complex u = u_arg.complex_value ();
217
218 if (! error_state) {
219 Complex sn, cn, dn;
220 double err;
221 octave_value result;
222
223 sncndn( u, m, sn, cn, dn, err);
224
225 retval (0) = sn;
226 retval (1) = cn;
227 retval (2) = dn;
228 if (nargout > 3) retval(3) = err;
229 } else
230 gripe_ellipj_arg ( "second");
231 }
232 /*}}}*/
233 } else { /* u is matrix ( m is scalar ) */
234 /*{{{*/
235 ComplexMatrix u = u_arg.complex_matrix_value ();
236
237 if (! error_state) {
238 octave_value result;
239 int nr = u.rows ();
240 int nc = u.cols ();
241
242 ComplexMatrix sn (nr, nc), cn (nr, nc), dn (nr, nc);
243 Matrix err (nr, nc);
244
245 for (int j = 0; j < nc; j++)
246 for (int i = 0; i < nr; i++)
247 sncndn (u(i,j), m, sn(i,j), cn(i,j), dn(i,j), err(i,j));
248
249 retval (0) = sn;
250 retval (1) = cn;
251 retval (2) = dn;
252 if (nargout > 3) retval(3) = err;
253 } else
254 gripe_ellipj_arg ( "first");
255 /*}}}*/
256 }
257 } else
258 gripe_ellipj_arg ( "second");
259 } else { // m is matrix
260 Matrix m = args(1).matrix_value ();
261
262 if (! error_state) {
263 int mr = m.rows ();
264 int mc = m.cols ();
265
266 if (u_arg.is_scalar_type ()) { /* u is scalar */
267 /*{{{*/
268 octave_value result;
269 int nr = m.rows ();
270 int nc = m.cols ();
271 Matrix err (nr, nc);
272
273 if (u_arg.is_real_type ()) {
274 double u = u_arg.double_value ();
275 Matrix sn (nr, nc), cn (nr, nc), dn (nr, nc);
276 if (! error_state) {
277 for (int j = 0; j < nc; j++)
278 for (int i = 0; i < nr; i++)
279 sncndn (u, m(i,j), sn(i,j), cn(i,j), dn(i,j), err(i,j));
280
281 retval (0) = sn;
282 retval (1) = cn;
283 retval (2) = dn;
284 if (nargout > 3) retval(3) = err;
285 } else
286 gripe_ellipj_arg ( "first");
287 } else {
288 Complex u = u_arg.complex_value ();
289 ComplexMatrix sn (nr, nc), cn (nr, nc), dn (nr, nc);
290 if (! error_state) {
291 for (int j = 0; j < nc; j++)
292 for (int i = 0; i < nr; i++)
293 sncndn (u, m(i,j), sn(i,j), cn(i,j), dn(i,j), err(i,j));
294 retval (0) = sn;
295 retval (1) = cn;
296 retval (2) = dn;
297 if (nargout > 3) retval(3) = err;
298 } else
299 gripe_ellipj_arg ( "first");
300 }
301 /*}}}*/
302 } else { // u is matrix (m is matrix)
303 /*{{{*/
304 if (u_arg.is_real_type ()) { // u real matrix
305
306 Matrix u = u_arg.matrix_value ();
307 if (! error_state) {
308 int ur = u.rows ();
309 int uc = u.cols ();
310
311 if (mr == 1 && uc == 1) { // u column, m row
312 RowVector rm = m.row ((octave_idx_type)0);
313 ColumnVector cu = u.column ((octave_idx_type)0);
314
315 Matrix sn (ur, mc), cn (ur, mc), dn (ur, mc);
316 Matrix err(ur,mc);
317 // octave_value result;
318
319 for (int j = 0; j < mc; j++)
320 for (int i = 0; i < ur; i++)
321 sncndn (cu(i), rm(j), sn(i,j), cn(i,j), dn(i,j), err(i,j));
322
323 retval (0) = sn;
324 retval (1) = cn;
325 retval (2) = dn;
326 if (nargout > 3) retval(3) = err;
327 } else if (ur == mr && uc == mc) {
328 Matrix sn (ur, mc), cn (ur, mc), dn (ur, mc);
329 Matrix err(ur,mc);
330 // octave_value result;
331
332 for (int j = 0; j < uc; j++)
333 for (int i = 0; i < ur; i++)
334 sncndn (u(i,j), m(i,j), sn(i,j), cn(i,j), dn(i,j), err(i,j));
335
336 retval (0) = sn;
337 retval (1) = cn;
338 retval (2) = dn;
339 if (nargout > 3) retval(3) = err;
340 } else
341 error("u m invalid");
342 } else
343 gripe_ellipj_arg ( "first ");
344 } else { // u complex matrix
345 ComplexMatrix u = u_arg.complex_matrix_value ();
346 if (! error_state) {
347 int ur = u.rows ();
348 int uc = u.cols ();
349
350 if (mr == 1 && uc == 1) {
351 RowVector rm = m.row ((octave_idx_type)0);
352 ComplexColumnVector cu = u.column ((octave_idx_type)0);
353
354 ComplexMatrix sn (ur, mc), cn (ur, mc), dn (ur, mc);
355 Matrix err(ur,mc);
356 // octave_value result;
357
358 for (int j = 0; j < mc; j++)
359 for (int i = 0; i < ur; i++)
360 sncndn (cu(i), rm(j), sn(i,j), cn(i,j), dn(i,j), err(i,j));
361
362 retval (0) = sn;
363 retval (1) = cn;
364 retval (2) = dn;
365 if (nargout > 3) retval(3) = err;
366 } else if (ur == mr && uc == mc) {
367
368 ComplexMatrix sn (ur, mc), cn (ur, mc), dn (ur, mc);
369 Matrix err(ur,mc);
370 // octave_value result;
371
372 for (int j = 0; j < uc; j++)
373 for (int i = 0; i < ur; i++)
374 sncndn (u(i,j), m(i,j), sn(i,j), cn(i,j), dn(i,j), err(i,j));
375
376 retval (0) = sn;
377 retval (1) = cn;
378 retval (2) = dn;
379 if (nargout > 3) retval(3) = err;
380 } else
381 error("u m invalid");
382 } else
383 gripe_ellipj_arg ( "second");
384 }
385 /*}}}*/
386 }
387 } else
388 gripe_ellipj_arg ( "second");
389 } // m matrix
390 } else // wrong n. of argin
391 print_usage ();
392 return retval;
393 }
394
395 /*
396 ## demos taken from inst/ellipj.m
397
398 %!demo
399 %! N = 150;
400 %! % m = [1-logspace(0,log(eps),N-1), 1]; ## m near 1
401 %! % m = [0, logspace(log(eps),0,N-1)]; ## m near 0
402 %! m = linspace(0,1,N); ## m equally spaced
403 %! u = linspace(-20,20,N);
404 %! M = ones(length(u),1) * m;
405 %! U = u' * ones(1, length(m));
406 %! [sn, cn, dn] = ellipj(U,M);
407 %!
408 %! %% Plotting
409 %! figure(2)
410 %! c = colormap(hot(64));
411 %! data = {sn,cn,dn};
412 %! dname = {"sn","cn","dn"};
413 %! for i=1:3
414 %! subplot(1,3,i);
415 %! image(m,u,32*clip(data{i},[-1,1])+32); # clip function belongs to audio package
416 %! title(dname{i});
417 %! end
418 %! colormap(c);
419
420 %!demo
421 %! N = 200;
422 %! % m = [1-logspace(0,log(eps),N-1), 1]; ## m near 1
423 %! % m = [0, logspace(log(eps),0,N-1)]; ## m near 0
424 %! m = linspace(0,1,N); ## m equally spaced
425 %! u = linspace(0,20,5);
426 %! M = ones(length(u),1) * m;
427 %! U = u' * ones(1, length(m));
428 %! [sn, cn, dn] = ellipj(U,M);
429 %!
430 %! %% Plotting
431 %! data = {sn,cn,dn};
432 %! dname = {"sn","cn","dn"};
433 %! for i=1:3
434 %! subplot(1,3,i);
435 %! plot(m, data{i});
436 %! title(dname{i});
437 %! grid on;
438 %! end
439 */
440
441 /*
442 ## tests taken from inst/test_sncndn.m
443
444 %!test
445 %! k = (tan(pi/8.))^2; m = k*k;
446 %! SN = [
447 %! -1. + I * 0. , -0.8392965923 + 0. * I
448 %! -1. + I * 0.2 , -0.8559363407 + 0.108250955 * I
449 %! -1. + I * 0.4 , -0.906529758 + 0.2204040232 * I
450 %! -1. + I * 0.6 , -0.9931306727 + 0.3403783409 * I
451 %! -1. + I * 0.8 , -1.119268095 + 0.4720784944 * I
452 %! -1. + I * 1. , -1.29010951 + 0.6192468708 * I
453 %! -1. + I * 1.2 , -1.512691987 + 0.7850890595 * I
454 %! -1. + I * 1.4 , -1.796200374 + 0.9714821804 * I
455 %! -1. + I * 1.6 , -2.152201882 + 1.177446413 * I
456 %! -1. + I * 1.8 , -2.594547417 + 1.396378892 * I
457 %! -1. + I * 2. , -3.138145339 + 1.611394819 * I
458 %! -0.8 + I * 0. , -0.7158157937 + 0. * I
459 %! -0.8 + I * 0.2 , -0.7301746722 + 0.1394690862 * I
460 %! -0.8 + I * 0.4 , -0.7738940898 + 0.2841710966 * I
461 %! -0.8 + I * 0.6 , -0.8489542135 + 0.4394411376 * I
462 %! -0.8 + I * 0.8 , -0.9588386397 + 0.6107824358 * I
463 %! -0.8 + I * 1. , -1.108848724 + 0.8038415767 * I
464 %! -0.8 + I * 1.2 , -1.306629972 + 1.024193359 * I
465 %! -0.8 + I * 1.4 , -1.563010199 + 1.276740951 * I
466 %! -0.8 + I * 1.6 , -1.893274688 + 1.564345558 * I
467 %! -0.8 + I * 1.8 , -2.318944084 + 1.88491973 * I
468 %! -0.8 + I * 2. , -2.869716809 + 2.225506523 * I
469 %! -0.6 + I * 0. , -0.5638287208 + 0. * I
470 %! -0.6 + I * 0.2 , -0.5752723012 + 0.1654722474 * I
471 %! -0.6 + I * 0.4 , -0.610164314 + 0.3374004736 * I
472 %! -0.6 + I * 0.6 , -0.6702507087 + 0.5224614298 * I
473 %! -0.6 + I * 0.8 , -0.7586657365 + 0.7277663879 * I
474 %! -0.6 + I * 1. , -0.8803349115 + 0.9610513652 * I
475 %! -0.6 + I * 1.2 , -1.042696526 + 1.230800819 * I
476 %! -0.6 + I * 1.4 , -1.256964505 + 1.546195843 * I
477 %! -0.6 + I * 1.6 , -1.540333527 + 1.916612621 * I
478 %! -0.6 + I * 1.8 , -1.919816065 + 2.349972151 * I
479 %! -0.6 + I * 2. , -2.438761841 + 2.848129496 * I
480 %! -0.4 + I * 0. , -0.3891382858 + 0. * I
481 %! -0.4 + I * 0.2 , -0.3971152026 + 0.1850563793 * I
482 %! -0.4 + I * 0.4 , -0.4214662882 + 0.3775700801 * I
483 %! -0.4 + I * 0.6 , -0.4635087491 + 0.5853434119 * I
484 %! -0.4 + I * 0.8 , -0.5256432877 + 0.8168992398 * I
485 %! -0.4 + I * 1. , -0.611733177 + 1.081923504 * I
486 %! -0.4 + I * 1.2 , -0.7278102331 + 1.391822501 * I
487 %! -0.4 + I * 1.4 , -0.8833807998 + 1.760456461 * I
488 %! -0.4 + I * 1.6 , -1.093891878 + 2.205107766 * I
489 %! -0.4 + I * 1.8 , -1.385545188 + 2.747638761 * I
490 %! -0.4 + I * 2. , -1.805081271 + 3.41525351 * I
491 %! -0.2 + I * 0. , -0.1986311721 + 0. * I
492 %! -0.2 + I * 0.2 , -0.2027299916 + 0.1972398665 * I
493 %! -0.2 + I * 0.4 , -0.2152524522 + 0.402598347 * I
494 %! -0.2 + I * 0.6 , -0.2369100139 + 0.6246336356 * I
495 %! -0.2 + I * 0.8 , -0.2690115146 + 0.8728455227 * I
496 %! -0.2 + I * 1. , -0.3136938773 + 1.158323088 * I
497 %! -0.2 + I * 1.2 , -0.3743615191 + 1.494672508 * I
498 %! -0.2 + I * 1.4 , -0.4565255082 + 1.899466033 * I
499 %! -0.2 + I * 1.6 , -0.5694611346 + 2.39667232 * I
500 %! -0.2 + I * 1.8 , -0.7296612675 + 3.020990664 * I
501 %! -0.2 + I * 2. , -0.9685726188 + 3.826022536 * I
502 %! 0. + I * 0. , 0. + 0. * I
503 %! 0. + I * 0.2 , 0. + 0.201376364 * I
504 %! 0. + I * 0.4 , 0. + 0.4111029248 * I
505 %! 0. + I * 0.6 , 0. + 0.6380048435 * I
506 %! 0. + I * 0.8 , 0. + 0.8919321473 * I
507 %! 0. + I * 1. , 0. + 1.184486615 * I
508 %! 0. + I * 1.2 , 0. + 1.530096023 * I
509 %! 0. + I * 1.4 , 0. + 1.947754612 * I
510 %! 0. + I * 1.6 , 0. + 2.464074356 * I
511 %! 0. + I * 1.8 , 0. + 3.119049475 * I
512 %! 0. + I * 2. , 0. + 3.97786237 * I
513 %! 0.2 + I * 0. , 0.1986311721 + 0. * I
514 %! 0.2 + I * 0.2 , 0.2027299916 + 0.1972398665 * I
515 %! 0.2 + I * 0.4 , 0.2152524522 + 0.402598347 * I
516 %! 0.2 + I * 0.6 , 0.2369100139 + 0.6246336356 * I
517 %! 0.2 + I * 0.8 , 0.2690115146 + 0.8728455227 * I
518 %! 0.2 + I * 1. , 0.3136938773 + 1.158323088 * I
519 %! 0.2 + I * 1.2 , 0.3743615191 + 1.494672508 * I
520 %! 0.2 + I * 1.4 , 0.4565255082 + 1.899466033 * I
521 %! 0.2 + I * 1.6 , 0.5694611346 + 2.39667232 * I
522 %! 0.2 + I * 1.8 , 0.7296612675 + 3.020990664 * I
523 %! 0.2 + I * 2. , 0.9685726188 + 3.826022536 * I
524 %! 0.4 + I * 0. , 0.3891382858 + 0. * I
525 %! 0.4 + I * 0.2 , 0.3971152026 + 0.1850563793 * I
526 %! 0.4 + I * 0.4 , 0.4214662882 + 0.3775700801 * I
527 %! 0.4 + I * 0.6 , 0.4635087491 + 0.5853434119 * I
528 %! 0.4 + I * 0.8 , 0.5256432877 + 0.8168992398 * I
529 %! 0.4 + I * 1. , 0.611733177 + 1.081923504 * I
530 %! 0.4 + I * 1.2 , 0.7278102331 + 1.391822501 * I
531 %! 0.4 + I * 1.4 , 0.8833807998 + 1.760456461 * I
532 %! 0.4 + I * 1.6 , 1.093891878 + 2.205107766 * I
533 %! 0.4 + I * 1.8 , 1.385545188 + 2.747638761 * I
534 %! 0.4 + I * 2. , 1.805081271 + 3.41525351 * I
535 %! 0.6 + I * 0. , 0.5638287208 + 0. * I
536 %! 0.6 + I * 0.2 , 0.5752723012 + 0.1654722474 * I
537 %! 0.6 + I * 0.4 , 0.610164314 + 0.3374004736 * I
538 %! 0.6 + I * 0.6 , 0.6702507087 + 0.5224614298 * I
539 %! 0.6 + I * 0.8 , 0.7586657365 + 0.7277663879 * I
540 %! 0.6 + I * 1. , 0.8803349115 + 0.9610513652 * I
541 %! 0.6 + I * 1.2 , 1.042696526 + 1.230800819 * I
542 %! 0.6 + I * 1.4 , 1.256964505 + 1.546195843 * I
543 %! 0.6 + I * 1.6 , 1.540333527 + 1.916612621 * I
544 %! 0.6 + I * 1.8 , 1.919816065 + 2.349972151 * I
545 %! 0.6 + I * 2. , 2.438761841 + 2.848129496 * I
546 %! 0.8 + I * 0. , 0.7158157937 + 0. * I
547 %! 0.8 + I * 0.2 , 0.7301746722 + 0.1394690862 * I
548 %! 0.8 + I * 0.4 , 0.7738940898 + 0.2841710966 * I
549 %! 0.8 + I * 0.6 , 0.8489542135 + 0.4394411376 * I
550 %! 0.8 + I * 0.8 , 0.9588386397 + 0.6107824358 * I
551 %! 0.8 + I * 1. , 1.108848724 + 0.8038415767 * I
552 %! 0.8 + I * 1.2 , 1.306629972 + 1.024193359 * I
553 %! 0.8 + I * 1.4 , 1.563010199 + 1.276740951 * I
554 %! 0.8 + I * 1.6 , 1.893274688 + 1.564345558 * I
555 %! 0.8 + I * 1.8 , 2.318944084 + 1.88491973 * I
556 %! 0.8 + I * 2. , 2.869716809 + 2.225506523 * I
557 %! 1. + I * 0. , 0.8392965923 + 0. * I
558 %! 1. + I * 0.2 , 0.8559363407 + 0.108250955 * I
559 %! 1. + I * 0.4 , 0.906529758 + 0.2204040232 * I
560 %! 1. + I * 0.6 , 0.9931306727 + 0.3403783409 * I
561 %! 1. + I * 0.8 , 1.119268095 + 0.4720784944 * I
562 %! 1. + I * 1. , 1.29010951 + 0.6192468708 * I
563 %! 1. + I * 1.2 , 1.512691987 + 0.7850890595 * I
564 %! 1. + I * 1.4 , 1.796200374 + 0.9714821804 * I
565 %! 1. + I * 1.6 , 2.152201882 + 1.177446413 * I
566 %! 1. + I * 1.8 , 2.594547417 + 1.396378892 * I
567 %! 1. + I * 2. , 3.138145339 + 1.611394819 * I
568 %! ];
569 %! CN = [
570 %! -1. + I * 0. , 0.5436738271 + 0. * I
571 %! -1. + I * 0.2 , 0.5541219664 + 0.1672121517 * I
572 %! -1. + I * 0.4 , 0.5857703552 + 0.3410940893 * I
573 %! -1. + I * 0.6 , 0.6395034233 + 0.5285979063 * I
574 %! -1. + I * 0.8 , 0.716688504 + 0.7372552987 * I
575 %! -1. + I * 1. , 0.8189576795 + 0.9755037374 * I
576 %! -1. + I * 1.2 , 0.9477661951 + 1.253049471 * I
577 %! -1. + I * 1.4 , 1.103540657 + 1.581252712 * I
578 %! -1. + I * 1.6 , 1.284098214 + 1.973449038 * I
579 %! -1. + I * 1.8 , 1.481835651 + 2.4449211 * I
580 %! -1. + I * 2. , 1.679032464 + 3.011729224 * I
581 %! -0.8 + I * 0. , 0.6982891589 + 0. * I
582 %! -0.8 + I * 0.2 , 0.71187169 + 0.1430549855 * I
583 %! -0.8 + I * 0.4 , 0.7530744458 + 0.2920273465 * I
584 %! -0.8 + I * 0.6 , 0.8232501212 + 0.4531616768 * I
585 %! -0.8 + I * 0.8 , 0.9245978896 + 0.6334016187 * I
586 %! -0.8 + I * 1. , 1.060030206 + 0.8408616109 * I
587 %! -0.8 + I * 1.2 , 1.232861756 + 1.085475913 * I
588 %! -0.8 + I * 1.4 , 1.446126965 + 1.379933558 * I
589 %! -0.8 + I * 1.6 , 1.701139468 + 1.741030588 * I
590 %! -0.8 + I * 1.8 , 1.994526268 + 2.191509596 * I
591 %! -0.8 + I * 2. , 2.312257188 + 2.762051518 * I
592 %! -0.6 + I * 0. , 0.8258917445 + 0. * I
593 %! -0.6 + I * 0.2 , 0.842151698 + 0.1130337928 * I
594 %! -0.6 + I * 0.4 , 0.8915487431 + 0.2309124769 * I
595 %! -0.6 + I * 0.6 , 0.975948103 + 0.3588102098 * I
596 %! -0.6 + I * 0.8 , 1.098499209 + 0.5026234141 * I
597 %! -0.6 + I * 1. , 1.263676101 + 0.6695125973 * I
598 %! -0.6 + I * 1.2 , 1.477275851 + 0.8687285705 * I
599 %! -0.6 + I * 1.4 , 1.746262523 + 1.112955966 * I
600 %! -0.6 + I * 1.6 , 2.078179075 + 1.420581466 * I
601 %! -0.6 + I * 1.8 , 2.479425208 + 1.819580713 * I
602 %! -0.6 + I * 2. , 2.950586798 + 2.354077344 * I
603 %! -0.4 + I * 0. , 0.9211793498 + 0. * I
604 %! -0.4 + I * 0.2 , 0.9395019377 + 0.07822091534 * I
605 %! -0.4 + I * 0.4 , 0.9952345231 + 0.1598950363 * I
606 %! -0.4 + I * 0.6 , 1.090715991 + 0.2487465067 * I
607 %! -0.4 + I * 0.8 , 1.229998843 + 0.34910407 * I
608 %! -0.4 + I * 1. , 1.419103868 + 0.4663848201 * I
609 %! -0.4 + I * 1.2 , 1.666426377 + 0.607877235 * I
610 %! -0.4 + I * 1.4 , 1.983347336 + 0.7841054404 * I
611 %! -0.4 + I * 1.6 , 2.385101684 + 1.01134031 * I
612 %! -0.4 + I * 1.8 , 2.89185416 + 1.316448705 * I
613 %! -0.4 + I * 2. , 3.529393374 + 1.74670531 * I
614 %! -0.2 + I * 0. , 0.9800743122 + 0. * I
615 %! -0.2 + I * 0.2 , 0.9997019476 + 0.03999835809 * I
616 %! -0.2 + I * 0.4 , 1.059453907 + 0.08179712295 * I
617 %! -0.2 + I * 0.6 , 1.16200643 + 0.1273503824 * I
618 %! -0.2 + I * 0.8 , 1.312066413 + 0.1789585449 * I
619 %! -0.2 + I * 1. , 1.516804331 + 0.2395555269 * I
620 %! -0.2 + I * 1.2 , 1.786613221 + 0.313189147 * I
621 %! -0.2 + I * 1.4 , 2.136422971 + 0.405890925 * I
622 %! -0.2 + I * 1.6 , 2.588021972 + 0.527357091 * I
623 %! -0.2 + I * 1.8 , 3.174302819 + 0.6944201617 * I
624 %! -0.2 + I * 2. , 3.947361147 + 0.9387994989 * I
625 %! 0. + I * 0. , 1. + 0. * I
626 %! 0. + I * 0.2 , 1.020074723 + 0. * I
627 %! 0. + I * 0.4 , 1.08120563 + 0. * I
628 %! 0. + I * 0.6 , 1.18619146 + 0. * I
629 %! 0. + I * 0.8 , 1.339978715 + 0. * I
630 %! 0. + I * 1. , 1.550164037 + 0. * I
631 %! 0. + I * 1.2 , 1.827893279 + 0. * I
632 %! 0. + I * 1.4 , 2.189462954 + 0. * I
633 %! 0. + I * 1.6 , 2.659259752 + 0. * I
634 %! 0. + I * 1.8 , 3.275434266 + 0. * I
635 %! 0. + I * 2. , 4.101632484 + 0. * I
636 %! 0.2 + I * 0. , 0.9800743122 + 0. * I
637 %! 0.2 + I * 0.2 , 0.9997019476 - 0.03999835809 * I
638 %! 0.2 + I * 0.4 , 1.059453907 - 0.08179712295 * I
639 %! 0.2 + I * 0.6 , 1.16200643 - 0.1273503824 * I
640 %! 0.2 + I * 0.8 , 1.312066413 - 0.1789585449 * I
641 %! 0.2 + I * 1. , 1.516804331 - 0.2395555269 * I
642 %! 0.2 + I * 1.2 , 1.786613221 - 0.313189147 * I
643 %! 0.2 + I * 1.4 , 2.136422971 - 0.405890925 * I
644 %! 0.2 + I * 1.6 , 2.588021972 - 0.527357091 * I
645 %! 0.2 + I * 1.8 , 3.174302819 - 0.6944201617 * I
646 %! 0.2 + I * 2. , 3.947361147 - 0.9387994989 * I
647 %! 0.4 + I * 0. , 0.9211793498 + 0. * I
648 %! 0.4 + I * 0.2 , 0.9395019377 - 0.07822091534 * I
649 %! 0.4 + I * 0.4 , 0.9952345231 - 0.1598950363 * I
650 %! 0.4 + I * 0.6 , 1.090715991 - 0.2487465067 * I
651 %! 0.4 + I * 0.8 , 1.229998843 - 0.34910407 * I
652 %! 0.4 + I * 1. , 1.419103868 - 0.4663848201 * I
653 %! 0.4 + I * 1.2 , 1.666426377 - 0.607877235 * I
654 %! 0.4 + I * 1.4 , 1.983347336 - 0.7841054404 * I
655 %! 0.4 + I * 1.6 , 2.385101684 - 1.01134031 * I
656 %! 0.4 + I * 1.8 , 2.89185416 - 1.316448705 * I
657 %! 0.4 + I * 2. , 3.529393374 - 1.74670531 * I
658 %! 0.6 + I * 0. , 0.8258917445 + 0. * I
659 %! 0.6 + I * 0.2 , 0.842151698 - 0.1130337928 * I
660 %! 0.6 + I * 0.4 , 0.8915487431 - 0.2309124769 * I
661 %! 0.6 + I * 0.6 , 0.975948103 - 0.3588102098 * I
662 %! 0.6 + I * 0.8 , 1.098499209 - 0.5026234141 * I
663 %! 0.6 + I * 1. , 1.263676101 - 0.6695125973 * I
664 %! 0.6 + I * 1.2 , 1.477275851 - 0.8687285705 * I
665 %! 0.6 + I * 1.4 , 1.746262523 - 1.112955966 * I
666 %! 0.6 + I * 1.6 , 2.078179075 - 1.420581466 * I
667 %! 0.6 + I * 1.8 , 2.479425208 - 1.819580713 * I
668 %! 0.6 + I * 2. , 2.950586798 - 2.354077344 * I
669 %! 0.8 + I * 0. , 0.6982891589 + 0. * I
670 %! 0.8 + I * 0.2 , 0.71187169 - 0.1430549855 * I
671 %! 0.8 + I * 0.4 , 0.7530744458 - 0.2920273465 * I
672 %! 0.8 + I * 0.6 , 0.8232501212 - 0.4531616768 * I
673 %! 0.8 + I * 0.8 , 0.9245978896 - 0.6334016187 * I
674 %! 0.8 + I * 1. , 1.060030206 - 0.8408616109 * I
675 %! 0.8 + I * 1.2 , 1.232861756 - 1.085475913 * I
676 %! 0.8 + I * 1.4 , 1.446126965 - 1.379933558 * I
677 %! 0.8 + I * 1.6 , 1.701139468 - 1.741030588 * I
678 %! 0.8 + I * 1.8 , 1.994526268 - 2.191509596 * I
679 %! 0.8 + I * 2. , 2.312257188 - 2.762051518 * I
680 %! 1. + I * 0. , 0.5436738271 + 0. * I
681 %! 1. + I * 0.2 , 0.5541219664 - 0.1672121517 * I
682 %! 1. + I * 0.4 , 0.5857703552 - 0.3410940893 * I
683 %! 1. + I * 0.6 , 0.6395034233 - 0.5285979063 * I
684 %! 1. + I * 0.8 , 0.716688504 - 0.7372552987 * I
685 %! 1. + I * 1. , 0.8189576795 - 0.9755037374 * I
686 %! 1. + I * 1.2 , 0.9477661951 - 1.253049471 * I
687 %! 1. + I * 1.4 , 1.103540657 - 1.581252712 * I
688 %! 1. + I * 1.6 , 1.284098214 - 1.973449038 * I
689 %! 1. + I * 1.8 , 1.481835651 - 2.4449211 * I
690 %! 1. + I * 2. , 1.679032464 - 3.011729224 * I
691 %! ];
692 %! DN = [
693 %! -1. + I * 0. , 0.9895776106 + 0. * I
694 %! -1. + I * 0.2 , 0.9893361555 + 0.002756935338 * I
695 %! -1. + I * 0.4 , 0.9885716856 + 0.005949639805 * I
696 %! -1. + I * 0.6 , 0.9871564855 + 0.01008044183 * I
697 %! -1. + I * 0.8 , 0.9848512162 + 0.01579337596 * I
698 %! -1. + I * 1. , 0.9812582484 + 0.02396648455 * I
699 %! -1. + I * 1.2 , 0.9757399152 + 0.0358288294 * I
700 %! -1. + I * 1.4 , 0.9672786056 + 0.0531049859 * I
701 %! -1. + I * 1.6 , 0.954237868 + 0.0781744383 * I
702 %! -1. + I * 1.8 , 0.933957524 + 0.1141918269 * I
703 %! -1. + I * 2. , 0.9020917489 + 0.1650142936 * I
704 %! -0.8 + I * 0. , 0.992429635 + 0. * I
705 %! -0.8 + I * 0.2 , 0.9924147861 + 0.003020708044 * I
706 %! -0.8 + I * 0.4 , 0.99236555 + 0.00652359532 * I
707 %! -0.8 + I * 0.6 , 0.9922655715 + 0.0110676219 * I
708 %! -0.8 + I * 0.8 , 0.9920785856 + 0.01737733806 * I
709 %! -0.8 + I * 1. , 0.9917291795 + 0.02645738598 * I
710 %! -0.8 + I * 1.2 , 0.9910606387 + 0.03974949378 * I
711 %! -0.8 + I * 1.4 , 0.9897435004 + 0.05935252515 * I
712 %! -0.8 + I * 1.6 , 0.987077644 + 0.08832675281 * I
713 %! -0.8 + I * 1.8 , 0.9815667458 + 0.1310872821 * I
714 %! -0.8 + I * 2. , 0.970020127 + 0.1938136793 * I
715 %! -0.6 + I * 0. , 0.9953099088 + 0. * I
716 %! -0.6 + I * 0.2 , 0.995526009 + 0.002814772354 * I
717 %! -0.6 + I * 0.4 , 0.9962071136 + 0.006083312292 * I
718 %! -0.6 + I * 0.6 , 0.9974557125 + 0.01033463525 * I
719 %! -0.6 + I * 0.8 , 0.9994560563 + 0.01626207722 * I
720 %! -0.6 + I * 1. , 1.00249312 + 0.02484336286 * I
721 %! -0.6 + I * 1.2 , 1.006973922 + 0.0375167093 * I
722 %! -0.6 + I * 1.4 , 1.013436509 + 0.05645315628 * I
723 %! -0.6 + I * 1.6 , 1.022504295 + 0.08499262247 * I
724 %! -0.6 + I * 1.8 , 1.034670023 + 0.1283564595 * I
725 %! -0.6 + I * 2. , 1.049599899 + 0.194806122 * I
726 %! -0.4 + I * 0. , 0.9977686897 + 0. * I
727 %! -0.4 + I * 0.2 , 0.9981836165 + 0.002167241934 * I
728 %! -0.4 + I * 0.4 , 0.9994946045 + 0.004686808612 * I
729 %! -0.4 + I * 0.6 , 1.001910789 + 0.00797144174 * I
730 %! -0.4 + I * 0.8 , 1.005817375 + 0.01256717724 * I
731 %! -0.4 + I * 1. , 1.011836374 + 0.01925509038 * I
732 %! -0.4 + I * 1.2 , 1.020923572 + 0.02920828367 * I
733 %! -0.4 + I * 1.4 , 1.034513743 + 0.04425213602 * I
734 %! -0.4 + I * 1.6 , 1.054725746 + 0.06732276244 * I
735 %! -0.4 + I * 1.8 , 1.08462027 + 0.1033236812 * I
736 %! -0.4 + I * 2. , 1.128407402 + 0.1608240664 * I
737 %! -0.2 + I * 0. , 0.9994191176 + 0. * I
738 %! -0.2 + I * 0.2 , 0.9999683719 + 0.001177128019 * I
739 %! -0.2 + I * 0.4 , 1.001705496 + 0.00254669712 * I
740 %! -0.2 + I * 0.6 , 1.004913944 + 0.004334880912 * I
741 %! -0.2 + I * 0.8 , 1.010120575 + 0.006842775622 * I
742 %! -0.2 + I * 1. , 1.018189543 + 0.01050520136 * I
743 %! -0.2 + I * 1.2 , 1.030482479 + 0.01598431001 * I
744 %! -0.2 + I * 1.4 , 1.049126108 + 0.02433134655 * I
745 %! -0.2 + I * 1.6 , 1.077466003 + 0.0372877718 * I
746 %! -0.2 + I * 1.8 , 1.120863308 + 0.05789156398 * I
747 %! -0.2 + I * 2. , 1.188162088 + 0.09181238708 * I
748 %! 0. + I * 0. , 1. + 0. * I
749 %! 0. + I * 0.2 , 1.000596698 + 0. * I
750 %! 0. + I * 0.4 , 1.002484444 + 0. * I
751 %! 0. + I * 0.6 , 1.005973379 + 0. * I
752 %! 0. + I * 0.8 , 1.011641536 + 0. * I
753 %! 0. + I * 1. , 1.020441432 + 0. * I
754 %! 0. + I * 1.2 , 1.033885057 + 0. * I
755 %! 0. + I * 1.4 , 1.054361188 + 0. * I
756 %! 0. + I * 1.6 , 1.085694733 + 0. * I
757 %! 0. + I * 1.8 , 1.134186672 + 0. * I
758 %! 0. + I * 2. , 1.210701071 + 0. * I
759 %! 0.2 + I * 0. , 0.9994191176 + 0. * I
760 %! 0.2 + I * 0.2 , 0.9999683719 - 0.001177128019 * I
761 %! 0.2 + I * 0.4 , 1.001705496 - 0.00254669712 * I
762 %! 0.2 + I * 0.6 , 1.004913944 - 0.004334880912 * I
763 %! 0.2 + I * 0.8 , 1.010120575 - 0.006842775622 * I
764 %! 0.2 + I * 1. , 1.018189543 - 0.01050520136 * I
765 %! 0.2 + I * 1.2 , 1.030482479 - 0.01598431001 * I
766 %! 0.2 + I * 1.4 , 1.049126108 - 0.02433134655 * I
767 %! 0.2 + I * 1.6 , 1.077466003 - 0.0372877718 * I
768 %! 0.2 + I * 1.8 , 1.120863308 - 0.05789156398 * I
769 %! 0.2 + I * 2. , 1.188162088 - 0.09181238708 * I
770 %! 0.4 + I * 0. , 0.9977686897 + 0. * I
771 %! 0.4 + I * 0.2 , 0.9981836165 - 0.002167241934 * I
772 %! 0.4 + I * 0.4 , 0.9994946045 - 0.004686808612 * I
773 %! 0.4 + I * 0.6 , 1.001910789 - 0.00797144174 * I
774 %! 0.4 + I * 0.8 , 1.005817375 - 0.01256717724 * I
775 %! 0.4 + I * 1. , 1.011836374 - 0.01925509038 * I
776 %! 0.4 + I * 1.2 , 1.020923572 - 0.02920828367 * I
777 %! 0.4 + I * 1.4 , 1.034513743 - 0.04425213602 * I
778 %! 0.4 + I * 1.6 , 1.054725746 - 0.06732276244 * I
779 %! 0.4 + I * 1.8 , 1.08462027 - 0.1033236812 * I
780 %! 0.4 + I * 2. , 1.128407402 - 0.1608240664 * I
781 %! 0.6 + I * 0. , 0.9953099088 + 0. * I
782 %! 0.6 + I * 0.2 , 0.995526009 - 0.002814772354 * I
783 %! 0.6 + I * 0.4 , 0.9962071136 - 0.006083312292 * I
784 %! 0.6 + I * 0.6 , 0.9974557125 - 0.01033463525 * I
785 %! 0.6 + I * 0.8 , 0.9994560563 - 0.01626207722 * I
786 %! 0.6 + I * 1. , 1.00249312 - 0.02484336286 * I
787 %! 0.6 + I * 1.2 , 1.006973922 - 0.0375167093 * I
788 %! 0.6 + I * 1.4 , 1.013436509 - 0.05645315628 * I
789 %! 0.6 + I * 1.6 , 1.022504295 - 0.08499262247 * I
790 %! 0.6 + I * 1.8 , 1.034670023 - 0.1283564595 * I
791 %! 0.6 + I * 2. , 1.049599899 - 0.194806122 * I
792 %! 0.8 + I * 0. , 0.992429635 + 0. * I
793 %! 0.8 + I * 0.2 , 0.9924147861 - 0.003020708044 * I
794 %! 0.8 + I * 0.4 , 0.99236555 - 0.00652359532 * I
795 %! 0.8 + I * 0.6 , 0.9922655715 - 0.0110676219 * I
796 %! 0.8 + I * 0.8 , 0.9920785856 - 0.01737733806 * I
797 %! 0.8 + I * 1. , 0.9917291795 - 0.02645738598 * I
798 %! 0.8 + I * 1.2 , 0.9910606387 - 0.03974949378 * I
799 %! 0.8 + I * 1.4 , 0.9897435004 - 0.05935252515 * I
800 %! 0.8 + I * 1.6 , 0.987077644 - 0.08832675281 * I
801 %! 0.8 + I * 1.8 , 0.9815667458 - 0.1310872821 * I
802 %! 0.8 + I * 2. , 0.970020127 - 0.1938136793 * I
803 %! 1. + I * 0. , 0.9895776106 + 0. * I
804 %! 1. + I * 0.2 , 0.9893361555 - 0.002756935338 * I
805 %! 1. + I * 0.4 , 0.9885716856 - 0.005949639805 * I
806 %! 1. + I * 0.6 , 0.9871564855 - 0.01008044183 * I
807 %! 1. + I * 0.8 , 0.9848512162 - 0.01579337596 * I
808 %! 1. + I * 1. , 0.9812582484 - 0.02396648455 * I
809 %! 1. + I * 1.2 , 0.9757399152 - 0.0358288294 * I
810 %! 1. + I * 1.4 , 0.9672786056 - 0.0531049859 * I
811 %! 1. + I * 1.6 , 0.954237868 - 0.0781744383 * I
812 %! 1. + I * 1.8 , 0.933957524 - 0.1141918269 * I
813 %! 1. + I * 2. , 0.9020917489 - 0.1650142936 * I
814 %! ];
815 %! tol = 1e-9;
816 %! for x = 0:10
817 %! for y = 0:10
818 %! ur = -1 + x * 0.2;
819 %! ui = y * 0.2;
820 %! ii = 1 + y + x*11;
821 %! [sn, cn, dn] = ellipj (ur + I * ui, m);
822 %! assert (SN (ii, 2), sn, tol);
823 %! assert (CN (ii, 2), cn, tol);
824 %! assert (DN (ii, 2), dn, tol);
825 %! endfor
826 %! endfor
827
828 ## tests taken from test_ellipj.m
829 %!test
830 %! u1 = pi/3; m1 = 0;
831 %! res1 = [sin(pi/3), cos(pi/3), 1];
832 %! [sn,cn,dn]=ellipj(u1,m1);
833 %! assert([sn,cn,dn], res1, 10*eps);
834
835 %!test
836 %! u2 = log(2); m2 = 1;
837 %! res2 = [ 3/5, 4/5, 4/5 ];
838 %! [sn,cn,dn]=ellipj(u2,m2);
839 %! assert([sn,cn,dn], res2, 10*eps);
840
841 %!test
842 %! u3 = log(2)*1i; m3 = 0;
843 %! res3 = [3i/4,5/4,1];
844 %! [sn,cn,dn]=ellipj(u3,m3);
845 %! assert([sn,cn,dn], res3, 10*eps);
846
847 %!test
848 %! u4 = -1; m4 = tan(pi/8)^4;
849 %! res4 = [-0.8392965923,0.5436738271,0.9895776106];
850 %! [sn,cn,dn]=ellipj(u4, m4);
851 %! assert([sn,cn,dn], res4, 1e-10);
852
853 %!test
854 %! u5 = -0.2 + 0.4i; m5 = tan(pi/8)^4;
855 %! res5 = [ -0.2152524522 + 0.402598347i, ...
856 %! 1.059453907 + 0.08179712295i, ...
857 %! 1.001705496 + 0.00254669712i ];
858 %! [sn,cn,dn]=ellipj(u5,m5);
859 %! assert([sn,cn,dn], res5, 1e-9);
860
861 %!test
862 %! u6 = 0.2 + 0.6i; m6 = tan(pi/8)^4;
863 %! res6 = [ 0.2369100139 + 0.624633635i, ...
864 %! 1.16200643 - 0.1273503824i, ...
865 %! 1.004913944 - 0.004334880912i ];
866 %! [sn,cn,dn]=ellipj(u6,m6);
867 %! assert([sn,cn,dn], res6, 1e-8);
868
869 %!test
870 %! u7 = 0.8 + 0.8i; m7 = tan(pi/8)^4;
871 %! res7 = [0.9588386397 + 0.6107824358i, ...
872 %! 0.9245978896 - 0.6334016187i, ...
873 %! 0.9920785856 - 0.01737733806i ];
874 %! [sn,cn,dn]=ellipj(u7,m7);
875 %! assert([sn,cn,dn], res7, 1e-10);
876
877 %!test
878 %! u=[0,pi/6,pi/4,pi/2]; m=0;
879 %! res = [0,1/2,1/sqrt(2),1;1,cos(pi/6),1/sqrt(2),0;1,1,1,1];
880 %! [sn,cn,dn]=ellipj(u,m);
881 %! assert([sn;cn;dn],res, 100*eps);
882 %! [sn,cn,dn]=ellipj(u',0);
883 %! assert([sn,cn,dn],res', 100*eps);
884
885 ## XXX FIXME XXX
886 ## need to check [real,complex]x[scalar,rowvec,colvec,matrix]x[u,m]
887
888 %!test
889 %! ## Test Jacobi elliptic functions
890 %! ## against "exact" solution from Mathematica 3.0
891 %! ## David Billinghurst <David.Billinghurst@riotinto.com>
892 %! ## 1 February 2001
893 %! u = [ 0.25; 0.25; 0.20; 0.20; 0.672; 0.5];
894 %! m = [ 0.0; 1.0; 0.19; 0.81; 0.36; 0.9999999999];
895 %! S = [ sin(0.25); tanh(0.25);
896 %! 0.19842311013970879516;
897 %! 0.19762082367187648571;
898 %! 0.6095196917919021945;
899 %! 0.4621171572617320908 ];
900 %! C = [ cos(0.25); sech(0.25);
901 %! 0.9801164570409401062;
902 %! 0.9802785369736752032;
903 %! 0.7927709286533560550;
904 %! 0.8868188839691764094 ];
905 %! D = [ 1.0; sech(0.25);
906 %! 0.9962526643271134302;
907 %! 0.9840560289645665155;
908 %! 0.9307281387786906491;
909 %! 0.8868188839812167635 ];
910 %! [sn,cn,dn] = ellipj(u,m);
911 %! assert(sn,S,8*eps);
912 %! assert(cn,C,8*eps);
913 %! assert(dn,D,8*eps);
914 */