File indexing completed on 2024-05-12 15:27:09
0001 /*************************************************************************** 0002 File : nsl_sf_basic.h 0003 Project : LabPlot 0004 Description : NSL special basic functions 0005 -------------------------------------------------------------------- 0006 Copyright : (C) 2017-2019 by Stefan Gerlach (stefan.gerlach@uni.kn) 0007 0008 ***************************************************************************/ 0009 0010 /*************************************************************************** 0011 * * 0012 * This program is free software; you can redistribute it and/or modify * 0013 * it under the terms of the GNU General Public License as published by * 0014 * the Free Software Foundation; either version 2 of the License, or * 0015 * (at your option) any later version. * 0016 * * 0017 * This program is distributed in the hope that it will be useful, * 0018 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 0019 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 0020 * GNU General Public License for more details. * 0021 * * 0022 * You should have received a copy of the GNU General Public License * 0023 * along with this program; if not, write to the Free Software * 0024 * Foundation, Inc., 51 Franklin Street, Fifth Floor, * 0025 * Boston, MA 02110-1301 USA * 0026 * * 0027 ***************************************************************************/ 0028 0029 #ifndef NSL_SF_BASIC_H 0030 #define NSL_SF_BASIC_H 0031 0032 #include <stdint.h> /* fixed size int types */ 0033 #include <gsl/gsl_version.h> 0034 #include "nsl_complex.h" 0035 0036 /* random functions */ 0037 double nsl_sf_rand(void); 0038 double nsl_sf_random(void); 0039 double nsl_sf_drand(void); 0040 0041 /* signum function */ 0042 double nsl_sf_sgn(double x); 0043 /* Heavyside theta function */ 0044 double nsl_sf_theta(double x); 0045 0046 /* log2(x) for integer value x */ 0047 int nsl_sf_log2_int(unsigned int x); 0048 int nsl_sf_log2_int0(unsigned int x); 0049 int nsl_sf_log2_int2(int x); 0050 int nsl_sf_log2_int3(uint64_t x); 0051 int nsl_sf_log2p1_int(int x); 0052 int nsl_sf_log2_longlong(unsigned long long x); 0053 0054 /* more trig. functions */ 0055 double nsl_sf_sec(double x); 0056 double nsl_sf_csc(double x); 0057 double nsl_sf_cot(double x); 0058 double nsl_sf_asec(double x); 0059 double nsl_sf_acsc(double x); 0060 double nsl_sf_acot(double x); 0061 double nsl_sf_sech(double x); 0062 double nsl_sf_csch(double x); 0063 double nsl_sf_coth(double x); 0064 double nsl_sf_asech(double x); 0065 double nsl_sf_acsch(double x); 0066 double nsl_sf_acoth(double x); 0067 0068 /* harmonic numbers (extended to non-integers) */ 0069 double nsl_sf_harmonic(double x); 0070 0071 /* error function and related wrapper */ 0072 double nsl_sf_erfcx(double x); 0073 double nsl_sf_erfi(double x); 0074 double nsl_sf_im_w_of_x(double x); 0075 #if !defined(_MSC_VER) 0076 double nsl_sf_im_w_of_z(COMPLEX z); 0077 #endif 0078 double nsl_sf_dawson(double x); 0079 double nsl_sf_voigt(double x, double sigma, double gamma); 0080 double nsl_sf_pseudovoigt(double x, double eta, double sigma, double gamma); 0081 /* same width pseudo Voigt*/ 0082 double nsl_sf_pseudovoigt1(double x, double eta, double w); 0083 0084 /* wrapper for GSL functions with integer parameters */ 0085 /* mathematical functions */ 0086 double nsl_sf_ldexp(double x, double expo); 0087 double nsl_sf_powint(double x, double n); 0088 /* Airy functions */ 0089 double nsl_sf_airy_Ai(double x); 0090 double nsl_sf_airy_Bi(double x); 0091 double nsl_sf_airy_Ais(double x); 0092 double nsl_sf_airy_Bis(double x); 0093 double nsl_sf_airy_Aid(double x); 0094 double nsl_sf_airy_Bid(double x); 0095 double nsl_sf_airy_Aids(double x); 0096 double nsl_sf_airy_Bids(double x); 0097 double nsl_sf_airy_0_Ai(double s); 0098 double nsl_sf_airy_0_Bi(double s); 0099 double nsl_sf_airy_0_Aid(double s); 0100 double nsl_sf_airy_0_Bid(double s); 0101 /* Bessel functions */ 0102 double nsl_sf_bessel_Jn(double n, double x); 0103 double nsl_sf_bessel_Yn(double n, double x); 0104 double nsl_sf_bessel_In(double n, double x); 0105 double nsl_sf_bessel_Ins(double n, double x); 0106 double nsl_sf_bessel_Kn(double n, double x); 0107 double nsl_sf_bessel_Kns(double n, double x); 0108 double nsl_sf_bessel_jl(double l, double x); 0109 double nsl_sf_bessel_yl(double l, double x); 0110 double nsl_sf_bessel_ils(double l, double x); 0111 double nsl_sf_bessel_kls(double l, double x); 0112 double nsl_sf_bessel_0_J0(double s); 0113 double nsl_sf_bessel_0_J1(double s); 0114 double nsl_sf_bessel_0_Jnu(double nu, double s); 0115 0116 double nsl_sf_hydrogenicR(double n, double l, double z, double r); 0117 /* elliptic integrals */ 0118 double nsl_sf_ellint_Kc(double x); 0119 double nsl_sf_ellint_Ec(double x); 0120 double nsl_sf_ellint_Pc(double x, double n); 0121 double nsl_sf_ellint_F(double phi, double k); 0122 double nsl_sf_ellint_E(double phi, double k); 0123 double nsl_sf_ellint_P(double phi, double k, double n); 0124 double nsl_sf_ellint_D(double phi, double k); 0125 double nsl_sf_ellint_RC(double x, double y); 0126 double nsl_sf_ellint_RD(double x, double y, double z); 0127 double nsl_sf_ellint_RF(double x, double y, double z); 0128 double nsl_sf_ellint_RJ(double x, double y, double z, double p); 0129 0130 double nsl_sf_exprel_n(double n, double x); 0131 double nsl_sf_fermi_dirac_int(double j, double x); 0132 /* Gamma */ 0133 double nsl_sf_fact(double n); 0134 double nsl_sf_doublefact(double n); 0135 double nsl_sf_lnfact(double n); 0136 double nsl_sf_lndoublefact(double n); 0137 double nsl_sf_choose(double n, double m); 0138 double nsl_sf_lnchoose(double n, double m); 0139 double nsl_sf_taylorcoeff(double n, double x); 0140 0141 double nsl_sf_gegenpoly_n(double n, double l, double x); 0142 0143 #if (GSL_MAJOR_VERSION > 2) || (GSL_MAJOR_VERSION == 2) && (GSL_MINOR_VERSION >= 4) 0144 double nsl_sf_hermite_prob(double n, double x); 0145 double nsl_sf_hermite_phys(double n, double x); 0146 double nsl_sf_hermite_func(double n, double x); 0147 double nsl_sf_hermite_prob_der(double m, double n, double x); 0148 double nsl_sf_hermite_phys_der(double m, double n, double x); 0149 double nsl_sf_hermite_func_der(double m, double n, double x); 0150 #endif 0151 0152 double nsl_sf_hyperg_1F1i(double m, double n, double x); 0153 double nsl_sf_hyperg_Ui(double m, double n, double x); 0154 double nsl_sf_laguerre_n(double n, double a, double x); 0155 0156 double nsl_sf_legendre_Pl(double l, double x); 0157 double nsl_sf_legendre_Ql(double l, double x); 0158 double nsl_sf_legendre_Plm(double l, double m, double x); 0159 double nsl_sf_legendre_sphPlm(double l, double m, double x); 0160 double nsl_sf_conicalP_sphreg(double l, double L, double x); 0161 double nsl_sf_conicalP_cylreg(double m, double l, double x); 0162 double nsl_sf_legendre_H3d(double l, double L, double e); 0163 0164 double nsl_sf_psiint(double n); 0165 double nsl_sf_psi1int(double n); 0166 double nsl_sf_psin(double n, double x); 0167 0168 double nsl_sf_zetaint(double n); 0169 double nsl_sf_zetam1int(double n); 0170 double nsl_sf_etaint(double n); 0171 0172 /* random number distributions */ 0173 double nsl_sf_poisson(double k, double m); 0174 double nsl_sf_bernoulli(double k, double p); 0175 double nsl_sf_binomial(double k, double p, double n); 0176 double nsl_sf_negative_binomial(double k, double p, double n); 0177 double nsl_sf_pascal(double k, double p, double n); 0178 double nsl_sf_geometric(double k, double p); 0179 double nsl_sf_hypergeometric(double k, double n1, double n2, double t); 0180 double nsl_sf_logarithmic(double k, double p); 0181 0182 #endif /* NSL_SF_BASIC_H */