📄 分段线性插值.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 + -