#include < iostream.h >
#include < math.h >
void main()
{
int n1,n;
cout << "请输入节点个数:"<<endl;
cin >> n1;
n = n1-1 ;
double * x = new double [n+1];
double * y = new double [n+1];
double xx = 0;
double yy = 0;
cout << "请输入各个节点:"<<endl;
for(int i=0; i<=n; i++)
cin >> x[i] >> y[i];
cout << "请输入要求的节点:"<<endl;
cin >> xx;
double * h = new double [n];
for( i=0; i<=n-1; i++)
h[i] = x[i+1]-x[i];
double * a = new double [n+1];
double * b = new double [n+1];
double * m = new double [n+2];
int choice;
cout << "\n1.第一种边界条件(手动输入m[0],m[n]);"<<endl;
cout << "2.第二种边界条件(m[0]=0,m[n]=0);"<<endl;
cout << "\n请选择边界条件:" <<endl;
cin >> choice;
switch (choice)
{
case 1:
cout << "m[0]=" ; cin >> m[0];
cout << "m[n]=" ; cin >> m[n];
a[0] = 0; b[0] = 2*m[0];
a[n] = 1; b[n] = 2*m[n];
break;
case 2:
a[0] = 1; b[0] = 3*(y[1]-y[0])/h[0];
a[n] = 0; b[n] = 3*(y[n]-y[n-1])/h[n-1];
break;
default:
cout << "输入错误!"<<endl;
}
for ( i = 1; i<=n-1; i++)
{
a[i] = h[i-1]/(h[i-1]+h[i]) ;
b[i] = 3*((1-a[i])*(y[i]-y[i-1])/h[i-1] + a[i]*(y[i+1]-y[i])/h[i]) ;
}
double * a1 = new double [n+1];
double * b1 = new double [n+1];
for ( i=0; i<=n; i++)
{
if(i==0)
{
a1[i] = -a[i]/2 ;
b1[i] = b[i]/2 ;
}
a1[i] = -a[i]/(2 + (1-a[i])*a1[i-1]) ;
b1[i] = (b[i]-(1-a[i])*b1[i-1])/(2 + (1-a[i])*a1[i-1]) ;
}
m[n+1] = 0 ;
for ( i=n; i>=0; i--)
m[i] = a1[i]*m[i+1]+b1[i] ;
int key = 0 ;
for ( i=0; i<=n-1; i++)
{
if(xx>=x[i] && xx<=x[i+1])
key = i ;
}
if(key>=n)
{
cout << "error!" <<endl;
return;
}
yy = (1+2*(xx-x[key])/(x[key+1]-x[key]))*pow((xx-x[key+1])/(x[key]-x[key+1]),2)*y[key] ;
yy += (1+2*(xx-x[key+1])/(x[key]-x[key+1]))*pow((xx-x[key])/(x[key+1]-x[key]),2)*y[key+1] ;
yy += (xx-x[key])
*pow((xx-x[key+1])/(x[key]-x[key+1]),2)*m[key] ;
yy += (xx-x[key+1])*pow((xx-x[key])/(x[key+1]-x[key]),2)*m[key+1] ;
cout << yy <<endl;
}