File indexing completed on 2024-05-12 03:47:53
0001 /* 0002 File : nsl_sf_basic.h 0003 Project : LabPlot 0004 Description : NSL special basic functions 0005 -------------------------------------------------------------------- 0006 SPDX-FileCopyrightText: 2017-2022 Stefan Gerlach <stefan.gerlach@uni.kn> 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 0010 #ifndef NSL_SF_BASIC_H 0011 #define NSL_SF_BASIC_H 0012 0013 #include "nsl_complex.h" 0014 #include <gsl/gsl_version.h> 0015 0016 #undef __BEGIN_DECLS 0017 #undef __END_DECLS 0018 #ifdef __cplusplus 0019 #define __BEGIN_DECLS extern "C" { 0020 #define __END_DECLS } 0021 #else 0022 #define __BEGIN_DECLS /* empty */ 0023 #define __END_DECLS /* empty */ 0024 #endif 0025 __BEGIN_DECLS 0026 0027 #include <stdint.h> /* fixed size int types */ 0028 0029 /* dummy function for parsing statistical methods */ 0030 double nsl_sf_dummy(double x); 0031 double nsl_sf_dummy2(double p, double x); 0032 0033 /* random functions */ 0034 double nsl_sf_rand(void); 0035 double nsl_sf_random(void); 0036 double nsl_sf_drand(void); 0037 0038 /* signum function */ 0039 double nsl_sf_sgn(double x); 0040 /* Heavyside theta function */ 0041 double nsl_sf_theta(double x); 0042 0043 /* non-standard function */ 0044 double nsl_sf_exp10(double x); 0045 0046 /* non-uniform random number generation */ 0047 double nsl_sf_ran_gaussian(double sigma); 0048 double nsl_sf_ran_exponential(double mu); 0049 double nsl_sf_ran_laplace(double a); 0050 double nsl_sf_ran_cauchy(double a); 0051 double nsl_sf_ran_rayleigh(double sigma); 0052 double nsl_sf_ran_landau(void); 0053 double nsl_sf_ran_levy(double c, double alpha); 0054 double nsl_sf_ran_gamma(double a, double b); 0055 double nsl_sf_ran_flat(double a, double b); 0056 double nsl_sf_ran_lognormal(double zeta, double sigma); 0057 double nsl_sf_ran_chisq(double nu); 0058 double nsl_sf_ran_tdist(double nu); 0059 double nsl_sf_ran_logistic(double a); 0060 0061 double nsl_sf_ran_poisson(double mu); 0062 double nsl_sf_ran_bernoulli(double p); 0063 double nsl_sf_ran_binomial(double p, double n); 0064 0065 /* log2(x) for integer value x */ 0066 int nsl_sf_log2_int(unsigned int x); 0067 int nsl_sf_log2_int0(unsigned int x); 0068 int nsl_sf_log2_int2(int x); 0069 int nsl_sf_log2_int3(uint64_t x); 0070 int nsl_sf_log2p1_int(int x); 0071 int nsl_sf_log2_longlong(unsigned long long x); 0072 0073 /* more trig. functions */ 0074 double nsl_sf_sec(double x); 0075 double nsl_sf_csc(double x); 0076 double nsl_sf_cot(double x); 0077 double nsl_sf_asec(double x); 0078 double nsl_sf_acsc(double x); 0079 double nsl_sf_acot(double x); 0080 double nsl_sf_sech(double x); 0081 double nsl_sf_csch(double x); 0082 double nsl_sf_coth(double x); 0083 double nsl_sf_asech(double x); 0084 double nsl_sf_acsch(double x); 0085 double nsl_sf_acoth(double x); 0086 0087 /* harmonic numbers (extended to non-integers) */ 0088 double nsl_sf_harmonic(double x); 0089 0090 /* error function and related wrapper */ 0091 double nsl_sf_erfcx(double x); 0092 double nsl_sf_erfi(double x); 0093 double nsl_sf_im_w_of_x(double x); 0094 #if !defined(_MSC_VER) 0095 double nsl_sf_im_w_of_z(COMPLEX z); 0096 #endif 0097 double nsl_sf_dawson(double x); 0098 double nsl_sf_voigt(double x, double sigma, double gamma); 0099 double nsl_sf_pseudovoigt(double x, double eta, double sigma, double gamma); 0100 /* same width pseudo Voigt*/ 0101 double nsl_sf_pseudovoigt1(double x, double eta, double w); 0102 0103 /* wrapper for GSL functions with integer parameters */ 0104 /* mathematical functions */ 0105 double nsl_sf_ldexp(double x, double expo); 0106 double nsl_sf_powint(double x, double n); 0107 /* Airy functions */ 0108 double nsl_sf_airy_Ai(double x); 0109 double nsl_sf_airy_Bi(double x); 0110 double nsl_sf_airy_Ais(double x); 0111 double nsl_sf_airy_Bis(double x); 0112 double nsl_sf_airy_Aid(double x); 0113 double nsl_sf_airy_Bid(double x); 0114 double nsl_sf_airy_Aids(double x); 0115 double nsl_sf_airy_Bids(double x); 0116 double nsl_sf_airy_0_Ai(double s); 0117 double nsl_sf_airy_0_Bi(double s); 0118 double nsl_sf_airy_0_Aid(double s); 0119 double nsl_sf_airy_0_Bid(double s); 0120 /* Bessel functions */ 0121 double nsl_sf_bessel_Jn(double n, double x); 0122 double nsl_sf_bessel_Yn(double n, double x); 0123 double nsl_sf_bessel_In(double n, double x); 0124 double nsl_sf_bessel_Ins(double n, double x); 0125 double nsl_sf_bessel_Kn(double n, double x); 0126 double nsl_sf_bessel_Kns(double n, double x); 0127 double nsl_sf_bessel_jl(double l, double x); 0128 double nsl_sf_bessel_yl(double l, double x); 0129 double nsl_sf_bessel_ils(double l, double x); 0130 double nsl_sf_bessel_kls(double l, double x); 0131 double nsl_sf_bessel_0_J0(double s); 0132 double nsl_sf_bessel_0_J1(double s); 0133 double nsl_sf_bessel_0_Jnu(double nu, double s); 0134 0135 double nsl_sf_hydrogenicR(double n, double l, double z, double r); 0136 /* elliptic integrals */ 0137 double nsl_sf_ellint_Kc(double x); 0138 double nsl_sf_ellint_Ec(double x); 0139 double nsl_sf_ellint_Pc(double x, double n); 0140 double nsl_sf_ellint_F(double phi, double k); 0141 double nsl_sf_ellint_E(double phi, double k); 0142 double nsl_sf_ellint_P(double phi, double k, double n); 0143 double nsl_sf_ellint_D(double phi, double k); 0144 double nsl_sf_ellint_RC(double x, double y); 0145 double nsl_sf_ellint_RD(double x, double y, double z); 0146 double nsl_sf_ellint_RF(double x, double y, double z); 0147 double nsl_sf_ellint_RJ(double x, double y, double z, double p); 0148 0149 double nsl_sf_exprel_n(double n, double x); 0150 double nsl_sf_fermi_dirac_int(double j, double x); 0151 /* Gamma */ 0152 double nsl_sf_fact(double n); 0153 double nsl_sf_doublefact(double n); 0154 double nsl_sf_lnfact(double n); 0155 double nsl_sf_lndoublefact(double n); 0156 double nsl_sf_choose(double n, double m); 0157 double nsl_sf_lnchoose(double n, double m); 0158 double nsl_sf_taylorcoeff(double n, double x); 0159 0160 double nsl_sf_gegenpoly_n(double n, double l, double x); 0161 0162 #if (GSL_MAJOR_VERSION > 2) || (GSL_MAJOR_VERSION == 2) && (GSL_MINOR_VERSION >= 4) 0163 double nsl_sf_hermite_prob(double n, double x); 0164 double nsl_sf_hermite_func(double n, double x); 0165 double nsl_sf_hermite_func_der(double m, double n, double x); 0166 double nsl_sf_hermite(double n, double x); 0167 double nsl_sf_hermite_deriv(double m, double n, double x); 0168 double nsl_sf_hermite_prob_deriv(double m, double n, double x); 0169 #if (GSL_MAJOR_VERSION > 2) || (GSL_MAJOR_VERSION == 2) && (GSL_MINOR_VERSION >= 6) 0170 double nsl_sf_hermite_func_fast(double n, double x); 0171 #endif 0172 #endif 0173 0174 double nsl_sf_hyperg_1F1i(double m, double n, double x); 0175 double nsl_sf_hyperg_Ui(double m, double n, double x); 0176 double nsl_sf_laguerre_n(double n, double a, double x); 0177 0178 double nsl_sf_legendre_Pl(double l, double x); 0179 double nsl_sf_legendre_Ql(double l, double x); 0180 double nsl_sf_legendre_Plm(double l, double m, double x); 0181 double nsl_sf_legendre_sphPlm(double l, double m, double x); 0182 double nsl_sf_conicalP_sphreg(double l, double L, double x); 0183 double nsl_sf_conicalP_cylreg(double m, double l, double x); 0184 double nsl_sf_legendre_H3d(double l, double L, double e); 0185 0186 #if (GSL_MAJOR_VERSION >= 2) 0187 double nsl_sf_mathieu_a(double n, double q); 0188 double nsl_sf_mathieu_b(double n, double q); 0189 double nsl_sf_mathieu_ce(double n, double q, double x); 0190 double nsl_sf_mathieu_se(double n, double q, double x); 0191 double nsl_sf_mathieu_Mc(double j, double n, double q, double x); 0192 double nsl_sf_mathieu_Ms(double j, double n, double q, double x); 0193 #endif 0194 0195 double nsl_sf_psiint(double n); 0196 double nsl_sf_psi1int(double n); 0197 double nsl_sf_psin(double n, double x); 0198 0199 double nsl_sf_zetaint(double n); 0200 double nsl_sf_zetam1int(double n); 0201 double nsl_sf_etaint(double n); 0202 0203 /* random number distributions */ 0204 double nsl_sf_poisson(double k, double m); 0205 double nsl_sf_bernoulli(double k, double p); 0206 double nsl_sf_binomial(double k, double p, double n); 0207 double nsl_sf_negative_binomial(double k, double p, double n); 0208 double nsl_sf_pascal(double k, double p, double n); 0209 double nsl_sf_geometric(double k, double p); 0210 double nsl_sf_hypergeometric(double k, double n1, double n2, double t); 0211 double nsl_sf_logarithmic(double k, double p); 0212 0213 __END_DECLS 0214 0215 #endif /* NSL_SF_BASIC_H */