//STL
#include <iostream>
#include <fstream>
#include <iomanip>
//C
#include <clocale>
#include <cmath>
using namespace std;
double *swype (double *a, double *b, double *c, double *d, int n){
/**
* Метод прогонки
*/
double *x, *A, *B, e;
x = new double [n];
A = new double [n-1];
B = new double [n-1];
//прямая прогонка
A[0]=-c[0]/b[0];
B[0]=d[0]/b[0];
for (int i=1; i<n-1; i++){
e=a[i-1]*A[i-1]+b[i];
B[i]=(d[i]-a[i-1]*B[i-1])/e;
A[i]=-c[i]/e;
}
//обратная прогонка
x[n-1]=(d[n-1]-a[n-2]*B[n-2])/(b[n-1]+a[n-2]*A[n-2]);
for (int i=n-2; i>=0; i--) x[i]=A[i]*x[i+1]+B[i];
delete [] A;
delete [] B;
return x;
}
double powr (double x, int n){
/**
* Возведение в степень
*/
if (n==0) return 1;
double y=1;
for (int i=1; i<=n; i++) y*=x;
return y;
}
int main()
{
/**
* Интерполяция сплайнами
*/
setlocale(LC_ALL, "rus");
double *a, *b, *c, *d, *aa, *bb, *cc, *dd, *x, *y, A=-0.5, B=0.5;
int N;
ofstream f1("graph.txt"), f2("plot.plt");
cout<<"Введите N"<<endl;
cin>>N;
//инициализация
a = new double [N];
aa = new double [N-2];
b = new double [N];
bb = new double [N-1];
c = new double [N];
cc = new double [N-2];
d = new double [N];
dd = new double [N-1];
x = new double [N+1];
y = new double [N+1];
//вычисления
double h = (B-A)/(N);
for (int i=0; i<=N; i++) {
x[i]= A+i*h;
if (fabs(x[i])<0.000001) x[i]=0;
y[i]= powr(x[i],3)-3*x[i]+2+10*powr(x[i],10);
if (i<N) a[i]=y[i];
if (i<N-1) {
bb[i]=4*h;
dd[i]=3*(y[i+1]-2*y[i]+y[i-1])/h;
}
if (i<N-2){
aa[i]=h;
cc[i]=h;
}
}
c[0]=0;
c++;
double * cd = swype(aa,bb,cc,dd,N-1);
copy(cd,cd+N-1,c);
c--;
delete [] cd;
d[N-1]=-c[N-1]/(3*h);
b[N-1]=(y[N]-y[N-1])/h-2*c[N-1]/3*h;
for (int i=0; i<N-1; i++){
d[i]=(c[i+1]-c[i])/(3*h);
b[i]=(y[i+1]-y[i])/h-(2*c[i]+c[i+1])/3*h;
}
//вывод на экран и запись в файл
cout<<0<<" "<<0<<" "<<0<<" "<<0<<" "<<x[0]<<" "<<y[0]<<endl;
f2<<showpos;
f1<<x[0]<<" "<<y[0]<<endl;
f2<<"set terminal pngcairo"<<endl<<"set output \"graph.png\""<<endl<<
"set xrange ["<<x[0]<<":"<<x[N]<<"]"<<endl<<"f(x)=";
for (int i=1; i<=N; i++){
f1<<x[i]<<" "<<y[i]<<endl;
cout<<a[i-1]<<" "<<b[i-1]<<" "<<c[i-1]<<" "<<d[i-1]<<" "<<x[i]<<" "<<y[i]<<endl;
f2<<"x>="<<x[i-1]<<"&&x<"<<x[i]<<" ? "<<a[i-1]<<b[i-1]<<"*(x"<<-x[i-1]<<")"
<<c[i-1]<<"*(x"<<-x[i-1]<<")**2"<<d[i-1]<<"*(x"<<-x[i-1]<<")**3 : ";
}
f2<<"1/0"<<endl<<"plot f(x), x**3-3*x+2+10*x**10 w l";
delete [] a;
delete [] aa;
delete [] b;
delete [] bb;
delete [] c;
delete [] cc;
delete [] d;
delete [] dd;
delete [] x;
delete [] y;
return 0;
}