File indexing completed on 2024-05-19 03:49:03

0001 /*
0002     File                 : nsl_sf_poly.h
0003     Project              : LabPlot
0004     Description          : NSL special polynomial functions
0005     --------------------------------------------------------------------
0006     SPDX-FileCopyrightText: 2016 Stefan Gerlach <stefan.gerlach@uni.kn>
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #ifndef NSL_SF_POLY_H
0011 #define NSL_SF_POLY_H
0012 
0013 #include <gsl/gsl_complex.h>
0014 #include <gsl/gsl_complex_math.h>
0015 #include <stdlib.h>
0016 
0017 /* Chebychev T_n(x) */
0018 double nsl_sf_poly_chebyshev_T(int n, double x);
0019 /* Chebychev U_n(x) */
0020 double nsl_sf_poly_chebyshev_U(int n, double x);
0021 
0022 /* Optimal "L"egendre Polynomials */
0023 double nsl_sf_poly_optimal_legendre_L(int n, double x);
0024 
0025 /* Bessel polynomials y_n(x) */
0026 gsl_complex nsl_sf_poly_bessel_y(int n, gsl_complex x);
0027 /* reversed Bessel polynomials \theta_n(x) */
0028 gsl_complex nsl_sf_poly_reversed_bessel_theta(int n, gsl_complex x);
0029 
0030 /* interpolating polynomial (Lagrange)
0031     0 - zeroth order (1-point) integral (rectangle rule)
0032     1 - first order (2-point), derivative, integral and absolute area (trapezoid rule)
0033     2 - second order (3-point), derivatives and integral (Simpson's 1/3 rule)
0034     3 - third order (4-point), derivatives and integral (Simpson's 3/8 rule)
0035     4 - fourth order (5-point) and derivatives
0036     6 - sixth order (7-point) and derivatives
0037     TODO: barycentric form (https://en.wikipedia.org/wiki/Lagrange_polynomial)
0038 */
0039 double nsl_sf_poly_interp_lagrange_0_int(const double* x, double y);
0040 double nsl_sf_poly_interp_lagrange_1(double v, const double* x, const double* y);
0041 double nsl_sf_poly_interp_lagrange_1_deriv(const double* x, const double* y);
0042 double nsl_sf_poly_interp_lagrange_1_int(const double* x, const double* y);
0043 double nsl_sf_poly_interp_lagrange_1_absint(const double* x, const double* y);
0044 double nsl_sf_poly_interp_lagrange_2(double v, const double* x, const double* y);
0045 double nsl_sf_poly_interp_lagrange_2_deriv(double v, const double* x, const double* y);
0046 double nsl_sf_poly_interp_lagrange_2_deriv2(const double* x, const double* y);
0047 double nsl_sf_poly_interp_lagrange_2_int(const double* x, const double* y);
0048 double nsl_sf_poly_interp_lagrange_3(double v, const double* x, const double* y);
0049 double nsl_sf_poly_interp_lagrange_3_deriv(double v, const double* x, const double* y);
0050 double nsl_sf_poly_interp_lagrange_3_deriv2(double v, const double* x, const double* y);
0051 double nsl_sf_poly_interp_lagrange_3_deriv3(const double* x, const double* y);
0052 double nsl_sf_poly_interp_lagrange_3_int(const double* x, const double* y);
0053 double nsl_sf_poly_interp_lagrange_4(double v, const double* x, const double* y);
0054 double nsl_sf_poly_interp_lagrange_4_deriv(double v, const double* x, const double* y);
0055 double nsl_sf_poly_interp_lagrange_4_deriv2(double v, const double* x, const double* y);
0056 double nsl_sf_poly_interp_lagrange_4_deriv3(double v, const double* x, const double* y);
0057 double nsl_sf_poly_interp_lagrange_4_deriv4(const double* x, const double* y);
0058 double nsl_sf_poly_interp_lagrange_6_deriv4(double v, const double* x, const double* y);
0059 double nsl_sf_poly_interp_lagrange_6_deriv5(double v, const double* x, const double* y);
0060 double nsl_sf_poly_interp_lagrange_6_deriv6(const double* x, const double* y);
0061 
0062 #endif /* NSL_SF_POLY_H */