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

📄 ma_ndf.cpp

📁 牛顿向前插值法
💻 CPP
字号:
#include<iostream.h>
#include<math.h>
double DataX[50];//存放输入的数据
double DataY[50];
double X[50];  //存放整理后的数据
double Y[50];
double factor(int m);    //--------------求阶乘的函数声明
double delt(int i,int j);//--------------求差分的函数声明
void main()
{
	double s,x,t,D,Dt;
	int n,i,num1,num2;
	char k;
	cout<<"请输入X数据的个数:";
    cin>>num1;
	for(int c=1;c<=num1;c++)//------------数据输入
	{
		cout<<"X"<<c<<"=";
		cin>>DataX[c];
		cout<<"Y"<<c<<"=";
		cin>>DataY[c];
	}
star: cout<<"请输入x:"; //x可以是在表的范围内的任意数
	  cin>>x;
//------------------------------------------------------------------对数据进行整理
	  if(DataX[1]<DataX[num1])//-------X是从小到大排列的情况
	  {
		  if((x>=DataX[1])&&(x<=DataX[num1]))
		  {
			  for(i=1;i<=num1;i++)//找x在表中的位置
			  {
				  if(DataX[i]>x) break;
			  }
		  }
		  else
		  {  cout<<"你输入的X不在表的范围之内。请重新输入X"<<endl;goto star;
		  }
	  }
	  if(DataX[1]>DataX[num1])//-------X是从大到小排列的情况
	  {
		  if((x<=DataX[1])&&(x>=DataX[num1]))
		  {
			  for(i=1;i<=num1;i++)//找x在表中的位置
			  {
				  if(DataX[i]<x) break;
			  }
		  }
		  else
		  {  cout<<"你输入的X不在表的范围之内。请重新输入X"<<endl;goto star;
		  }
	  }
	  if(i<=(((double)num1/2)+1))       //如果x在表的前半段
	  {
		  num2=num1-i+2;
		  for(int c=1;c<=num2;c++)//将x的前一个数截取为表头
		  {
			  X[c]=DataX[i+c-2];
			  Y[c]=DataY[i+c-2];
		  }	
	  }
	  else if(i>(((double)num1/2)+1))               //如果x在表的后半段
	  {
		  num2=i;
		  for(int c=1;c<=num2;c++)//将数据倒置并将x的前一个数截取为表头
		  {
			  X[c]=DataX[i-c+1];
			  Y[c]=DataY[i-c+1];
		  }	
	  }//------------------------------------------------------------------------
      //**************************************************牛顿向前插值法
	  t=(x-X[1])/(X[2]-X[1]);
	  s=Y[1]; D=1;
	  for(n=1;n<num2;n++)
	  {
		  Dt=t;
		  for(int i=2;i<=n;i++)
		  {Dt=Dt*(t-i+1);}	
		  D=(Dt/factor(n))*delt(n,1);
		  s=s+D;
		  if((fabs(D))<=0.0001)//精确到0.0001退出循环
		  {D=0.0001;break;} 	
	  }//*************************************************牛顿向前插值法

	  cout<<"结果:f("<<x<<")="<<s<<"       精确到:"<<fabs(D)<<endl;
	  cout<<"是否继续算下一个值?Y/N";
	  cin>>k;
	  if(k!='n') goto star;       //k=n时退出程序	  
}

double factor(int m)    //--------------求m的阶乘
{ 
	if(m==0)
	return 1;
	return m*factor(m-1);	
}
double delt(int i,int j) //-------------求i阶差分
{     
	if(i==1)
	return (Y[j+1]-Y[j]);
    return delt(i-1,j+1)-delt(i-1,j);	
}

⌨️ 快捷键说明

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