File indexing completed on 2024-05-12 03:47:53
0001 /* 0002 File : nsl_sf_kernel.c 0003 Project : LabPlot 0004 Description : NSL special kernel functions 0005 -------------------------------------------------------------------- 0006 SPDX-FileCopyrightText: 2016 Stefan Gerlach <stefan.gerlach@uni.kn> 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 0010 #include "nsl_sf_kernel.h" 0011 #include <gsl/gsl_math.h> 0012 #include <gsl/gsl_randist.h> /* Gaussian and Cauchy */ 0013 #include <math.h> 0014 #include <stdlib.h> 0015 0016 /* kernel on [-1,1] */ 0017 0018 double nsl_sf_kernel_uniform(double u) { 0019 if (fabs(u) <= 1.0) 0020 return 0.5; 0021 return 0.0; 0022 } 0023 0024 double nsl_sf_kernel_triangular(double u) { 0025 if (fabs(u) <= 1.0) 0026 return 1.0 - fabs(u); 0027 return 0.0; 0028 } 0029 0030 double nsl_sf_kernel_parabolic(double u) { 0031 if (fabs(u) <= 1.0) 0032 return 3. / 4. * (1.0 - gsl_pow_2(u)); 0033 return 0.0; 0034 } 0035 0036 double nsl_sf_kernel_quartic(double u) { 0037 if (fabs(u) <= 1.0) 0038 return 15. / 16. * gsl_pow_2(1.0 - gsl_pow_2(u)); 0039 return 0.0; 0040 } 0041 0042 double nsl_sf_kernel_triweight(double u) { 0043 if (fabs(u) <= 1.0) 0044 return 35. / 32. * gsl_pow_3(1.0 - gsl_pow_2(u)); 0045 return 0.0; 0046 } 0047 0048 double nsl_sf_kernel_tricube(double u) { 0049 if (fabs(u) <= 1.0) 0050 return 70. / 81. * gsl_pow_3(1.0 - gsl_pow_3(fabs(u))); 0051 return 0.0; 0052 } 0053 0054 double nsl_sf_kernel_cosine(double u) { 0055 if (fabs(u) <= 1.0) 0056 return M_PI_4 * cos(M_PI_2 * u); 0057 return 0.0; 0058 } 0059 0060 double nsl_sf_kernel_semicircle(double u) { 0061 if (fabs(u) < 1.0) 0062 return M_2_PI * sqrt(1 - gsl_pow_2(u)); 0063 return 0.0; 0064 } 0065 0066 /* kernel on (-inf,inf) */ 0067 double nsl_sf_kernel_gaussian(double u) { 0068 return gsl_ran_gaussian_pdf(u, 1.0); 0069 } 0070 0071 double nsl_sf_kernel_cauchy(double u) { 0072 return gsl_ran_cauchy_pdf(u, 1.0); 0073 } 0074 0075 double nsl_sf_kernel_logistic(double u) { 0076 return gsl_ran_logistic_pdf(u, 1.0); 0077 } 0078 0079 double nsl_sf_kernel_picard(double u) { 0080 return 0.5 * exp(-fabs(u)); 0081 } 0082 0083 double nsl_sf_kernel_sigmoid(double u) { 0084 return M_1_PI / cosh(u); 0085 } 0086 0087 double nsl_sf_kernel_silverman(double u) { 0088 return 1.0 / 2.0 * exp(-fabs(u) / M_SQRT2) * sin(fabs(u) / M_SQRT2 + M_PI_4); 0089 }