00001
00002
00003
00004 char* series_parabolic_cpp = "$Id: sxy_series_parabolic.cpp,v 1.1 2002/11/28 20:57:13 clinio Exp $";
00005
00006
00007
00008 #include <float.h>
00009 #include "sxy_series_parabolic.h"
00010
00011
00012
00013
00014
00015 SXYParabolicSeries::SXYParabolicSeries(unsigned int buffer_size,
00016 unsigned int resolution) :
00017 SXYCoeficientsAproximationSeries(3, buffer_size, resolution) {
00018 }
00019
00020
00021
00022 SXYParabolicSeries::~SXYParabolicSeries(void) {
00023 }
00024
00025
00026
00027 unsigned int SXYParabolicSeries::aproxFunctionCallback( double x, double& y ) {
00028 double A, B, C;
00029 if (!getCoeficient(0, A) ||
00030 !getCoeficient(1, B) ||
00031 !getCoeficient(2, C) ) return 0;
00032 y = A*x*x + B*x + C;
00033 return 1;
00034 }
00035
00036
00043 unsigned int SXYParabolicSeries::calculateCoeficients(unsigned int n,
00044 double* buffer_x, double* buffer_y) {
00045
00046 if ( n <= 2 ) return 0;
00047
00048 double* x = buffer_x;
00049 double* y = buffer_y;
00050
00051 double x0 = n;
00052 double x1 = 0;
00053 double x2 = 0;
00054 double x3 = 0;
00055 double x4 = 0;
00056
00057 double p0 = 0;
00058 double p1 = 0;
00059 double p2 = 0;
00060
00061 for (unsigned int i = 0 ; i < n ; i++) {
00062 x1 = x1 + x[i];
00063 x2 = x2 + x[i]*x[i];
00064 x3 = x3 + x[i]*x[i]*x[i];
00065 x4 = x4 + x[i]*x[i]*x[i]*x[i];
00066 p0 = p0 + y[i];
00067 p1 = p1 + x[i]*y[i];
00068 p2 = p2 + x[i]*x[i]*y[i];
00069 }
00070
00071 double den = ( -(x2*x2*x2) + 2*x1*x2*x3 - x0*x3*x3 - x1*x1*x4 + x0*x2*x4 );
00072 if (den < 1e-10) return 0;
00073
00074 double A = ( -(p2*x1*x1) + p2*x0*x2 + p1*x1*x2 -
00075 p0*x2*x2 - p1*x0*x3 + p0*x1*x3 ) / den;
00076
00077 double B = ( p2*x1*x2 - p1*x2*x2 - p2*x0*x3 +
00078 p0*x2*x3 + p1*x0*x4 - p0*x1*x4 ) / den;
00079
00080 double C = ( -(p2*x2*x2) + p2*x1*x3 + p1*x2*x3 -
00081 p0*x3*x3 - p1*x1*x4 + p0*x2*x4 ) / den;
00082
00083 setCoeficient(0,A);
00084 setCoeficient(1,B);
00085 setCoeficient(2,C);
00086 return 1;
00087 }
00088
00089