141 lines
5.5 KiB
JavaScript
141 lines
5.5 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.cyl_bessel_k = exports.cyl_bessel_i = exports.sph_neumann = exports.sph_bessel = exports.cyl_neumann = exports.cyl_bessel_j = void 0;
|
|
//================================================================
|
|
/**
|
|
* @packageDocumentation
|
|
* @module std
|
|
*/
|
|
//================================================================
|
|
var MathUtil_1 = require("../../internal/numeric/MathUtil");
|
|
var InvalidArgument_1 = require("../../exception/InvalidArgument");
|
|
var gamma_1 = require("./gamma");
|
|
var INFINITY = 100; // (1 / 30!) is nearby 0.
|
|
/*================================================================
|
|
ORIGINAL FUNCTIONS
|
|
- CYLINDRICAL
|
|
- SPHERICAL
|
|
==================================================================
|
|
FIRST KIND
|
|
--------------------------------------------------------------- */
|
|
/**
|
|
* Bessel function of the 1st kind.
|
|
*
|
|
* @reference https://en.wikipedia.org/wiki/Bessel_function#Bessel_functions_of_the_first_kind:_J.CE.B1
|
|
*/
|
|
function cyl_bessel_j(n, x) {
|
|
// VALIDATION
|
|
if (x < 0 && Math.floor(n) !== n)
|
|
throw new InvalidArgument_1.InvalidArgument("Error on std.cyl_bessel_j(): n must be integer when x is negative -> (n = ".concat(n, ", x = ").concat(x, ")."));
|
|
else if (x === 0 && n !== 0)
|
|
throw new InvalidArgument_1.InvalidArgument("Error on std.cyl_bessel_j(): n must be zero when x is zero -> (n = ".concat(n, ", x = ").concat(x, ")."));
|
|
// COMPUTATION
|
|
if (n === Math.floor(n))
|
|
return _J_int(n, x);
|
|
else
|
|
return _J_positive(n, x);
|
|
}
|
|
exports.cyl_bessel_j = cyl_bessel_j;
|
|
/**
|
|
* Bessel function of the 2nd kind.
|
|
*
|
|
* @reference https://en.wikipedia.org/wiki/Bessel_function#Bessel_functions_of_the_second_kind:_Y.CE.B1
|
|
*/
|
|
function cyl_neumann(v, x) {
|
|
if (x <= 0)
|
|
throw new InvalidArgument_1.InvalidArgument("Error on std.cyl_neumann(): x must be greater than zero -> (x = ".concat(x, ")."));
|
|
var numerator = cyl_bessel_j(v, x) * Math.cos(v * Math.PI) - cyl_bessel_j(-v, x);
|
|
var denominator = Math.sin(v * Math.PI);
|
|
return numerator / denominator;
|
|
}
|
|
exports.cyl_neumann = cyl_neumann;
|
|
function _J_int(n, x) {
|
|
if (n < 0)
|
|
return Math.pow(-1, n) * _J_positive(-n, x);
|
|
else
|
|
return _J_positive(n, x);
|
|
}
|
|
function _J_positive(v, x) {
|
|
var sigma = MathUtil_1.MathUtil.sigma(function (k) {
|
|
var ret = Math.pow(-1, k) * Math.pow(x / 2, v + 2 * k);
|
|
ret /= MathUtil_1.MathUtil.factorial(k) * (0, gamma_1.tgamma)(v + k + 1);
|
|
return ret;
|
|
}, 0, INFINITY);
|
|
return sigma;
|
|
}
|
|
/* ---------------------------------------------------------------
|
|
SPHERICAL
|
|
--------------------------------------------------------------- */
|
|
/**
|
|
* Spherical Bessel function of the 1st kind.
|
|
*
|
|
* @reference https://en.wikipedia.org/wiki/Bessel_function#Spherical_Bessel_functions:_jn.2C_yn
|
|
*/
|
|
function sph_bessel(n, x) {
|
|
return Math.sqrt(Math.PI / (2 * x)) * cyl_bessel_j(n + 0.5, x);
|
|
}
|
|
exports.sph_bessel = sph_bessel;
|
|
/**
|
|
* Spherical Bessel function of the 2nd kind.
|
|
*
|
|
* @reference https://en.wikipedia.org/wiki/Bessel_function#Spherical_Bessel_functions:_jn.2C_yn
|
|
*/
|
|
function sph_neumann(n, x) {
|
|
var ret = Math.sqrt(Math.PI / (2 * x));
|
|
ret *= cyl_neumann(n + 0.5, x);
|
|
return ret;
|
|
}
|
|
exports.sph_neumann = sph_neumann;
|
|
/*================================================================
|
|
REQGULAR MODIFIED
|
|
- FIRST KIND
|
|
- SECOND KIND
|
|
==================================================================
|
|
FIRST KIND
|
|
--------------------------------------------------------------- */
|
|
/**
|
|
* Modified cylindrical Bessel function of the 1st kind.
|
|
*
|
|
* @reference https://en.wikipedia.org/wiki/Bessel_function#Modified_Bessel_functions:_I.CE.B1_.2C_K.CE.B1
|
|
*/
|
|
function cyl_bessel_i(n, x) {
|
|
// VALIDATION
|
|
if (x < 0 && Math.floor(n) !== n)
|
|
throw new InvalidArgument_1.InvalidArgument("Error on std.cyl_bessel_i(): n must be integer when x is negative -> (n = ".concat(n, ", x = ").concat(x, ")."));
|
|
else if (x === 0 && n !== 0)
|
|
throw new InvalidArgument_1.InvalidArgument("Error on std.cyl_bessel_i(): n must be zero when x is zero -> (n = ".concat(n, ", x = ").concat(x, ")."));
|
|
// COMPUTATION
|
|
if (n === 0.5)
|
|
return Math.sqrt(2.0 / (Math.PI * x)) * Math.sinh(x);
|
|
else
|
|
return _Bessel_i(n, x);
|
|
}
|
|
exports.cyl_bessel_i = cyl_bessel_i;
|
|
function _Bessel_i(v, x) {
|
|
return MathUtil_1.MathUtil.sigma(function (k) {
|
|
var numerator = Math.pow(x / 2, v + 2 * k);
|
|
var denominator = MathUtil_1.MathUtil.factorial(k) * (0, gamma_1.tgamma)(v + k + 1);
|
|
return numerator / denominator;
|
|
}, 0, INFINITY);
|
|
}
|
|
/* ---------------------------------------------------------------
|
|
SECOND KIND
|
|
--------------------------------------------------------------- */
|
|
/**
|
|
* Modified cylindrical Bessel function of the 2nd kind.
|
|
*
|
|
* @reference https://en.wikipedia.org/wiki/Bessel_function#Modified_Bessel_functions:_I.CE.B1_.2C_K.CE.B1
|
|
*/
|
|
function cyl_bessel_k(n, x) {
|
|
if (x <= 0)
|
|
throw new InvalidArgument_1.InvalidArgument("Error on std.cyl_bessel_k(): requires x > 0 -> (x = ".concat(x, ")."));
|
|
return _Bessel_k(n, x);
|
|
}
|
|
exports.cyl_bessel_k = cyl_bessel_k;
|
|
function _Bessel_k(v, z) {
|
|
var ret = Math.PI / 2;
|
|
ret *= cyl_bessel_i(-v, z) - cyl_bessel_i(v, z);
|
|
ret /= Math.sin(v * Math.PI);
|
|
return ret;
|
|
}
|
|
//# sourceMappingURL=bessels.js.map
|