annotate scripts/specfun/sinint.m @ 31230:6646f2b5a3d1

lcm.m: Emit warnings when results not exact (Bug #32924)
author Arun Giridhar <arungiridhar@gmail.com>
date Sat, 17 Sep 2022 04:22:38 -0400
parents 5d3faba0342e
children 597f3ee61a48
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
1 ########################################################################
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
2 ##
30564
796f54d4ddbf update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 29359
diff changeset
3 ## Copyright (C) 2017-2022 The Octave Project Developers
27918
b442ec6dda5c use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents: 26376
diff changeset
4 ##
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
5 ## See the file COPYRIGHT.md in the top-level directory of this
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
6 ## distribution or <https://octave.org/copyright/>.
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
7 ##
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
8 ## This file is part of Octave.
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
9 ##
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
10 ## Octave is free software: you can redistribute it and/or modify it
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
11 ## under the terms of the GNU General Public License as published by
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
12 ## the Free Software Foundation, either version 3 of the License, or
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
13 ## (at your option) any later version.
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
14 ##
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
15 ## Octave is distributed in the hope that it will be useful, but
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
16 ## WITHOUT ANY WARRANTY; without even the implied warranty of
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
17 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
18 ## GNU General Public License for more details.
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
19 ##
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
20 ## You should have received a copy of the GNU General Public License
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
21 ## along with Octave; see the file COPYING. If not, see
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
22 ## <https://www.gnu.org/licenses/>.
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
23 ##
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
24 ########################################################################
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
25
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
26 ## -*- texinfo -*-
30875
5d3faba0342e doc: Ensure documentation lists output argument when it exists for all m-files.
Rik <rik@octave.org>
parents: 30564
diff changeset
27 ## @deftypefn {} {@var{y} =} sinint (@var{x})
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
28 ## Compute the sine integral function:
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
29 ## @tex
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
30 ## $$
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
31 ## {\rm Si} (x) = \int_0^x {\sin (t) \over t} dt
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
32 ## $$
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
33 ## @end tex
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
34 ## @ifnottex
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
35 ##
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
36 ## @example
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
37 ## @group
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
38 ## x
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
39 ## /
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
40 ## Si (x) = | sin (t) / t dt
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
41 ## /
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
42 ## 0
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
43 ## @end group
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
44 ## @end example
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
45 ##
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
46 ## @end ifnottex
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
47 ##
25032
a1e391e33004 doc: grammarcheck documentation again ahead of 4.4 release.
Rik <rik@octave.org>
parents: 24996
diff changeset
48 ## Reference:
a1e391e33004 doc: grammarcheck documentation again ahead of 4.4 release.
Rik <rik@octave.org>
parents: 24996
diff changeset
49 ## @nospell{M. Abramowitz and I.A. Stegun},
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
50 ## @cite{Handbook of Mathematical Functions}, 1964.
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
51 ##
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
52 ## @seealso{cosint, expint, sin}
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
53 ## @end deftypefn
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
54
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
55 function y = sinint (x)
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
56
28891
de5f2f9a64ff maint: Use same coding style when checking for a minimum of 1 input.
Rik <rik@octave.org>
parents: 28886
diff changeset
57 if (nargin < 1)
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
58 print_usage ();
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
59 endif
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
60
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
61 if (! isnumeric (x))
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
62 error ("sinint: X must be numeric");
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
63 endif
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
64
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
65 ## Convert to floating point if necessary
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
66 if (isinteger (x))
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
67 x = double (x);
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
68 endif
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
69
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
70 ## Convert to column vector
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
71 orig_sz = size (x);
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
72 x = x(:);
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
73 if (iscomplex (x))
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
74 ## Work around reshape which narrows to real (bug #52953)
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
75 x = complex (real (x)(:), imag (x)(:));
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
76 else
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
77 x = x(:);
28947
b73a54c31152 maint: Use Octave-specific end keywords rather than just 'end'.
Rik <rik@octave.org>
parents: 28929
diff changeset
78 endif
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
79
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
80 ## Initialize the result
24911
8d6f3941a118 Support single precision in sinint/cosint.
Colin Macdonald <cbm@m.fsf.org>
parents: 24910
diff changeset
81 y = zeros (size (x), class (x));
8d6f3941a118 Support single precision in sinint/cosint.
Colin Macdonald <cbm@m.fsf.org>
parents: 24910
diff changeset
82 tol = eps (class (x));
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
83
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
84 todo = true (size (x));
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
85
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
86 ## Special values
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
87 y(x == 0) = x(x == 0); # correctly signed zero
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
88 y(x == Inf) = pi / 2;
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
89 y(x == - Inf) = - pi / 2;
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
90
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
91 todo = ((todo) & (x != 0) & (x != Inf) & (x != - Inf));
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
92
24910
b98755ef7572 Style changes in sinint/cosint.
Colin Macdonald <cbm@m.fsf.org>
parents: 24909
diff changeset
93 ## For values large in modulus we use the relation with expint
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
94
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
95 flag_large = abs (x) > 2;
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
96 xx = x(flag_large & todo);
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
97 ii_neg = (real (xx) < 0);
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
98 xx(ii_neg) *= -1;
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
99 ii_conj = (real (xx) == 0) & (imag (xx) < 0);
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
100 xx(ii_conj) = conj (xx(ii_conj));
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
101 yy = -0.5i * (expint (1i * xx) - expint (-1i * xx)) + pi / 2;
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
102 yy(ii_neg) *= -1;
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
103 yy(ii_conj) = conj (yy(ii_conj));
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
104 y(todo & flag_large) = yy;
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
105
24910
b98755ef7572 Style changes in sinint/cosint.
Colin Macdonald <cbm@m.fsf.org>
parents: 24909
diff changeset
106 ## For values small in modulus we use the series expansion
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
107
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
108 todo = (todo) & (! flag_large);
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
109 xx = x(todo);
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
110 ssum = xx; # First term of the series expansion
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
111 yy = ssum;
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
112 flag_sum = true (nnz (todo), 1);
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
113 it = 0;
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
114 maxit = 300;
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
115 while (any (flag_sum) && (it < maxit))
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
116 ssum .*= - xx .^ 2 * (2 * it + 1) / ((2 * it + 3) ^ 2 * (2 * it + 2));
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
117 yy(flag_sum) += ssum (flag_sum);
24911
8d6f3941a118 Support single precision in sinint/cosint.
Colin Macdonald <cbm@m.fsf.org>
parents: 24910
diff changeset
118 flag_sum = (abs (ssum) >= tol);
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
119 it++;
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
120 endwhile
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
121
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
122 y(todo) = yy;
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
123
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
124 y = reshape (y, orig_sz);
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
125
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
126 endfunction
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
127
24910
b98755ef7572 Style changes in sinint/cosint.
Colin Macdonald <cbm@m.fsf.org>
parents: 24909
diff changeset
128
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
129 %!assert (sinint (1.1), 1.02868521867373, -5e-15)
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
130
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
131 %!test
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
132 %! x = [2, 3, pi; exp(1), 5, 6];
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
133 %! A = sinint (x);
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
134 %! B = [1.60541297680269, 1.84865252799947, 1.85193705198247e+00; ...
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
135 %! 1.82104026914757, 1.54993124494467, 1.42468755128051e+00];
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
136 %! assert (A, B, -5e-15);
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
137
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
138 ## Test exceptional values
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
139 %!assert (sinint (0), 0)
24912
08c871c4147b sinint(0) returns correctly signed zero output.
Colin Macdonald <cbm@m.fsf.org>
parents: 24911
diff changeset
140 %!assert (signbit (sinint (-0)))
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
141 %!assert (sinint (Inf), pi/2)
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
142 %!assert (sinint (-Inf), -pi/2)
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
143 %!assert (isnan (sinint (NaN)))
24911
8d6f3941a118 Support single precision in sinint/cosint.
Colin Macdonald <cbm@m.fsf.org>
parents: 24910
diff changeset
144
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
145 ## Check single data type is preserved
24911
8d6f3941a118 Support single precision in sinint/cosint.
Colin Macdonald <cbm@m.fsf.org>
parents: 24910
diff changeset
146 %!assert (class (sinint (single (1))), "single")
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
147
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
148 ## Tests against Maple
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
149 %!assert (sinint (1) , 0.9460830703671830149414, -2*eps)
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
150 %!assert (sinint (-1) , -0.9460830703671830149414, -2*eps)
24996
f80e68529bbf test: relax tolerances on specfun tests to pass on i386 (bug #53437)
Mike Miller <mtmiller@octave.org>
parents: 24927
diff changeset
151 %!assert (sinint (pi) , 1.851937051982466170361, -3*eps)
f80e68529bbf test: relax tolerances on specfun tests to pass on i386 (bug #53437)
Mike Miller <mtmiller@octave.org>
parents: 24927
diff changeset
152 %!assert (sinint (-pi), -1.851937051982466170361, -3*eps)
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
153 %!assert (sinint (300), 1.5708810882137495193, -2*eps)
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
154 %!assert (sinint (1e4), 1.5708915453859619157, -2*eps)
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
155 %!assert (sinint (20i), 1.2807826332028294459e7*1i, -2*eps)
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
156
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
157 %!test
24910
b98755ef7572 Style changes in sinint/cosint.
Colin Macdonald <cbm@m.fsf.org>
parents: 24909
diff changeset
158 %! x = (0:4)';
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
159 %! y_ex = [0
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
160 %! 0.946083070367183015
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
161 %! 1.60541297680269485
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
162 %! 1.84865252799946826
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
163 %! 1.75820313894905306];
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
164 %! assert (sinint (x), y_ex, -4*eps);
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
165
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
166 %!test
24910
b98755ef7572 Style changes in sinint/cosint.
Colin Macdonald <cbm@m.fsf.org>
parents: 24909
diff changeset
167 %! x = -(0:4)';
24909
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
168 %! y_ex = - [0
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
169 %! 0.946083070367183015
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
170 %! 1.60541297680269485
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
171 %! 1.84865252799946826
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
172 %! 1.75820313894905306];
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
173 %! assert (sinint (x), y_ex, -4*eps);
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
174
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
175 %!test
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
176 %! x = 1i * (0:4).';
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
177 %! y_ex = [0
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
178 %! 1.05725087537572851*I
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
179 %! 2.50156743335497564*I
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
180 %! 4.97344047585980680*I
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
181 %! 9.81732691123303446*I];
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
182 %! assert (sinint (x), y_ex, -4*eps);
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
183
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
184 %!test
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
185 %! x = - 1i * (0:4).';
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
186 %! y_ex = - [0
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
187 %! 1.05725087537572851*I
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
188 %! 2.50156743335497564*I
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
189 %! 4.97344047585980680*I
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
190 %! 9.81732691123303446*I];
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
191 %! assert (sinint (x), y_ex, -4*eps);
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
192
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
193 %!test
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
194 %! % maple:
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
195 %! % > A := [1+2*I, -2 + 5*I, 100, 10*I, -1e-4 + 1e-6*I, -20 + I];
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
196 %! % > for a in A do evalf(Si(a)) end do;
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
197 %! x = [1+2i; -2+5i; 100; 10i; -1e-4 + 1e-6*1i; -20-1i];
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
198 %! A = [ 1.6782404878293681180 + 2.0396845546022061045*1i
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
199 %! -18.154174221650281533 + 1.6146414539230479060*1i
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
200 %! 1.5622254668890562934
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
201 %! 1246.1144901994233444*1i
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
202 %! -0.000099999999944461111128 + 0.99999999833338888972e-6*1i
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
203 %! -1.5386156269726011209 - 0.053969388020443786229*1i ];
4a341330ee15 Added sine integral and cosine integral functions.
Michele Ginesi <michele.ginesi@gmail.com>
parents:
diff changeset
204 %! B = sinint (x);
28929
9e43deb9bfc3 maint: Use semicolon after assert statement inside %!test blocks.
Rik <rik@octave.org>
parents: 28891
diff changeset
205 %! assert (A, B, -3*eps);
24911
8d6f3941a118 Support single precision in sinint/cosint.
Colin Macdonald <cbm@m.fsf.org>
parents: 24910
diff changeset
206 %! B = sinint (single (x));
28929
9e43deb9bfc3 maint: Use semicolon after assert statement inside %!test blocks.
Rik <rik@octave.org>
parents: 28891
diff changeset
207 %! assert (A, B, -3*eps ("single"));
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
208
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
209 ## FIXME: Need a test for bug #52953
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
210 %#!test <*52953>
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
211
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
212 ## Test input validation
28886
d8318c12d903 test: remove unnecessary BIST tests in m-files checking for excessive number of inputs.
Rik <rik@octave.org>
parents: 27923
diff changeset
213 %!error <Invalid call> sinint ()
24927
c280560d9c96 Overhaul special functions modified by GSOC2018 project.
Rik <rik@octave.org>
parents: 24923
diff changeset
214 %!error <X must be numeric> sinint ("1")