diff --git a/Interpolation.cpp b/Interpolation.cpp new file mode 100644 index 0000000..ed8dee2 --- /dev/null +++ b/Interpolation.cpp @@ -0,0 +1,145 @@ +#include "Interpolation.h" +#include +#include +#include +#include + +using namespace std; + +Interpolation::Interpolation() +{ + //ctor +} + +Interpolation::~Interpolation() +{ + //dtor +} +////////////// Spline Interpolation //////////////////////// + +double Interpolation::findingInterval(double x[], double a, int n) { + for (int i = n-1; i > 0; i--){ + if (a < x[i] && a > x[i-1]) { + return i-1; + } + } +} + +double Interpolation::Spline(double x[], double y[], double a, int n){ + int interval, i; + double h[n], alpha[n], l[n], u[n], z[n], c[n], b[n], d[n], interpolant,aj,bj,cj,dj; + //setting length of the intervals + for (i=0; i=0; i--){ + c[i] = z[i] - (u[i] * c[i+1]) ; + b[i] = ( (y[i+1] - y[i]) / (h[i]) ) - ((h[i]/3) * (c[i+1] + (2*c[i]))); + d[i] = (c[i+1] - c[i]) / (3*h[i]); + } + sort(x,x+n); + if (a < x[0] || a > x[n-1]){ + cout << "Not in range"; + return 0; + } + else{ + interval = findingInterval(x, a, n); + //calculated coefficients of Sj(x) = aj + bj(x-xj) + cj(x-xj)^2 + dj(x-xj) ^3 + aj = y[interval]; + bj = b[interval]; + cj = c[interval]; + dj = d[interval]; + interpolant = aj + bj + pow( cj * (a - x[interval]) , 2) + pow( dj * (a - x[interval]) , 3); + cout << "\naj = " << aj << "\nbj = " << bj << "\ncj = " << cj << "\ndj = " << dj << "\n" << "x[interval] = " << x[interval] << "\n " << "a: " << a << "\n"; + return interpolant; + } +} + +double Interpolation::evaluatingNewtonPoint(double a, double fdd[], int n, double x[]){ + double sum, mult; + for(int i=n-1;i>=0;i--) + { + mult = 1; + for(int j=0;jj;i--){ + fdd[i] = ( fdd[i]-fdd[i-1] )/ ( x[i]-x[i-j-1]) ; + } + } + return fdd; +} +double Interpolation::NewtInt(double x[], double y[], double a, int n) +{ + double *fdd; //initializng an array of Fdds + double interpolant; + int i,j; + + //calculating FDDs for each iteration + fdd = calculateFdds(x, y , n); + + //evaluating fn(x) while calculating coefficients + interpolant = evaluatingNewtonPoint(a, fdd, n, x); + return interpolant; +} + +/** + @param a[] array to be printed + @param n size of the array + helper function for printing the array +*/ +void printArray(double a[], int n){ + for (int i = 0; i