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 */