📄 yangtiao.cpp
字号:
#include<iostream.h>
void yangtiao(int n,double * x,double * y,double xx);
void main()
{
int n=0,i=0;
double xx;
cout<<"分区个数(n):";
cin>>n;
double * x=new double[n+1];
double * y=new double[n+1];
cout<<"输入插值节点x:";
for(i=0;i<=n;i++)cin>>x[i];
cout<<"输入插值节点y:";
for(i=0;i<=n;i++)cin>>y[i];
cout<<"输入所求x:";
cin>>xx;
yangtiao(n,x,y,xx);
yangtiao(n,x,y,xx);
}
void yangtiao(int n,double * x,double * y,double xx)
{
int i=0,sign;
double * h=new double[n];
for(i=0;i<n;i++)h[i]=x[i+1]-x[i];
double * alpha=new double[n+1];
double * belta=new double[n+1];
double * m=new double[n+2];
cout<<"选择插值条件1或2:";
cin>>sign;
if(sign<=1)
{
cout<<"输入m[0],m[n]:";
cin>>m[0]>>m[n];
alpha[0]=0;belta[0]=2*m[0];
alpha[n]=1;belta[n]=2*m[n];
}
else
{
alpha[0]=1;belta[0]=3*(y[1]-y[0])/h[0];
alpha[n]=0;belta[n]=3*(y[n]-y[n-1])/h[n-1];
}
for(i=1;i<n;i++)
{
alpha[i]=h[i-1]/(h[i-1]+h[i]);
belta[i]=3*((1-alpha[i])*(y[i]-y[i-1])/h[i-1]+alpha[i]*(y[i+1]-y[i])/h[i]);
}
double * a=new double[n+1];
double * b=new double[n+1];
a[0]=-alpha[0]/2;b[0]=belta[0]/2;
for(i=1;i<=n;i++)
{
a[i]=-alpha[i]/(2+(1-alpha[i])*a[i-1]);
b[i]=(belta[i]-(1-alpha[i])*b[i-1])/(2+(1-alpha[i])*a[i-1]);
}
m[n+1]=0;
for(i=n;i>=0;i--)
m[i]=a[i]*m[i+1]+b[i];
i=0;
while(xx>x[i]&&i<n)i++;
if(i==n)
{
cout<<"超出范围!"<<endl;
return;
}
i--;
double s=0;
s=(1+2*(xx-x[i])/(x[i+1]-x[i]))*((xx-x[i+1])/(x[i]-x[i+1]))*((xx-x[i+1])/(x[i]-x[i+1]))*y[i]+
(1+2*(xx-x[i+1])/(x[i]-x[i+1]))*((xx-x[i])/(x[i+1]-x[i]))*((xx-x[i])/(x[i+1]-x[i]))*y[i+1]+
(xx-x[i])*((xx-x[i+1])/(x[i]-x[i+1]))*((xx-x[i+1])/(x[i]-x[i+1]))*m[i]+
(xx-x[i+1])*((xx-x[i])/(x[i+1]-x[i]))*((xx-x[i])/(x[i+1]-x[i]))*m[i+1];
cout<<"结果是:"<<s<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -