1-3分段线性插值
- 格式:ppt
- 大小:2.41 MB
- 文档页数:21


数值分析作业
姓名:虞驰程
题目:
函数:f(x)=11+x2在[-5,5]上,取n=10,对其进行分段线性插值和拉格朗日插值,在Matlab中实现且绘图。
Matlab实现:
首先定义函数f,在Matlab中用function.m文件编写,具体代码如图1所示:
图1 f(x)函数
定义分段线性插值的基本函数,用function.m文件编写,具体代码如图2所示:
图2 分段线性插值基本函数
定义拉格朗日插值的基本函数,用function.m文件编写,具体代码如图3所示:
图3 拉格朗日插值的基本函数
进行分段线性插值并绘图和原函数进行对比的Matlab实现代码如图4所示:
图4 分段线性插值函数绘制
其结果如图5所示,其中红色代表分段线性插值结果,蓝色代表原函数:
图5 分段线性插值和原函数对比
同理可以进行拉格朗日插值并绘图,其Matlab实现代码如图6所示,其结果如图7所示:
图6 拉格朗日插值函数绘制
图7 拉格朗日插值和原函数对比 最后我们可以将分段线性插值、拉格朗日插值和原函数进行对比,其实现代码如图8所示,最终结果如图9所示(黑色代表原函数,蓝色是分段线性插值,红色是拉格朗日插值):
图8 两种插值方法和原函数对比实现
图9 两种插值方法和原函数对比
C#分段线性插值函数
由于项⽬需要,需要将数据采集得到的点数转化为固定点数,使⽤分段线性插值其实现代码如下: ///
/// 分段线性插值,将⼀组数插值为所需点数
///
/// 待插值的数据数组
/// 插值点数
/// 插值后的数据数组
public static double[] Interpolation(double[] dataIn,int n)
{
double[] dataOut = new double[n];
int lenIn = dataIn.Length;
double[] a = new double[lenIn];
double[] divIn = new double[lenIn];
double[] divOut = new double[n];
divIn[0] = 0;
for (int i = 1; i < lenIn; i++)
{
divIn[i] = divIn[i - 1] + 1;
}
divOut[0] = 0;
for (int i = 1; i < n; i++)
{
divOut[i] = divOut[i - 1] + lenIn / Convert.ToDouble(n);
}
int k = 0;
for (int i = k; i < n; i++)
{
for (int j = 0; j < lenIn - 1; j++)
{
if (divOut[i] >= divIn[j] && divOut[i] < divIn[j + 1])
{
dataOut[i] = (dataIn[j + 1] - dataIn[j]) * (divOut[i] - divIn[j]) / (divIn[j + 1] - divIn[j]) + dataIn[j];
k = i;
}
}
}
return dataOut;
}
1 / 14
《数值分析》实验报告
实验序号:实验五 题目名称: 分段线性插值
学号: 姓名:
任课教师: 马季骕 专业班级:计算机科学与技术(非师范)
1、 实验目的:
设在区间[a,b]上,给定n+1个插值节点a=X0
(1)φ(x)=yj(j=0,1,2,…,n)
(2)φ(x)在每一个小区间[xj,yj+1]上是线性函数。
2、 算法分析:
分段线性插值的算法思想:
分段线性插值需要在每个插值节点上构造分段线性插值基函数 ,然后再作它们的线性组合。分段线性插值基函数的特点是在对应的插值节点上函数值取 1,其它节点上函数值取0。插值基函数如下:
有了基函数就可以直接写出分段线性插值函数的表达式 。
具体程序设计:
for(i=0;i<=20;i++) //选取节点
{
ax[i]=-1+((2/20.0)*i); //选取 上的21个对称的节点
ay[i]=1.0/(1+25*ax[i]*ax[i]);
}
x1=-1;
while(x1<=1)
{
m=0;
x1=x1+0.00001;
for(i=0;i<=20;i++) 2 / 14
{
if(i==0&&x1>=-1&&x1<=-0.9)
{
n=ay[0]*((x1-ax[1])/(ax[0]-ax[1])); //计算 并和相应的函数值组合
m=n+m;
}
else
{
if(x1>=ax[i-1]&&x1<=ax[i]) //计算 并和相应的函数值组合
{
n=ay[i]*((x1-ax[i-1])/(ax[i]-ax[i-1]));
1 实验报告
实验项目 插值法 实验日期 2016/9/30
理论内容 分段线性插值与三次样条插值 授课日期 2016/9/0
实验室名称 文理管203 微机编号 E1
实验目的及要求:
1、学会常用的插值方法,求函数的近似表达式,以解决其它实际问题;
2、明确插值多项式和分段插值多项式各自的优缺点;
3、熟悉插值方法的程序编制;如果绘出插值函数的曲线,观察其光滑性。
实验内容:
编写分段线性插值法及三次样条插值法通用子程序,依据数据表
ix 2.0 2.1 2.2 2.3 2.4
ix 1.414214 1.449138 1.483340 1.516575 1.549193
构造相应的插值多项式,并计算函数xxf)(在15.2x的近似值。
2 实验步骤及程序:
1、分段线性插值法流程图
是 否 是 输入xi,yi, i=1,⋯,n 及x
ia⟵1,ib⟵n
ib−ia>1?
im⟵ia+ib2的整数部分
xm<𝑥?
ia⟵im ib⟵im 执行求拉格朗日插值的程序,计算以ia,ib为节点的线性插值函数在插值点的函数值P1 x
输出p1(𝑥) 否
3 2、分段线性插值法源程序:
function [f] = fenduan(~,~,~,~)
x=[2.0 2.1 2.2 2.3 2.4];
y=[1.414214 1.449138 1.483340 1.516575 1.549193];
y_1=0.5*y.^(-0.5);
x0=2.15;
f = 0.0;
if(length(x) == length(y))
if(length(y) == length(y_1))
n = length(x);
else
disp('y和y的导数的维数不相等!');
return;
end
else
disp('x和y的维数不相等!');