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

📄 分段线性插值.cpp

📁 数值分析中的分段线性插值问题
💻 CPP
字号:
// 分段线性插值.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream.h"
#include "math.h"

  double li(double x0,double h,int n,double y[],double t)
  { 
	int i,j,k,m;
    double z,s,xi,xj;
    z=0.0;
    if (n<1) return(z);		//节点个数不正确,返回
    if (n==1)	//若只有一个节点,取值返回
	{ 
		z=y[0]; 
		return(z);
	}
    if (n==2)	//若只有两个节点,插值后返回
    { 
		z=(y[1]*(t-x0)-y[0]*(t-x0-h))/h;
        return(z);
    }
    if (t<=x0+h)	//取最前面的三个点
	{ 
		k=0;
		m=2;
	}
    else if (t>=x0+(n-3)*h)		//取最后面的三个点
		{ 
			k=n-3; 
			m=n-1;
		}
		else
		{ 
			i=(int)((t-x0)/h)+1;
			if (fabs(t-x0-i*h)>=fabs(t-x0-(i-1)*h))
			{
				k=i-2; 
				m=i;
			}
			else 
			{
				k=i-1; 
				m=i+1;
			}
		}
    z=0.0;
    for (i=k;i<=m;i++)		//三点二次插值
      { 
		s=1.0;
		xi=x0+i*h;
        for (j=k;j<=m;j++)
          if (j!=i)
          { 
			  xj=x0+j*h;
			  s=s*(t-xj)/(xi-xj);
		  }
        z=z+s*y[i];
      }
    return(z);
  }


void main()			
  { 
	cout << "  *******************************************" << endl;
	cout << "  **                                       **" << endl;
	cout << "  **              分段线性插值             **" << endl;
	cout << "  **                                       **" << endl;
	cout << "  *******************************************" << endl << endl;
	
	double t;
	cout << "请输入区间[-5, 5]中的一个数:x=";
	cin >> t;
	
	if (t<-5||t>5)
	{
		cout << "您输入的x值不正确!" << endl;

	}
	else
	{ 
		double z,h=1.0;		//步长
		static double y[10];
		int i;
		for (i=0;i<11;i++)		//函数值	
		{
			double x=-5.0+h*i;
			y[i]=1/(1+x*x);
		}	
		z=li(-5.0,h,10,y,t);
		cout << "得到f(x)=1/(1+x^2)的近似值  f(x)≈" << z << endl;
	}
}

⌨️ 快捷键说明

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