[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [labplot] src: 1. finished distribution fit models with F distribution
From:       Stefan Gerlach <null () kde ! org>
Date:       2017-05-31 22:23:12
Message-ID: E1dGC1I-0001i8-CF () code ! kde ! org
[Download RAW message or body]

Git commit db6b7da941de2069914d1f76e2a9b5e177a30975 by Stefan Gerlach.
Committed on 31/05/2017 at 22:22.
Pushed by sgerlach into branch 'master'.

1. finished distribution fit models with F distribution
2. clean up code

M  +2    -2    src/backend/gsl/functions.h
M  +89   -76   src/backend/nsl/nsl_fit.c
M  +1    -0    src/backend/nsl/nsl_fit.h
M  +2    -2    src/backend/nsl/nsl_sf_stats.c
M  +17   -2    src/backend/worksheet/plots/cartesian/XYFitCurve.cpp
M  +10   -10   src/kdefrontend/dockwidgets/XYFitCurveDock.cpp
D  +-    --    src/pics/gsl_distributions/F.jpg
A  +-    --    src/pics/gsl_distributions/fdist.jpg

https://commits.kde.org/labplot/db6b7da941de2069914d1f76e2a9b5e177a30975

diff --git a/src/backend/gsl/functions.h b/src/backend/gsl/functions.h
index da2f9b6c..4caeae1c 100644
--- a/src/backend/gsl/functions.h
+++ b/src/backend/gsl/functions.h
@@ -44,8 +44,8 @@ double my_random() { return random(); }
 double my_drand() { return random()/(double)RAND_MAX; }
 /* math.h */
 #ifndef _WIN32
-double my_jn(double n, double x) { return jn((int)n, x); }
-double my_yn(double n,double x) { return yn((int)n, x); }
+double my_jn(double n, double x) { return jn(round(n), x); }
+double my_yn(double n,double x) { return yn(round(n), x); }
 double my_sgn(double x) { return copysign(1.0, x); }
 #else
 double my_sgn(double x) {
diff --git a/src/backend/nsl/nsl_fit.c b/src/backend/nsl/nsl_fit.c
index 2888f6fc..f5049093 100644
--- a/src/backend/nsl/nsl_fit.c
+++ b/src/backend/nsl/nsl_fit.c
@@ -183,49 +183,49 @@ double nsl_fit_model_fourier_param_deriv(int param, int degree, \
double x, double  }
 
 /* peak */
-double nsl_fit_model_gaussian_param_deriv(int param, double x, double s, double mu, \
double a, double weight) { +double nsl_fit_model_gaussian_param_deriv(int param, \
double x, double s, double mu, double A, double weight) {  double s2 = s*s, norm = \
weight/sqrt(2.*M_PI)/s, efactor = exp(-(x-mu)*(x-mu)/(2.*s2));  
 	if (param == 0)
-		return a * norm/(s*s2) * ((x-mu)*(x-mu) - s2) * efactor;
+		return A * norm/(s*s2) * ((x-mu)*(x-mu) - s2) * efactor;
 	if (param == 1)
-		return a * norm/s2 * (x-mu) * efactor;
+		return A * norm/s2 * (x-mu) * efactor;
 	if (param == 2)
 		return norm * efactor;
 
 	return 0;
 }
-double nsl_fit_model_lorentz_param_deriv(int param, double x, double s, double t, \
double a, double weight) { +double nsl_fit_model_lorentz_param_deriv(int param, \
double x, double s, double t, double A, double weight) {  double norm = weight/M_PI, \
denom = s*s+(x-t)*(x-t);  
 	if (param == 0)
-		return a * norm * ((x-t)*(x-t) - s*s)/(denom*denom);
+		return A * norm * ((x-t)*(x-t) - s*s)/(denom*denom);
 	if (param == 1)
-		return a * norm * 2.*s*(x-t)/(denom*denom);
+		return A * norm * 2.*s*(x-t)/(denom*denom);
 	if (param == 2)
 		return norm * s/denom;
 
 	return 0;
 }
-double nsl_fit_model_sech_param_deriv(int param, double x, double s, double mu, \
double a, double weight) { +double nsl_fit_model_sech_param_deriv(int param, double \
x, double s, double mu, double A, double weight) {  double y = (x-mu)/s, norm = \
weight/M_PI/s;  
 	if (param == 0)
-		return a/s * norm * (y*tanh(y)-1.)/cosh(y);
+		return A/s * norm * (y*tanh(y)-1.)/cosh(y);
 	if (param == 1)
-		return a/s * norm * tanh(y)/cosh(y);
+		return A/s * norm * tanh(y)/cosh(y);
 	if (param == 2)
 		return norm/cosh(y);
 
 	return 0;
 }
-double nsl_fit_model_logistic_param_deriv(int param, double x, double s, double mu, \
double a, double weight) { +double nsl_fit_model_logistic_param_deriv(int param, \
double x, double s, double mu, double A, double weight) {  double y = (x-mu)/2./s, \
norm = weight/4./s;  
 	if (param == 0)
-		return a/s * norm * (2.*y*tanh(y)-1.)/cosh(y);
+		return A/s * norm * (2.*y*tanh(y)-1.)/cosh(y);
 	if (param == 1)
-		return a/s * norm * tanh(y)/cosh(y)/cosh(y);
+		return A/s * norm * tanh(y)/cosh(y)/cosh(y);
 	if (param == 2)
 		return norm/cosh(y)/cosh(y);
 
@@ -233,67 +233,67 @@ double nsl_fit_model_logistic_param_deriv(int param, double x, \
double s, double  }
 
 /* growth */
-double nsl_fit_model_atan_param_deriv(int param, double x, double s, double mu, \
double a, double weight) { +double nsl_fit_model_atan_param_deriv(int param, double \
x, double s, double mu, double A, double weight) {  double norm = weight, y = \
(x-mu)/s;  if (param == 0)
-		return -a/s * norm * y/(1.+y*y);
+		return -A/s * norm * y/(1.+y*y);
 	if (param == 1)
-		return -a/s * norm * 1./(1+y*y);
+		return -A/s * norm * 1./(1+y*y);
 	if (param == 2)
 		return norm * atan(y);
 
 	return 0;
 }
-double nsl_fit_model_tanh_param_deriv(int param, double x, double s, double mu, \
double a, double weight) { +double nsl_fit_model_tanh_param_deriv(int param, double \
x, double s, double mu, double A, double weight) {  double norm = weight, y = \
(x-mu)/s;  if (param == 0)
-		return -a/s * norm * y/cosh(y)/cosh(y);
+		return -A/s * norm * y/cosh(y)/cosh(y);
 	if (param == 1)
-		return -a/s * norm * 1./cosh(y)/cosh(y);
+		return -A/s * norm * 1./cosh(y)/cosh(y);
 	if (param == 2)
 		return norm * tanh(y);
 
 	return 0;
 }
-double nsl_fit_model_algebraic_sigmoid_param_deriv(int param, double x, double s, \
double mu, double a, double weight) { +double \
nsl_fit_model_algebraic_sigmoid_param_deriv(int param, double x, double s, double mu, \
double A, double weight) {  double norm = weight, y = (x-mu)/s, y2 = y*y;
 	if (param == 0)
-		return -a/s * norm * y/pow(1.+y2, 1.5);
+		return -A/s * norm * y/pow(1.+y2, 1.5);
 	if (param == 1)
-		return -a/s * norm * 1./pow(1.+y2, 1.5);
+		return -A/s * norm * 1./pow(1.+y2, 1.5);
 	if (param == 2)
 		return norm * y/sqrt(1.+y2);
 
 	return 0;
 }
-double nsl_fit_model_sigmoid_param_deriv(int param, double x, double k, double mu, \
double a, double weight) { +double nsl_fit_model_sigmoid_param_deriv(int param, \
double x, double k, double mu, double A, double weight) {  double norm = weight, y = \
k*(x-mu);  if (param == 0)
-		return a/k * norm * y*exp(-y)/gsl_pow_2(1. + exp(-y));
+		return A/k * norm * y*exp(-y)/gsl_pow_2(1. + exp(-y));
 	if (param == 1)
-		return -a*k * norm * exp(-y)/gsl_pow_2(1. + exp(-y));
+		return -A*k * norm * exp(-y)/gsl_pow_2(1. + exp(-y));
 	if (param == 2)
 		return norm/(1. + exp(-y));
 
 	return 0;
 }
-double nsl_fit_model_erf_param_deriv(int param, double x, double s, double mu, \
double a, double weight) { +double nsl_fit_model_erf_param_deriv(int param, double x, \
double s, double mu, double A, double weight) {  double norm = weight, y = \
(x-mu)/(sqrt(2.)*s);  if (param == 0)
-		return -a/sqrt(M_PI)/s * norm * y*exp(-y*y);
+		return -A/sqrt(M_PI)/s * norm * y*exp(-y*y);
 	if (param == 1)
-		return -a/sqrt(2.*M_PI)/s * norm * exp(-y*y);
+		return -A/sqrt(2.*M_PI)/s * norm * exp(-y*y);
 	if (param == 2)
 		return norm/2. * gsl_sf_erf(y);
 
 	return 0;
 }
-double nsl_fit_model_hill_param_deriv(int param, double x, double s, double n, \
double a, double weight) { +double nsl_fit_model_hill_param_deriv(int param, double \
x, double s, double n, double A, double weight) {  double norm = weight, y = x/s;
 	if (param == 0)
-		return -a*n/s * norm * pow(y, n)/gsl_pow_2(1.+pow(y, n));
+		return -A*n/s * norm * pow(y, n)/gsl_pow_2(1.+pow(y, n));
 	if (param == 1)
-		return a * norm * log(y)*pow(y, n)/gsl_pow_2(1.+pow(y, n));
+		return A * norm * log(y)*pow(y, n)/gsl_pow_2(1.+pow(y, n));
 	if (param == 2)
 		return norm * pow(y, n)/(1.+pow(y, n));
 
@@ -309,12 +309,12 @@ double nsl_fit_model_gompertz_param_deriv(int param, double x, \
double a, double  
 	return 0;
 }
-double nsl_fit_model_gudermann_param_deriv(int param, double x, double s, double mu, \
double a, double weight) { +double nsl_fit_model_gudermann_param_deriv(int param, \
double x, double s, double mu, double A, double weight) {  double norm = weight, y = \
(x-mu)/s;  if (param == 0)
-		return -a/s * norm * y/cosh(y);
+		return -A/s * norm * y/cosh(y);
 	if (param == 1)
-		return -a/s * norm * 1./cosh(y);
+		return -A/s * norm * 1./cosh(y);
 	if (param == 2)
 		return -asin(tanh(y));
 
@@ -338,27 +338,27 @@ double nsl_fit_model_gaussian_tail_param_deriv(int param, \
double x, double s, do  
 	return 0;
 }
-double nsl_fit_model_exponential_param_deriv(int param, double x, double l, double \
mu, double a, double weight) { +double nsl_fit_model_exponential_param_deriv(int \
param, double x, double l, double mu, double A, double weight) {  if (x < mu)
 		return 0;
 	double y = l*(x-mu), efactor = exp(-y);
 
 	if (param == 0)
-		return weight * a * (1. - y) * efactor;
+		return weight * A * (1. - y) * efactor;
 	if (param == 1)
-		return weight * a * gsl_pow_2(l) * efactor;
+		return weight * A * gsl_pow_2(l) * efactor;
 	if (param == 2)
 		return weight * l * efactor;
 
 	return 0;
 }
-double nsl_fit_model_laplace_param_deriv(int param, double x, double s, double mu, \
double a, double weight) { +double nsl_fit_model_laplace_param_deriv(int param, \
double x, double s, double mu, double A, double weight) {  double norm = \
weight/(2.*s), y = fabs((x-mu)/s), efactor = exp(-y);  
 	if (param == 0)
-		return a/s*norm * (y-1.) * efactor;
+		return A/s*norm * (y-1.) * efactor;
 	if (param == 1)
-		return a/(s*s)*norm * (x-mu)/y * efactor;
+		return A/(s*s)*norm * (x-mu)/y * efactor;
 	if (param == 2)
 		return norm * efactor;
 
@@ -388,35 +388,35 @@ double nsl_fit_model_maxwell_param_deriv(int param, double x, \
double a, double c  
 	return 0;
 }
-double nsl_fit_model_poisson_param_deriv(int param, double x, double l, double a, \
double weight) { +double nsl_fit_model_poisson_param_deriv(int param, double x, \
double l, double A, double weight) {  double norm = weight*pow(l, \
x)/gsl_sf_gamma(x+1.);  
 	if (param == 0)
-		return a/l * norm *(x-l)*exp(-l);
+		return A/l * norm *(x-l)*exp(-l);
 	if (param == 1)
 		return norm * exp(-l);
 
 	return 0;
 }
-double nsl_fit_model_lognormal_param_deriv(int param, double x, double s, double mu, \
double a, double weight) { +double nsl_fit_model_lognormal_param_deriv(int param, \
double x, double s, double mu, double A, double weight) {  double norm = \
weight/sqrt(2.*M_PI)/(x*s), y = log(x)-mu, efactor = exp(-(y/s)*(y/s)/2.);  
 	if (param == 0)
-		return a * norm * (y*y - s*s) * efactor;
+		return A * norm * (y*y - s*s) * efactor;
 	if (param == 1)
-		return a * norm * y/(s*s) * efactor;
+		return A * norm * y/(s*s) * efactor;
 	if (param == 2)
 		return norm * efactor;
 
 	return 0;
 }
-double nsl_fit_model_gamma_param_deriv(int param, double x, double t, double k, \
double a, double weight) { +double nsl_fit_model_gamma_param_deriv(int param, double \
x, double t, double k, double A, double weight) {  double factor = weight*pow(x, \
k-1.)/pow(t, k)/gsl_sf_gamma(k), efactor = exp(-x/t);  
 	if (param == 0)
-		return a * factor/t * (x/t-k) * efactor;
+		return A * factor/t * (x/t-k) * efactor;
 	if (param == 1)
-		return a * factor * (log(x/t) - gsl_sf_psi(k)) * efactor;
+		return A * factor * (log(x/t) - gsl_sf_psi(k)) * efactor;
 	if (param == 2)
 		return factor * efactor;
 
@@ -435,35 +435,35 @@ double nsl_fit_model_flat_param_deriv(int param, double x, \
double a, double b, d  
 	return 0;
 }
-double nsl_fit_model_rayleigh_param_deriv(int param, double x, double s, double a, \
double weight) { +double nsl_fit_model_rayleigh_param_deriv(int param, double x, \
double s, double A, double weight) {  double y=x/s, norm = weight*y/s, efactor = \
exp(-y*y/2.);  
 	if (param == 0)
-		return a*y/(s*s) * (y*y-2.)*efactor;
+		return A*y/(s*s) * (y*y-2.)*efactor;
 	if (param == 1)
 		return norm * efactor;
 
 	return 0;
 }
-double nsl_fit_model_rayleigh_tail_param_deriv(int param, double x, double s, double \
mu, double a, double weight) { +double nsl_fit_model_rayleigh_tail_param_deriv(int \
param, double x, double s, double mu, double A, double weight) {  double norm = \
weight*x/(s*s), y = (mu*mu - x*x)/2./(s*s);  
 	if (param == 0)
-		return -2. * a * norm/s * (1. + y) * exp(y);
+		return -2. * A * norm/s * (1. + y) * exp(y);
 	if (param == 1)
-		return a * mu * norm/(s*s) * exp(y);
+		return A * mu * norm/(s*s) * exp(y);
 	if (param == 2)
 		return norm * exp(y);
 
 	return 0;	
 }
-double nsl_fit_model_levy_param_deriv(int param, double x, double g, double mu, \
double a, double weight) { +double nsl_fit_model_levy_param_deriv(int param, double \
x, double g, double mu, double A, double weight) {  double y=x-mu, norm = \
weight*sqrt(g/(2.*M_PI))/pow(y, 1.5), efactor = exp(-g/2./y);  
 	if (param == 0)
-		return a/2.*norm/g/y * (y - g) * efactor;
+		return A/2.*norm/g/y * (y - g) * efactor;
 	if (param == 1)
-		return a/2.*norm/y/y * (3.*y - g) * efactor;
+		return A/2.*norm/y/y * (3.*y - g) * efactor;
 	if (param == 2)
 		return norm * efactor;
 
@@ -475,25 +475,38 @@ double nsl_fit_model_landau_param_deriv(int param, double x, \
double weight) {  
 	return 0;
 }
-double nsl_fit_model_chi_square_param_deriv(int param, double x, double n, double a, \
double weight) { +double nsl_fit_model_chi_square_param_deriv(int param, double x, \
double n, double A, double weight) {  double y=n/2., norm = weight*pow(x, \
y-1.)/pow(2., y)/gsl_sf_gamma(y), efactor = exp(-x/2.);  
 	if (param == 0)
-		return a/2. * norm * (log(x/2.) - gsl_sf_psi(y)) * efactor;
+		return A/2. * norm * (log(x/2.) - gsl_sf_psi(y)) * efactor;
 	if (param == 1)
 		return norm * efactor;
 
 	return 0;
 }
-double nsl_fit_model_students_t_param_deriv(int param, double x, double n, double a, \
double weight) { +double nsl_fit_model_students_t_param_deriv(int param, double x, \
double n, double A, double weight) {  if (param == 0)
-		return weight * a * gsl_sf_gamma((n+1.)/2.)/2./pow(n, \
1.5)/sqrt(M_PI)/gsl_sf_gamma(n/2.) * pow(1.+x*x/n, - (n+3.)/2.) +		return weight * A \
* gsl_sf_gamma((n+1.)/2.)/2./pow(n, 1.5)/sqrt(M_PI)/gsl_sf_gamma(n/2.) * \
                pow(1.+x*x/n, - (n+3.)/2.)
 			* (x*x - 1. - (n+x*x)*log(1.+x*x/n)  + (n+x*x)*(gsl_sf_psi((n+1.)/2.) - \
gsl_sf_psi(n/2.)) ) ;  if (param == 1)
 		return weight * gsl_ran_tdist_pdf(x, n);
 
 	return 0;
 }
+double nsl_fit_model_fdist_param_deriv(int param, double x, double n1, double n2, \
double A, double weight) { +	double norm = weight * \
gsl_sf_gamma((n1+n2)/2.)/gsl_sf_gamma(n1/2.)/gsl_sf_gamma(n2/2.) * pow(n1, n1/2.) * \
pow(n2, n2/2.) * pow(x, n1/2.-1.); +	double y = n2+n1*x;
+
+	if (param == 0)
+		return A/2. * norm * pow(y, -(n1+n2+2.)/2.) * (n2*(1.-x) + y*(log(n1) + log(x) - \
log(y) + gsl_sf_psi((n1+n2)/2.) - gsl_sf_psi(n1/2.))); +	if (param == 1)
+		return A/2. * norm * pow(y, -(n1+n2+2.)/2.) * (n1*(x-1.) + y*(log(n2) - log(y) + \
gsl_sf_psi((n1+n2)/2.) - gsl_sf_psi(n2/2.))); +	if (param == 2)
+		return weight * gsl_ran_fdist_pdf(x, n1, n2);
+
+	return 0;
+}
 double nsl_fit_model_beta_param_deriv(int param, double x, double a, double b, \
double A, double weight) {  double norm = weight * A * \
gsl_sf_gamma(a+b)/gsl_sf_gamma(a)/gsl_sf_gamma(b) * pow(x, a-1.) * pow(1.-x, b-1.);  
@@ -520,43 +533,43 @@ double nsl_fit_model_pareto_param_deriv(int param, double x, \
double a, double b,  
 	return 0;
 }
-double nsl_fit_model_weibull_param_deriv(int param, double x, double k, double l, \
double mu, double a, double weight) { +double nsl_fit_model_weibull_param_deriv(int \
param, double x, double k, double l, double mu, double A, double weight) {  double y \
= (x-mu)/l, z = pow(y, k), efactor = exp(-z);  
 	if (param == 0)
-		return weight*a/l * z/y*(k*log(y)*(1.-z) + 1.) * efactor;
+		return weight * A/l * z/y*(k*log(y)*(1.-z) + 1.) * efactor;
 	if (param == 1)
-		return weight*a*k*k/l/l * z/y*(z-1.) * efactor;
+		return weight * A*k*k/l/l * z/y*(z-1.) * efactor;
 	if (param == 2)
-		return weight*a*k/l/l * z/y/y*(k*z + 1. - k) * efactor;
+		return weight * A*k/l/l * z/y/y*(k*z + 1. - k) * efactor;
 	if (param == 3)
-		return weight*k/l * z/y * efactor;
+		return weight * k/l * z/y * efactor;
 
 	return 0;
 }
-double nsl_fit_model_frechet_param_deriv(int param, double x, double g, double mu, \
double s, double a, double weight) { +double nsl_fit_model_frechet_param_deriv(int \
param, double x, double g, double mu, double s, double A, double weight) {  double y \
= (x-mu)/s, efactor = exp(-pow(y, -g));  
 	if (param == 0)
-		return weight*a/s * pow(y, -2.*g-1.) * (g*log(y)*(1.-pow(y, g))+pow(y, g)) * \
efactor; +		return weight * A/s * pow(y, -2.*g-1.) * (g*log(y)*(1.-pow(y, g))+pow(y, \
g)) * efactor;  if (param == 1)
-		return a*weight * g/(s*s)*pow(y, -g-2.) * (g+1.-g*pow(y, -g)) * efactor;
+		return A * weight * g/(s*s)*pow(y, -g-2.) * (g+1.-g*pow(y, -g)) * efactor;
 	if (param == 2)
-		return a*weight * gsl_pow_2(g/s)*pow(y, -2.*g-1.) * (pow(y, g)-1.) * efactor;
+		return A * weight * gsl_pow_2(g/s)*pow(y, -2.*g-1.) * (pow(y, g)-1.) * efactor;
 	if (param == 3)
-		return g*weight/s * pow(y, -g-1.) * efactor;
+		return g * weight/s * pow(y, -g-1.) * efactor;
 
 	return 0;
 }
-double nsl_fit_model_gumbel1_param_deriv(int param, double x, double s, double b, \
double mu, double a, double weight) { +double nsl_fit_model_gumbel1_param_deriv(int \
param, double x, double s, double b, double mu, double A, double weight) {  double \
norm = weight/s, y = (x-mu)/s, efactor = exp(-y - b*exp(-y));  
 	if (param == 0)
-		return a/s * norm * (y - 1. - b*exp(-y)) * efactor;
+		return A/s * norm * (y - 1. - b*exp(-y)) * efactor;
 	if (param == 1)
-		return -a * norm * exp(-y) * efactor;
+		return -A * norm * exp(-y) * efactor;
 	if (param == 2)
-		return a/s * norm * (1. - b*exp(-y)) * efactor;
+		return A/s * norm * (1. - b*exp(-y)) * efactor;
 	if (param == 3)
 		return norm * efactor;
 
@@ -641,13 +654,13 @@ double nsl_fit_model_logarithmic_param_deriv(int param, double \
k, double p, doub  
 	return 0;
 }
-double nsl_fit_model_sech_dist_param_deriv(int param, double x, double s, double mu, \
double a, double weight) { +double nsl_fit_model_sech_dist_param_deriv(int param, \
double x, double s, double mu, double A, double weight) {  double norm = weight/2./s, \
y = M_PI/2.*(x-mu)/s;  
 	if (param == 0)
-		return -a/s * norm * (y*tanh(y)+1.)/cosh(y);
+		return -A/s * norm * (y*tanh(y)+1.)/cosh(y);
 	if (param == 1)
-		return a*M_PI/2./s * norm * tanh(y)/cosh(y);
+		return A*M_PI/2./s * norm * tanh(y)/cosh(y);
 	if (param == 2)
 		return norm * 1./cosh(y);
 
diff --git a/src/backend/nsl/nsl_fit.h b/src/backend/nsl/nsl_fit.h
index 78e52a64..6be9a5b7 100644
--- a/src/backend/nsl/nsl_fit.h
+++ b/src/backend/nsl/nsl_fit.h
@@ -109,6 +109,7 @@ double nsl_fit_model_rayleigh_tail_param_deriv(int param, double \
x, double s, do  double nsl_fit_model_landau_param_deriv(int param, double x, double \
weight);  double nsl_fit_model_chi_square_param_deriv(int param, double x, double n, \
double a, double weight);  double nsl_fit_model_students_t_param_deriv(int param, \
double x, double n, double a, double weight); +double \
nsl_fit_model_fdist_param_deriv(int param, double x, double n1, double n2, double a, \
double weight);  double nsl_fit_model_beta_param_deriv(int param, double x, double a, \
double b, double A, double weight);  double nsl_fit_model_pareto_param_deriv(int \
param, double x, double a, double b, double A, double weight);  double \
nsl_fit_model_weibull_param_deriv(int param, double x, double k, double l, double mu, \
                double a, double weight);
diff --git a/src/backend/nsl/nsl_sf_stats.c b/src/backend/nsl/nsl_sf_stats.c
index 4c8eb6d1..de41ea70 100644
--- a/src/backend/nsl/nsl_sf_stats.c
+++ b/src/backend/nsl/nsl_sf_stats.c
@@ -37,7 +37,7 @@ const char* nsl_sf_stats_distribution_name[] = {i18n("Gaussian \
(Normal)"), i18n(  i18n("Hypergeometric"), i18n("Logarithmic"), \
i18n("Maxwell-Boltzmann"), i18n("Hyperbolic secant (sech)"), i18n("Levy"), \
i18n("Frechet (inverse Weibull)")};  const char* nsl_sf_stats_distribution_pic_name[] \
= {  "gaussian", "gaussian_tail", "exponential", "laplace", "exponential_power", \
                "cauchy_lorentz", "rayleigh", "rayleigh_tail", "landau",
-	"levy_alpha_stable", "levy_skew_alpha_stable","gamma", "flat", "lognormal", \
"chi_squared", "F", "students_t", "beta", "logistic", +	"levy_alpha_stable", \
"levy_skew_alpha_stable","gamma", "flat", "lognormal", "chi_squared", "fdist", \
"students_t", "beta", "logistic",  "pareto", "weibull", "gumbel1", "gumbel2", \
"poisson", "bernoulli", "binomial", "negative_binomial", "pascal", "geometric",  \
"hypergeometric", "logarithmic", "maxwell_boltzmann", "sech", "levy", "frechet"};  \
const char* nsl_sf_stats_distribution_equation[] = { @@ -46,7 +46,7 @@ const char* \
nsl_sf_stats_distribution_equation[] = {  "a * x/s^2 * exp(-(x/s)^2/2)", "a*x/s^2 * \
exp((mu^2-x^2)/2/s^2)", "a*landau(x)",  "Levy alpha-stable", "Levy-skew", \
"a/gamma(k)/t^k * x^(k-1)*exp(-x/t)",  "A/(b-a)*theta(b-x)*theta(x-a)", \
"a/sqrt(2*pi)/x/s * exp(-( (log(x)-mu)/s )^2/2)", "a * \
                x^(n/2.-1.)/2^(n/2.)/gamma(n/2.) * exp(-x/2.)",
-	"F", "a*gamma((n+1)/2)/sqrt(pi*n)/gamma(n/2) * (1+x^2/n)^(-(n+1)/2)", \
"gamma(a+b)/gamma(a)/gamma(b) * x^(a-1) * (1-x)^(b-1)", +	"a * fdist(x, n1, n2)", \
"a*gamma((n+1)/2)/sqrt(pi*n)/gamma(n/2) * (1+x^2/n)^(-(n+1)/2)", \
"gamma(a+b)/gamma(a)/gamma(b) * x^(a-1) * (1-x)^(b-1)",  "a/4/s * \
sech((x-mu)/2/s)**2", "a/b * (b/x)^(a+1) * theta(x-b)", "a * k/l * ((x-mu)/l)^(k-1) * \
exp(-((x-mu)/l)^k)",  "a/s * exp(-(x-mu)/s - b*exp(-(x-mu)/s))", "A*a*b * \
(x-mu)^(-a-1) * exp(-b*(x-mu)^(-a))", "a * l^x/gamma(x+1) * exp(-l)",  "Bernoulli", \
                "a * binomial(x, p, n)", "a * negative_binomial(x, p, n)",
diff --git a/src/backend/worksheet/plots/cartesian/XYFitCurve.cpp \
b/src/backend/worksheet/plots/cartesian/XYFitCurve.cpp index 96559535..ba43d45f \
                100644
--- a/src/backend/worksheet/plots/cartesian/XYFitCurve.cpp
+++ b/src/backend/worksheet/plots/cartesian/XYFitCurve.cpp
@@ -697,6 +697,22 @@ int func_df(const gsl_vector* paramValues, void* params, \
gsl_matrix* J) {  }
 			break;
 		}
+		case nsl_sf_stats_fdist: {
+			double n1 = nsl_fit_map_bound(gsl_vector_get(paramValues, 0), min[0], max[0]);
+			double n2 = nsl_fit_map_bound(gsl_vector_get(paramValues, 1), min[1], max[1]);
+			double a = nsl_fit_map_bound(gsl_vector_get(paramValues, 2), min[2], max[2]);
+			for (size_t i = 0; i < n; i++) {
+				x = xVector[i];
+
+				for (int j = 0; j < 3; j++) {
+					if (fixed[j])
+						gsl_matrix_set(J, i, j, 0.);
+					else
+						gsl_matrix_set(J, i, j, nsl_fit_model_fdist_param_deriv(j, x, n1, n2, a, \
weight[i])); +				}
+			}
+			break;
+		}
 		case nsl_sf_stats_beta:
 		case nsl_sf_stats_pareto: {
 			double a = nsl_fit_map_bound(gsl_vector_get(paramValues, 0), min[0], max[0]);
@@ -905,10 +921,9 @@ int func_df(const gsl_vector* paramValues, void* params, \
gsl_matrix* J) {  }
 			break;
 		}
-		// TODO: not implemented yet:
+		// unused distributions
 		case nsl_sf_stats_levy_alpha_stable:
 		case nsl_sf_stats_levy_skew_alpha_stable:
-		case nsl_sf_stats_fdist:
 		case nsl_sf_stats_bernoulli:
 			break;
 		}
diff --git a/src/kdefrontend/dockwidgets/XYFitCurveDock.cpp \
b/src/kdefrontend/dockwidgets/XYFitCurveDock.cpp index aeed2280..ae4ebbe7 100644
--- a/src/kdefrontend/dockwidgets/XYFitCurveDock.cpp
+++ b/src/kdefrontend/dockwidgets/XYFitCurveDock.cpp
@@ -410,13 +410,12 @@ void XYFitCurveDock::categoryChanged(int index) {
 		for(int i = 0; i < NSL_SF_STATS_DISTRIBUTION_COUNT; i++)
 			uiGeneralTab.cbModel->addItem(nsl_sf_stats_distribution_name[i]);
 
-		// non-used items are disabled here
+		// not-used items are disabled here
         	const QStandardItemModel* model = qobject_cast<const \
QStandardItemModel*>(uiGeneralTab.cbModel->model());  
 		for(int i = 1; i < NSL_SF_STATS_DISTRIBUTION_COUNT; i++) {
-			//TODO: not implemented yet:
-			if (i == nsl_sf_stats_levy_alpha_stable || i == \
                nsl_sf_stats_levy_skew_alpha_stable ||
-				i == nsl_sf_stats_fdist || i == nsl_sf_stats_bernoulli) {
+			// unused distributions
+			if (i == nsl_sf_stats_levy_alpha_stable || i == \
nsl_sf_stats_levy_skew_alpha_stable || i == nsl_sf_stats_bernoulli) {  QStandardItem* \
                item = model->item(i);
 					item->setFlags(item->flags() & ~(Qt::ItemIsSelectable|Qt::ItemIsEnabled));
 			}
@@ -767,7 +766,6 @@ void XYFitCurveDock::updateModelEquation() {
 		break;
 	case nsl_fit_model_distribution:
 		switch ((nsl_sf_stats_distribution)m_fitData.modelType) {
-		// TODO: add missing GSL distributions (see nsl_sf_stats.c)
 		case nsl_sf_stats_gaussian:
 		case nsl_sf_stats_laplace:
 		case nsl_sf_stats_rayleigh_tail:
@@ -802,8 +800,9 @@ void XYFitCurveDock::updateModelEquation() {
 			m_fitData.paramNames << "a";
 			m_fitData.paramNamesUtf8 << "A";
 			break;
-		case nsl_sf_stats_levy_alpha_stable:	// TODO
-		case nsl_sf_stats_levy_skew_alpha_stable:	// TODO
+		case nsl_sf_stats_levy_alpha_stable:	// unused distributions
+		case nsl_sf_stats_levy_skew_alpha_stable:
+		case nsl_sf_stats_bernoulli:
 			break;
 		case nsl_sf_stats_gamma:
 			m_fitData.paramNames << "t" << "k" << "a";
@@ -816,7 +815,10 @@ void XYFitCurveDock::updateModelEquation() {
 			m_fitData.paramNames << "n" << "a";
 			m_fitData.paramNamesUtf8 << "n" << "A";
 			break;
-		case nsl_sf_stats_fdist:	// TODO
+		case nsl_sf_stats_fdist:
+			m_fitData.paramNames << "n1" << "n2" << "a";
+			m_fitData.paramNamesUtf8 << QString::fromUtf8("\u03bd") + \
QString::fromUtf8("\u2081") +				<< QString::fromUtf8("\u03bd") + \
QString::fromUtf8("\u2082") << "A";  break;
 		case nsl_sf_stats_tdist:
 			m_fitData.paramNames << "n" << "a";
@@ -842,8 +844,6 @@ void XYFitCurveDock::updateModelEquation() {
 			m_fitData.paramNames << "l" << "a";
 			m_fitData.paramNamesUtf8 << QString::fromUtf8("\u03bb") << "A";
 			break;
-		case nsl_sf_stats_bernoulli:	// TODO
-			break;
 		case nsl_sf_stats_binomial:
 		case nsl_sf_stats_negative_binomial:
 		case nsl_sf_stats_pascal:
diff --git a/src/pics/gsl_distributions/F.jpg b/src/pics/gsl_distributions/F.jpg
deleted file mode 100644
index c2174bd6..00000000
Binary files a/src/pics/gsl_distributions/F.jpg and /dev/null differ
diff --git a/src/pics/gsl_distributions/fdist.jpg \
b/src/pics/gsl_distributions/fdist.jpg new file mode 100644
index 00000000..cf1267a9
Binary files /dev/null and b/src/pics/gsl_distributions/fdist.jpg differ


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic