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

List:       kde-commits
Subject:    [labplot/analysis_playground] src/backend/nsl: implemented Simpson rule in nsl int
From:       Stefan Gerlach <stefan.gerlach () uni-konstanz ! de>
Date:       2016-09-29 19:35:55
Message-ID: E1bph7b-0004hH-Tp () code ! kde ! org
[Download RAW message or body]

Git commit 4105a2105db73fc28cd79a95dff51dc181be84c0 by Stefan Gerlach.
Committed on 29/09/2016 at 19:35.
Pushed by sgerlach into branch 'analysis_playground'.

implemented Simpson rule in nsl int

M  +3    -3    src/backend/nsl/nsl_int.c
M  +2    -1    src/backend/nsl/nsl_int_test.c
M  +7    -2    src/backend/nsl/nsl_sf_poly.c

http://commits.kde.org/labplot/4105a2105db73fc28cd79a95dff51dc181be84c0

diff --git a/src/backend/nsl/nsl_int.c b/src/backend/nsl/nsl_int.c
index b8edde3..a8e7abe 100644
--- a/src/backend/nsl/nsl_int.c
+++ b/src/backend/nsl/nsl_int.c
@@ -93,11 +93,11 @@ size_t nsl_int_simpson(double *x, double *y, const size_t n, int abs) {
 	for (i = 0; i < n-2; i+=2) {
 		for (j=0; j < 3; j++)
 			xdata[j] = x[i+j], ydata[j] = y[i+j];
-		y[np] = sum;
-		x[np++] = x[i+1];
-		printf("i/sum: %zu-%zu %g\n", i, i+2, sum);
 
 		sum += nsl_sf_poly_interp_lagrange_2_int(xdata, ydata);
+		y[np] = sum;
+		x[np++] = x[i+1];
+		/*printf("i/sum: %zu-%zu %g\n", i, i+2, sum);*/
 	}
 	y[n-1] = sum;
 
diff --git a/src/backend/nsl/nsl_int_test.c b/src/backend/nsl/nsl_int_test.c
index bbeb691..be0c4ae 100644
--- a/src/backend/nsl/nsl_int_test.c
+++ b/src/backend/nsl/nsl_int_test.c
@@ -76,12 +76,13 @@ int main() {
 	puts("");
 
 	printf("integral (Simpson's 1/3, 3-point):\n");
+	/*double ydata5[]={2,2,2,2,2};*/
 	double ydata5[]={1,2,3,-1,-3};
 	size_t np = nsl_int_simpson(xdata, ydata5, n, 0);
 
 	for (i=0; i < np; i++)
 		printf("%g %g\n", xdata[i], ydata5[i]);
-	printf("sum = %g (n = %zu)\n", ydata5[n-1], np);
+	printf("sum = %g (n = %zu)\n", ydata5[np-1], np);
 	puts("");
 
 	return 0;
diff --git a/src/backend/nsl/nsl_sf_poly.c b/src/backend/nsl/nsl_sf_poly.c
index b362145..a7828f9 100644
--- a/src/backend/nsl/nsl_sf_poly.c
+++ b/src/backend/nsl/nsl_sf_poly.c
@@ -106,6 +106,7 @@ double complex nsl_sf_poly_reversed_bessel_theta(int n, double complex x) {
 /***************** interpolating polynomials *************/
 
 double nsl_sf_poly_interp_lagrange_0_int(double *x, double y) {
+	/* rectangle rule */
 	return (x[1]-x[0])*y;
 }
 
@@ -116,6 +117,7 @@ double nsl_sf_poly_interp_lagrange_1_deriv(double *x, double *y) {
 	return (y[0]-y[1])/(x[1]-x[0]);
 }
 double nsl_sf_poly_interp_lagrange_1_int(double *x, double *y) {
+	/* trapezoid rule (2-point) */
 	return (x[1]-x[0])*(y[0]+y[1])/2.;
 }
 double nsl_sf_poly_interp_lagrange_1_absint(double *x, double *y) {
@@ -147,8 +149,11 @@ double nsl_sf_poly_interp_lagrange_2_deriv2(double *x, double *y) {
 	return 2.*( y[0]/(h1*h12) - y[1]/(h1*h2) + y[2]/(h12*h2) );
 }
 double nsl_sf_poly_interp_lagrange_2_int(double *x, double *y) {
-	/* TODO */
-	return 0;
+	/* Simpson's 1/3 rule for non-uniform grid (3-point) */
+	double h1 = x[1]-x[0], h2 = x[2]-x[1];
+	double h12 = h1+h2, h1_2 = h1/h2;
+
+	return h12/6.*( (2.-1./h1_2)*y[0] + (2.+h1_2+1./h1_2)*y[1] + (2.-h1_2)*y[2] );
 }
 
 double nsl_sf_poly_interp_lagrange_3(double v, double *x, double *y) {
[prev in list] [next in list] [prev in thread] [next in thread] 

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