📄 cpp1.cpp
字号:
#include<iostream.h>
#include<math.h>
int n;
double yangtiao(double a[],double y[],double &dx,double &ddf,double x)
{
double *u,*d,*h,*r,*b,*M;
u=new double[n];r=new double[n];
d=new double[n+1];h=new double[n];
b=new double[n+1];M=new double[n+1];
int i,j;
for(i=0;i<n;i++)
h[i]=a[i+1]-a[i];
for(i=0;i<=n;i++)
b[i]=2;
for(j=0;j<n-1;j++)
{
u[j]=h[j]/(h[j+1]+h[j]);r[j+1]=1-u[j];
}
r[0]=1;u[n-1]=1;
d[0]=6*((y[1]-y[0])/h[0]-dx)/h[0];
d[n]=6*(ddf-(y[n]-y[n-1])/h[n-1])/h[n-1];
for(int ii=1;ii<=n-1;ii++)
d[ii]=6*((y[ii+1]-y[ii])/h[ii]-(y[ii]-y[ii-1])/h[ii-1])/(a[ii+1]-a[ii-1]);
for(i=1;i<=n;i++)
{
b[i]=b[i]-u[i-1]/b[i-1]*r[i-1];
d[i]=d[i]-u[i-1]/b[i-1]*d[i-1];
}
M[n]=d[n]/b[n];
for(j=n-1;j>=0;j--)
{
M[j]=(d[j]-r[j]*M[j+1])/b[j];
}
double yy=0;
for(i=0;i<n;i++)
{
if((x>=a[i])&&(x<=a[i+1]))
{
yy+=M[i]*pow((a[i+1]-x),3)/(6*h[i]);
yy+=M[i+1]*pow((x-a[i]),3)/(6*h[i]);
yy+=(y[i]-M[i]*h[i]*h[i]/6)*(a[i+1]-x)/h[i];
yy+=(y[i+1]-M[i+1]*h[i]*h[i]/6)*(x-a[i])/h[i];
}
}
return yy;
}
void main()
{
cout<<" 输入插值点数目的n:";
cin>>n;cout<<endl;
double *aa,*yy,df,ddf;
aa=new double[n+1];yy=new double[n+1];
cout<<"输入叉值节点:"<<endl;
for(int i=0;i<=n;i++)
cin>>aa[i];
cout<<"输入叉值节点函数值:"<<endl;
for(int j=0;j<=n;j++)
cin>>yy[j];
cout<<"输入两端点函数导数值:"<<endl;
cin>>df>>ddf;
double x;
x=yangtiao(aa,yy,df,ddf,5.5);
cout<<"输入所求函数值为:"<<x<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -