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

📄 yangtiao.cpp

📁 计算方法算法中的样条插值
💻 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 + -