Discrete
Approximates a discrete function using least squares polynomial fitting.
Interface
#include <codecogs/maths/approximation/regression/discrete.h>
using namespace Maths::Approximation::Regression;
class Discrete
-
Discrete(int n, double *x, double *y, int degree)constructor -
~Discrete()destructor -
double getValue(double x) -
double getCoefficent(int i)
Functions
Overview
This class approximates an arbitrary discrete function using polynomial least squares fitting.
The algorithm finds the coefficients $a_i$, with $0 \leq i \leq n$ such that the following polynomial fits the given set of points with minimum error, using least squares minimization
For this function the residual (or error between y and that calculated using the coefficients) is given by
From which the rate of change of this error with respect to each constant are, which ideally we want to make zero:
Equating to zero and rearranging to separate the constants a from y, gives:
which in matrix form, yields
Solving this solutions using a matrix transpose, yields the coefficients a in terms of x and y.
Below you will find the regression graph for a set of points obtained by evaluating the function $f(x) = \sin(x) / x$. The regression polynomial using a variety of orders are displayed (same results are shown in example below)

References
Example 1
The following example displays 10 approximated values (you may change this amount through the N_out variable) for the function $g(x) = \sin(x) / x$ with abscissas equally spaced in the $[ \pi/2, 4\pi]$ interval. The X and Y coordinate arrays are initialized by evaluating this function for N = 20 points equally spaced in the domain from $\pi/2$ to $4\pi$.
#include <codecogs/maths/approximation/regression/discrete.h>
#include <cmath>
#include <stdio.h>
using namespace std;
#define PI 3.1415926535897932384626433832795
#define N 30
int main()
{
// Declare two arrays to hold the coordinates of initial data points
double x[N], y[N];
// Generate the points
double xx = PI/2;
double step = 2 * PI / (N - 1);
for (int i = 0; i < N; ++i, xx += step)
{
double x2=xx+sin(xx); // vary x spacing
x[i] = x2;
y[i] = sin(x2)/x2;
}
// Initialize the regression approximation routine with known data points
Maths::Approximation::Regression::Discrete A(N, x, y, 3);
Maths::Approximation::Regression::Discrete B(N, x, y, 5);
Maths::Approximation::Regression::Discrete C(N, x, y, 10);
// Interrogate the regression function to find approximated values
int N_out =50;
xx = PI/2 ;
step = 2 * PI / (N_out - 1);
printf("\nx, exact, discrete_3, discrete_5, discrete_10");
for (int i = 0; i < N_out; ++i, xx += step)
{
double x2=xx+sin(xx);
printf("\n%.4lf, %.6lf, %.6lf, %.6lf, %.6lf", x2, sin(x2)/x2, A.getValue(x2), B.getValue(x2), C.getValue(x2));
}
return 0;
}Output (first 10 numbers):
x, exact, discrete_3, discrete_5, discrete_10
2.5708, 0.210169, 0.235747, 0.210570, 0.210190
2.6908, 0.161909, 0.175569, 0.162336, 0.161899
2.7945, 0.121709, 0.127760, 0.122034, 0.121692
2.8824, 0.088920, 0.090229, 0.089115, 0.088905
2.9550, 0.062769, 0.061196, 0.062848, 0.062759
3.0134, 0.042441, 0.039160, 0.042431, 0.042435
3.0585, 0.027131, 0.022864, 0.027058, 0.027128
3.0919, 0.016071, 0.011248, 0.015955, 0.016070
3.1150, 0.008531, 0.003406, 0.008388, 0.008532
3.1296, 0.003821, -0.001463, 0.003663, 0.003822Members of Discrete
CONSTRUCTOR
Discrete
Initializes the necessary data for following evaluations of the polynomial.
Parameters
DESTRUCTOR
Discrete
Detailed Description...
CLASS METHOD
getValue
Returns the approximated ordinate at the given abscissa.
Parameters
CLASS METHOD
getCoefficent
Returns individual coefficient from the computed polynomial, i.e. $a_i$ in the following equation:
Example 1
...
Maths::Approximation::Regression::Discrete A(N, x, y, 7);
for(int i=0;i<7;i++) printf("\n coefficient %d is %lf", i, A.getCoefficent(i));
...Parameters
CLASS METHOD
IntPower
Parameters
FUNCTION
Discrete_once
This function implements the Discrete class for one off calculations, thereby avoiding the need to instantiate the Discrete class yourself.
Example 1
The following graph is constructed from interpolating the following values:
x = 1 y = 0.22
x = 2 y = 0.04
x = 3 y = -0.13
x = 4 y = -0.17
x = 5 y = -0.04
x = 6 y = 0.09
x = 7 y = 0.11\graph N=7 x="1 2 3 4 5 6 7" y="0.22 0.04 -0.13 -0.17 -0.04 0.09 0.11" a=1:7 degree=5 .input