File indexing completed on 2024-05-12 03:47:51

0001 /*
0002     File                 : nsl_fit.h
0003     Project              : LabPlot
0004     Description          : NSL (non)linear fitting 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_FIT_H
0011 #define NSL_FIT_H
0012 
0013 #define NSL_FIT_MODEL_CATEGORY_COUNT 5
0014 typedef enum { nsl_fit_model_basic, nsl_fit_model_peak, nsl_fit_model_growth, nsl_fit_model_distribution, nsl_fit_model_custom = 99 } nsl_fit_model_category;
0015 
0016 #define NSL_FIT_MODEL_BASIC_COUNT 5
0017 typedef enum {
0018     nsl_fit_model_polynomial,
0019     nsl_fit_model_power,
0020     nsl_fit_model_exponential,
0021     nsl_fit_model_inverse_exponential,
0022     nsl_fit_model_fourier
0023 } nsl_fit_model_type_basic;
0024 extern const char* nsl_fit_model_basic_pic_name[];
0025 #define NSL_FIT_MODEL_PEAK_COUNT 6
0026 typedef enum {
0027     nsl_fit_model_gaussian,
0028     nsl_fit_model_lorentz,
0029     nsl_fit_model_sech,
0030     nsl_fit_model_logistic,
0031     nsl_fit_model_voigt,
0032     nsl_fit_model_pseudovoigt1
0033 } nsl_fit_model_type_peak;
0034 extern const char* nsl_fit_model_peak_pic_name[];
0035 #define NSL_FIT_MODEL_GROWTH_COUNT 8
0036 typedef enum {
0037     nsl_fit_model_atan,
0038     nsl_fit_model_tanh,
0039     nsl_fit_model_algebraic_sigmoid,
0040     nsl_fit_model_sigmoid,
0041     nsl_fit_model_erf,
0042     nsl_fit_model_hill,
0043     nsl_fit_model_gompertz,
0044     nsl_fit_model_gudermann
0045 } nsl_fit_model_type_growth;
0046 extern const char* nsl_fit_model_growth_pic_name[];
0047 
0048 extern const char* nsl_fit_model_category_name[];
0049 extern const char* nsl_fit_model_basic_name[];
0050 extern const char* nsl_fit_model_peak_name[];
0051 extern const char* nsl_fit_model_growth_name[];
0052 extern const char* nsl_fit_model_basic_equation[];
0053 extern const char* nsl_fit_model_peak_equation[];
0054 extern const char* nsl_fit_model_growth_equation[];
0055 
0056 #define NSL_FIT_WEIGHT_TYPE_COUNT 8
0057 typedef enum {
0058     nsl_fit_weight_no, /* w = 1 */
0059     nsl_fit_weight_instrumental, /* w = 1/c^2    (Gaussian, Given errors): default */
0060     nsl_fit_weight_direct, /* w = c */
0061     nsl_fit_weight_inverse, /* w = 1/c */
0062     nsl_fit_weight_statistical, /* w = 1/y      (Poisson) */
0063     nsl_fit_weight_statistical_fit, /* w = 1/Y      (Poisson) */
0064     nsl_fit_weight_relative, /* w = 1/y^2    (Variance) */
0065     nsl_fit_weight_relative_fit, /* w = 1/Y^2    (Variance) */
0066 } nsl_fit_weight_type;
0067 extern const char* nsl_fit_weight_type_name[];
0068 
0069 #define NSL_FIT_ALGORITHM_COUNT 2
0070 typedef enum {
0071     nsl_fit_algorithm_lm, /* Levenberg-Marquardt */
0072     nsl_fit_algorithm_ml, /* Maximum Likelihood */
0073 } nsl_fit_algorithm;
0074 extern const char* nsl_fit_algorithm_name[];
0075 
0076 /* convert unbounded variable x to bounded variable where bounds are [min, max] */
0077 double nsl_fit_map_bound(double x, double min, double max);
0078 /* convert bounded variable x to unbounded variable where bounds are [min, max] */
0079 double nsl_fit_map_unbound(double x, double min, double max);
0080 
0081 /* model parameter derivatives */
0082 /* basic */
0083 double nsl_fit_model_polynomial_param_deriv(double x, int j, double weight);
0084 double nsl_fit_model_power1_param_deriv(unsigned int param, double x, double a, double b, double weight);
0085 double nsl_fit_model_power2_param_deriv(unsigned int param, double x, double b, double c, double weight);
0086 double nsl_fit_model_exponentialn_param_deriv(unsigned int param, double x, const double* p, double weight);
0087 double nsl_fit_model_inverse_exponential_param_deriv(unsigned int param, double x, double a, double b, double weight);
0088 double nsl_fit_model_fourier_param_deriv(unsigned int param, unsigned int degree, double x, double w, double weight);
0089 /* peak */
0090 double nsl_fit_model_gaussian_param_deriv(unsigned int param, double x, double a, double s, double mu, double weight);
0091 double nsl_fit_model_lorentz_param_deriv(unsigned int param, double x, double a, double s, double t, double weight);
0092 double nsl_fit_model_sech_param_deriv(unsigned int param, double x, double a, double s, double mu, double weight);
0093 double nsl_fit_model_logistic_param_deriv(unsigned int param, double x, double a, double s, double mu, double weight);
0094 double nsl_fit_model_voigt_param_deriv(unsigned int param, double x, double a, double mu, double s, double g, double weight);
0095 double nsl_fit_model_pseudovoigt1_param_deriv(unsigned int param, double x, double a, double eta, double w, double mu, double weight);
0096 /* growth */
0097 double nsl_fit_model_atan_param_deriv(unsigned int param, double x, double a, double mu, double s, double weight);
0098 double nsl_fit_model_tanh_param_deriv(unsigned int param, double x, double a, double mu, double s, double weight);
0099 double nsl_fit_model_algebraic_sigmoid_param_deriv(unsigned int param, double x, double a, double mu, double s, double weight);
0100 double nsl_fit_model_sigmoid_param_deriv(unsigned int param, double x, double a, double mu, double k, double weight);
0101 double nsl_fit_model_erf_param_deriv(unsigned int param, double x, double a, double mu, double s, double weight);
0102 double nsl_fit_model_hill_param_deriv(unsigned int param, double x, double a, double n, double s, double weight);
0103 double nsl_fit_model_gompertz_param_deriv(unsigned int param, double x, double a, double b, double c, double weight);
0104 double nsl_fit_model_gudermann_param_deriv(unsigned int param, double x, double a, double mu, double s, double weight);
0105 /* distributions */
0106 double nsl_fit_model_gaussian_tail_param_deriv(unsigned int param, double x, double A, double s, double a, double mu, double weight);
0107 double nsl_fit_model_exponential_param_deriv(unsigned int param, double x, double a, double l, double mu, double weight);
0108 double nsl_fit_model_laplace_param_deriv(unsigned int param, double x, double a, double s, double mu, double weight);
0109 double nsl_fit_model_exp_pow_param_deriv(unsigned int param, double x, double a, double s, double b, double mu, double weight);
0110 double nsl_fit_model_poisson_param_deriv(unsigned int param, double x, double a, double l, double weight);
0111 double nsl_fit_model_lognormal_param_deriv(unsigned int param, double x, double a, double b, double mu, double weight);
0112 double nsl_fit_model_gamma_param_deriv(unsigned int param, double x, double a, double k, double t, double weight);
0113 double nsl_fit_model_flat_param_deriv(unsigned int param, double x, double A, double b, double a, double weight);
0114 double nsl_fit_model_rayleigh_param_deriv(unsigned int param, double x, double a, double s, double weight);
0115 double nsl_fit_model_rayleigh_tail_param_deriv(unsigned int param, double x, double a, double s, double mu, double weight);
0116 double nsl_fit_model_landau_param_deriv(unsigned int param, double x, double weight);
0117 double nsl_fit_model_chi_square_param_deriv(unsigned int param, double x, double a, double n, double weight);
0118 double nsl_fit_model_students_t_param_deriv(unsigned int param, double x, double a, double n, double weight);
0119 double nsl_fit_model_fdist_param_deriv(unsigned int param, double x, double a, double n1, double n2, double weight);
0120 double nsl_fit_model_beta_param_deriv(unsigned int param, double x, double A, double a, double b, double weight);
0121 double nsl_fit_model_pareto_param_deriv(unsigned int param, double x, double A, double a, double b, double weight);
0122 double nsl_fit_model_weibull_param_deriv(unsigned int param, double x, double a, double k, double l, double mu, double weight);
0123 double nsl_fit_model_gumbel1_param_deriv(unsigned int param, double x, double a, double s, double mu, double b, double weight);
0124 double nsl_fit_model_gumbel2_param_deriv(unsigned int param, double x, double A, double a, double b, double mu, double weight);
0125 double nsl_fit_model_binomial_param_deriv(unsigned int param, double x, double A, double p, double n, double weight);
0126 double nsl_fit_model_negative_binomial_param_deriv(unsigned int param, double k, double A, double p, double n, double weight);
0127 double nsl_fit_model_pascal_param_deriv(unsigned int param, double k, double A, double p, double n, double weight);
0128 double nsl_fit_model_geometric_param_deriv(unsigned int param, double k, double A, double p, double weight);
0129 double nsl_fit_model_hypergeometric_param_deriv(unsigned int param, double k, double A, double n1, double n2, double t, double weight);
0130 double nsl_fit_model_logarithmic_param_deriv(unsigned int param, double k, double A, double p, double weight);
0131 
0132 double nsl_fit_model_maxwell_param_deriv(unsigned int param, double x, double a, double s, double weight);
0133 double nsl_fit_model_sech_dist_param_deriv(unsigned int param, double x, double a, double s, double mu, double weight);
0134 double nsl_fit_model_levy_param_deriv(unsigned int param, double x, double a, double g, double mu, double weight);
0135 double nsl_fit_model_frechet_param_deriv(unsigned int param, double x, double A, double g, double s, double mu, double weight);
0136 
0137 #endif /* NSL_FIT_H */