⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 三次样条插值.cpp

📁 数值分析课程必备的算法:三次样条插值。有需要的同学下载
💻 CPP
字号:
	
#include<iostream.h>
#include<math.h>
void main()
{
	double XX;
	int n;
	cout<<"**************三次样条插值算法**************"<<endl;
	cout<<"请输入子区间的数目n:"<<endl;
	cin>>n;	

	double *x=new double[n+1],*y=new double[n+1],*h=new double[n+1];

	cout<<"请输入各节点值和函数值(以回车结束每一个输入):"<<endl;
	for(int i=0;i<=n;i++)
	{
		cout<<"x"<<i<<":\t";	cin>>x[i];
		cout<<"f(x"<<i<<"):\t";	cin>>y[i];
	}
	for(i=0;i<=n-1;i++)
	{
		h[i]=x[i+1]-x[i];
	}
	cout<<"请选择边界条件类型."<<endl;
	cout<<"第一种边界条件请按1,第二种边界条件请按2:"<<endl;
	int j;	double *m,*a,*b;
	m=new double[n+2];	a=new double[n+1];	b=new double[n+1];	
	while(cin>>j)
	{if(j==1){	cout<<"请输入边界条件左.右两端点的二阶导数值:"<<endl;
				cin>>m[0];	cin>>m[n];
				a[0]=0;b[0]=2*m[0];
				a[n]=1;b[n]=2*m[n];	break;}
	else{	if(j==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;}
			else{	cout<<"您的输入错误!请重新输入."<<endl;
					continue;}
		}
	}
	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 *A,*B;
	A=new double[n+1];	B=new double[n+1];
	A[0]=-a[0]/2;		B[0]=b[0]/2;

	for(i=1;i<=n;i++)
	{	A[i]=-a[i]/(2+(1-a[i])*A[i-1]);
		B[i]=(b[i]-(1-a[i])*B[i-1])/(2+(1-a[i])*A[i-1]);
	}
	m[n+1]=0;
	for(i=n;i>=0;i--)	{	m[i]=A[i]*m[i+1]+B[i];	}

	delete []A; delete []B;

	cout<<"请输入所要求的X的值:"<<endl;
	cin>>XX;
	for(i=0;(i<=n-1)&&(XX>=x[i]);i++);
	i--;

	double e,f,g;
	e=(XX-x[i])/(x[i+1]-x[i]);
	f=(XX-x[i+1])/(x[i]-x[i+1]);
	g=(1+2*e)*f*f*y[i]+(1+2*f)*e*e*y[i+1]+(XX-x[i])*f*f*m[i]+(XX-x[i+1])*e*e*m[i+1];
	cout<<"其近似值为f("<<XX<<")=s("<<XX<<")="<<g<<endl;

	delete []x;	delete []y;	delete []h;
	delete []m; delete []a; delete []b;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -