Skip to content

Instantly share code, notes, and snippets.

@feliwir
Created May 13, 2016 19:07
Show Gist options
  • Save feliwir/f46c0c9d360d0136d78e77be186e4d0f to your computer and use it in GitHub Desktop.
Save feliwir/f46c0c9d360d0136d78e77be186e4d0f to your computer and use it in GitHub Desktop.
void computeCubicSplineCoefficients(double** a, double* x, double* y, int n)
{
double** matrix = new double*[n-1];
for (int i=0; i<n-1; i++)
matrix[i] = new double[n-1];
double* sol = new double[n-1];
double* rhs = new double[n-1];
/* Füllen Sie hier die Matrix und die rechte Seite mit den entsprechenden Werten. */
for(int i=0;i<n-1;++i)
{
double h1 = x[i+1]-x[i];
double h2 = x[i+2]-x[i+1];
if(i-1>=0)
matrix[i][i-1]=h1;
matrix[i][i]= 2*(h1+h2);
if(i+1<n-1)
matrix[i][i+1]=h2;
rhs[i] = 3*((y[i+2]-y[i+1])/h2-(y[i+1]-y[i])/h1);
}
a[0][2]=0;
a[n-1][2]=0;
// solve
solveByGaussSeidel(sol, matrix, rhs, n-1);
for(int i=0;i<n-1;++i)
{
a[i+1][2]=sol[i];
}
/* Berechnen Sie hier die Koeffizienten a unter Verwendung der Lösung des LGS. */
for(int i=0;i<n;++i)
{
double hi = x[i+1]-x[i];
//a[i][0]=y[i];
a[i][0] = y[i];
if(i>0)
{
a[i][3]=(a[i][2]+a[i-1][2])/3*hi;
a[i][1]=(y[i]-y[i-1])/hi+a[i][2]-a[i][3]*hi*hi;
}
else
{
a[i][3]=(a[i][2])/3*hi;
a[i][1]=(y[i])/hi+a[i][2]-a[i][3]*hi*hi;
}
std::cout << a[i][3]<<"x^3 + "<< a[i][2]<<"x^2 + "<< a[i][1]<< "x + "<< a[i][0] << std::endl;
}
//STIMMT
// cleanup
for (int i=0; i<n-1; i++)
delete [] matrix[i];
delete [] matrix;
delete [] sol;
delete [] rhs;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment