考察分段线性插值

合集下载

ami插值法第三讲(分段线性与Hermite插值)

ami插值法第三讲(分段线性与Hermite插值)
则Hermite插值多项式为 插值多项式为
H i ( x j ) = 0 ( i , j = 0,1, , n) h' i ( x j ) = 0 ( i , j = 0,1, , n)
H ( x) =
∑ [h ( x ) y
n i=0 i
i
+ H i ( x ) y'i ]
从而可设 :
hi ( x ) = [a + b( x x i )] [l i ( x )]
2
这里l 为拉格朗日插值基函数 这里 i(x)为拉格朗日插值基函数
把 hi ( x i ) = 1 h' i ( x i ) = 0 ( i = 0,1, , n) 代入得
a = 1; b = 2 l ' i ( x i )
从而有 :
同理可得
hi ( x ) = [1 2( x x i )l i ' ( x i )] [l i ( x )]
i ( x )是线性函数
则称 是 上的分段线性插值多项式。 则称(x)是f(x)在[a ,b]上的分段线性插值多项式。 在 上的分段线性插值多项式
二、分段线性插值多项式的构造
分段表达式
x x i +1 x xi ( x) = yi + y i +1 ( x i ≤ x ≤ x i +1 ) x i x i +1 x i +1 x i
第2章插值 章
第4节
Hermite插值
一、 Hermite插值的基本思路
插值问题的一般要求:
( xi ) = yi
( i = 0 ,1, 2 ,... n )
插值问题的较高要求:
(1 ) (2)

3.3分段插值

3.3分段插值
7 8 9 10 11 12 13 14 15 16 17 18 x T/0C 10 11 13 17 22 25 29 31 30 22 25 27
根据表中数据可绘制线性插值函数的图形
35 30 25 20 15 10 6 8 10 12 14 16 18
由于节点增多时,分段函数表达式过于繁琐, 由于节点增多时,分段函数表达式过于繁琐, 因此引入基函数的方法。 因此引入基函数的方法。将分段函数表示成基 函数的组合形式。 函数的组合形式。
x − xi−1 x − xi f ( x) ≈ yi + yi−1 xi − xi−1 xi−1 − xi
(3-6)
分段线性插值公式P(x) 分段线性插值公式
x − x1 x − x0 y0 + y1 x0 − x1 x1 − x0 x − x1 x − x2 y1 + y2 P( x) = x1 − x2 x2 − x1 L L L x− x x − xn−1 n yn−1 + yn xn−1 − xn xn − xn−1 x ∈[ x0 , x1 ) x ∈[ x1, x2 ) x ∈[ xn−1, xn ]
例:设被插值函数
f (x) =1 (1+ 25x ),
2
−1≤ x ≤1
取等矩节点 xi = −1+ 2i / n(i = 0,1 L n) ,作 , , 拉格朗日插值多项式 Ln (x)。 当 n =10时,函数 y = f (x) 及插值多项式 L (x) 10 的图形如3-2所示 由图可见,在区间[-0.2,0.2] 所示。 的图形如 所示。由图可见,在区间 , 但在区间[-1, 两端则 上 L (x) 比较接近 f (x) ,但在区间 ,1]两端则 10 误差很大。 增大时, 误差很大。当 n 增大时,部分区间上插值多项 式截断误差偏大的现象更重。这种现象称龙格现 式截断误差偏大的现象更重。这种现象称龙格现 象。

分段线性插值

分段线性插值

分段线性插值分段线性插值是一种在机器学习、数学、信号处理等领域中广泛应用的方法。

分段线性插值的主要目的是为漏洞、持续时间等数据展示提供更好的视觉效果,同时也可以使数据更容易进行处理。

在分段线性插值中,每一段数据都可以看作是一条直线段。

通过在相邻数据点之间插入一条直线来实现插值。

每个数据点或任意数段可以称为一个插值区间,插值区间内部的数据点都采用一条直线进行插值,直线的斜率由插值区间上下数据点构成。

例如:在一个区间(x1,y1)和(x2,y2)之间进行插值,其中x1<x<x2。

那么,我们可以使用线性公式y = mx + b来估计数据点的y值。

方程中m是插值区间的斜率,通过公式m = (y2-y1)/(x2-x1)计算。

而b是在插值区间x1和x2之间的截距,通过公式b = y1 - m x1计算。

最后,我们就可以通过已知的数据点,估计同一段中任意点的y值。

下面我们通过一个实例来进一步解释分段线性插值的应用。

比如我们有一组工作时间数据如下:|年份| 工作时间 ||----|----|| 2010 | 6.5 || 2011 | 7.0 || 2013 | 7.5 || 2015 | 8.0 |目前,我们需要在2012年估计工作时间。

首先,我们需要找到分段线性插值的区间。

2012年的数据点在2011年和2013年之间。

因此,我们可以使用2011年和2013年之间的数据点进行插值。

然后,通过计算斜率来确定m和b的值。

斜率可以通过公式m = (y2-y1)/(x2-x1)来计算。

2011年和2013年的工作时间分别是7.0和7.5,年份分别是2011和2013。

因此,斜率为:(7.5-7.0)/(2013年-2011年)= 0.25/2 = 0.125插值区间的y截距b可以通过公式b = y1 - m x1来计算。

这使得我们可以计算出截距:接下来,我们就可以使用斜率和截距来计算2012年的工作时间,这将是我们所需的数据点的估计值:y = mx + b= 0.125 * 2012 + 258.375= 259.875。

计算方法 1.3 分段线性插值

计算方法 1.3 分段线性插值
易知, S1 ( x )为是一条折线函数,在每个小区间 [xi , xi1 ] 上可表示为:
x x x x i 1 i ˆ S ( x ) y y , x x x 1 i i 1 i i 1 x x x x i i 1 i 1 i 于是, S1 ( x ) 是在 [ a , b ] 上是连续函数。
x [xj , xj ] 1 x [xj, xj 1] 其他
2)在插值节点 x 0 上,插值基为:
2 ( x x ) l ( x ) x [ x ,x ] 0 0 0 1 B ( x ) 0 0 其他 3)在插值节点 x n 上,插值基为:
2 ( x x ) l ( x ) n n B ( x ) n 0
1
左,右连接起来!
x
j1
xj
x
j1
2 2 H ( x ) 1 2 l ( x ) l ( x ) y 1 2 l ( x ) l ( x ) y 3 j 1 j j j j 1 j 1 2 2 ( x x ) l ( x ) y ( x x ) l ( x ) y j j j j 1j 1 j 1
k axb
提示:类似于前面的误差估计。 几点说明:
1)只要节点间距充分小,插值法总能获得所要求的精度。 2)局部性。如果修改某个数据,则插值曲线仅在某个局部范围内受影响。
插值节点 x 上,取值为 0 .即 k,k j 1 lj (x k ) 0 k j k j
2 )在每个小区间 [x 上,插值基 lj (x )都是线性函数 . i, x i 1]
基于以上两方面,我们观察
1
右 左
x
j1

分段线性插值

分段线性插值

页眉内容《数值分析》课程设计分段线性插值 牛彦坡陈彬冯梦雨指导教师 天津工程师范学院课程设计任考察分段线性插值、课程设计工作日自2009 年6月22 日至2009 年6月28 日三、课程设计任务要求(包括课题来源、类型、目的和意义、基本要求、参考资料等):来源与意义:本课题来源于教材第二章插值法,目的是从几何意义掌握分段线性插值的思 想,加深对其的理解以及掌握用计算机与Matlab 解决相关问题的能力。

基本要求:要求自编程序;掌握编程思想,学会一门编程语言;报告要有较强的理论分析;有较强说服力的数据表或图像;对结果进行分析;给出相应结论;鼓励创新;参考资料:1. 数值分析,李庆扬,王能超,易大义,2001,清华大学出版社(第四版)。

2. 数值方法,关治,陆金甫,2006,清华大学出版社。

3. 数值分析与实验学习指导,蔡大用,2001,清华大学出版社。

理学 数学0702 班 学生 牛彦坡 陈彬 冯梦雨课程设计课题:郭阁阳、同组学生:牛彦坡 陈彬 冯梦雨4. 数值分析与实验,薛毅,2005,北京工业大学出版社。

教研室主任签字:天津工程师范学院程设计评审表数学0702 班 学生牛彦坡陈彬冯梦雨 设计任务完成情况及指导教师评语答辩情况教研室主任:日期:指导教师签字: 理学评定成绩成绩:指导教师签字: 日期:主任签字:日期:问题提出:考察分段线性插值:对f(x) 丄在(-5,5)上进行分段线性插值,取不同节点个数 n ,得到不同1 x分段线性插值函数。

(要求:自编程序,报告有数据表、图像、分析、结论。

)虽然matlab 里有直接分段线形插值的函数,但为了对分段插值算法有更明确的理解,编写该程序是有必要的需要解决的问题:1、由已知数据节点编写分段线形插值函数,从而能由所编函数得到非节点的函 数值。

2、比较用不同节点数所得插值函数与真实函数的误差,从而得出节点数与插值 效果的关系二、理论基础所谓分段线性插值就是通过插值点用折线段连接起来逼近 f (X )。

分段线性插值法

分段线性插值法

《数值分析》实验报告实验序号:实验五 实验名称: 分段线性插值法1、 实验目的:随着插值节点的增加,插值多项式的插值多项式的次数也增加,而对于高次的插值容易带来剧烈的震荡,带来数值的不稳定(Runge 现象)。

为了既要增加插值的节点,减小插值的区间,以便更好的逼近插值函数,又要不增加插值多项式的次数以减少误差,可采用分段线性插值。

2、 实验内容:求一个函数ϕ(x )用来近似函数f (x ),用分段线性插值的方法来求解近似函数ϕ(x )并画出近似函数图像及原函数图像。

设在区间[a,b]上,给定n+1个插值节点b x x x x a n =<<<<=...210与相应的函数值n y y y ,...,,10,求一个插值函数)(x ϕ,满足以下条件:(1)),...,2,1,0()(n j y x j j ==ϕ; (2) )(x ϕ在每一个小区间[1,+j j x x ]上就是线性函数。

对于给定函数11-,2511)(2≤≤+=x x x f 。

在区间[]11-,上画出f (x )与分段线性插值函数)(x ϕ的函数图像。

1. 分段线性插值的算法思想:分段线性插值需要在每个插值节点上构造分段线性插值基函数)(x l j ,然后再作它们的线性组合。

分段线性插值基函数的特点就是在对应的插值节点上函数值取 1,其它节点上函数值取0。

插值基函数如下:⎪⎩⎪⎨⎧≤≤--=其它 ,0,)(101010x x x x x x x x l ⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧≤<--≤≤--=+++---其它 ,0,,)(111111j j j j j j j j j j j x x x x x x x x x x x x x x x l⎪⎩⎪⎨⎧≤≤--=---其它 ,0,)(111n n n n n n x x x x x x x x l设在节点a≤x0<x1<…≤b=f(xi),(i=0,1,2,…,n)求折线函数L(x)满足:(1)L(x)∈C[a,b](2)L(x[i]=y[i])(3)L(x)在每个小区间(x[i],x[i+1])上就是线性插值函数¢(x)叫做区间[a,b]上对数据(x[j],y[j])(j=0,1,2,…,n)的分段区间函数。

计算方法分段线性_三次样条插值

计算方法分段线性_三次样条插值

计算方法分段线性_三次样条插值分段线性和三次样条插值是两种常用的插值方法,在数值分析和插值问题中广泛使用。

1.分段线性插值分段线性插值是一种简单直观的插值方法,将插值区间划分为若干个子区间,在每个子区间上用线性函数进行插值。

假设给定的插值节点有n+1 个,节点为 (x0, y0), (x1, y1), ..., (xn, yn),并且满足 x0 <x1 < ... < xn。

则对于任意 xx 使得 x 在 [xi, xi+1] 之间,可以通过线性插值得到其函数值 yy,即:yy = yi + (xx - xi) * (yi+1 - yi) / (xi+1 - xi)分段线性插值方法简单易懂,适用于一些较简单的插值问题。

但是由于插值函数在节点之间是线性的,可能不能准确地反映出数据的特征,因此不适用于一些需要高精度的插值问题。

三次样条插值是一种更复杂、更精确的插值方法,将插值区间划分为若干个子区间,在每个子区间上用三次多项式进行插值。

三次样条插值方法的基本思想是找到一组三次多项式,满足在每个子区间内插值点的函数值和一阶导数值相等,并且两个相邻多项式在节点处的二阶导数值也相等。

具体的求解步骤如下:(1) 假设有 n+1 个插值节点 (x0, y0), (x1, y1), ..., (xn, yn),构造 n 个三次多项式,即每个多项式在 [xi, xi+1] 之间插值。

(2) 对每个子区间内的多项式进行插值,设第 i 个子区间的多项式为 Si(x) = ai + bi(x-xi) + ci(x-xi)^2 + di(x-xi)^3、将插值节点的函数值和一阶导数值代入多项式中,可以得到 n 个线性方程,利用这 n 个线性方程可以求解出 n 个子区间的系数。

(3)由于n个子区间的多项式必须在节点处一阶导数值相等,因此再设立n-1个方程,利用这些方程可以求解出n-1个子区间的二阶导数值。

(4)将求解得到的系数和二阶导数值代入每个子区间的多项式中,得到完整的三次样条插值函数。

分段线性插值

分段线性插值

问题的背景在代数插值中,为了提高插值多项是对函数的逼近程度常常增加节点的个数,即提高多项式的次数,但这样做往往不能达到预想的效果。

例如:函数如果在区间[-5,5]上取11个等距节点:x k=-5+k (k=0,1,2,...,10),由lagrange插值公式可得到f(x)的10次L10(x)。

如图所示:L(x)仅在10区间的中部能较好的逼近函数f(x),位差异较大,而且越接近端点,逼近效果越差。

可以证明,当节点无限加密时,L(x)也只n能在很小的范围内收敛,这一现象称为Runge现象。

它表明通过增加节点来提高逼近程度是不适宜的,因而不采用高次多项式插值。

1. 分段线性插值问题的提出问题给定区间[a,b], 将其分割成a=x0 <x1<…<x n =b,已知函数y= f(x)在这些插值结点的函数值为y k =f(x k)(k=0,1,…,n)求一个分段函数I h(x),使其满足:(1) I h(x k )=y k,(k=0,1,…,n) ;(2) 在每个区间[x k ,x k+1 ]上,I h (x)是个一次函数。

易知,I h(x)是个折线函数, 在每个区间[x k ,x k+1 ]上,(k=0,1,…,n)于是, I h (x)在[a,b]上是连续的,但其一阶导数是不连续的。

一、分段线性函数的基函数我们从整体上来构造分段线性函数的基函数。

每个插值结点上所对应的插值基函数l i(x)应当满足:(1)l i(x)是分段线性函数;对于i=0,其它点上,l0(x)=0;对于i=1,2,…,n-1,其它点上,l i(x)=0;对于i=n,其它点上,ln(x)=0.于是,此表达式与前面的表达式是相同的,这是因为在区间[xk ,xk+1]上,只有lk (x),lk+1(x)是非零的,其它基函数均为零。

即I h (x)= yklk(x) + yk+1lk+1(x).例已知函数在区间[0,5]上取等距插值节点(如下表),求区间上分段线性插值函数,并利用它求出f(4.5)近似值。

1-3分段线性插值解析

1-3分段线性插值解析

1 x 0.8
分段线性插值多项式的构造 所以f(-0.96) (-0.96)=0.04253 (2)插值节点为xi=-1+ ih (i=0,1,…,n),h=(b-a)/2=2/n
由分段线性插值的余项估计: |f(x)- (x) |=|R(x)| ≤Mh2/8
f ( x ) 50 x (1 25 x 2 ) 2
内容小结
内容小结
1. 分段线性插值法;
2. 分段线性插值多项式的构造.
命令格式
1. 插值多项式 命令InterpolatingPolynomial求一个多项式,使给定的数 据是准确的函数值,其调用格式如下: InterpolatingPolynomial[{f1,f2,…},x] 2,3,…时的函数值为f1,f2,…。 当自变量x为1,
75 x 2 1 | f ( x ) | 50 | | 1 2 3 (1 25 x ) M max f ( x ) R( x ) 0.125h2 10 4
段线性插值多项式的构造
分段二次插值即:选取跟节点 x最近的三个节点 xi-1,xi, xi+1 进行二次插值 , 即在区间 [xi-1, xi+1] , 取:
h2 R( x ) f ( x ) ( x ) M, 8 其中h max ( xi 1 xi ), M max f ( x )
0 i n 1 a xb
分段线性插值多项式的构造
证明:由Lagrange 余项公式,当x∈[xi, xi+1]时
f ( )( x xi )( x xi 1 ) f ( x ) ( x ) R( x ) 2!
x x , x i 1 x x i i 1 i x xi 1 li ( x ) , x i x x i 1 xi xi 1 0 其它

分段线性插值法求插值-Read

分段线性插值法求插值-Read

分段线性插值法求插值摘要本文根据题目的要求,利用分段线性插值法对采样点和样本值进行插值计算。

为了更好的评断模型的优化性,我们同时采用了最近点插值,3次多项式插值和3次样条插值法来处理同样的问题,作为分段线性插值方法的参考模型。

根据插值函数计算区间内任意取样点的函数值。

最后再利用所得函数值画出相应的函数图象,并与原函数g(x)的图象进行对比。

通过对本题四个问题的解答,并观察对比函数图象我们得到了如下两个重要的结论:(1)在同一取样点,利用不同的插值方法可能会得到不同的函数值,所得函数值与原函数的标准函数值的误差大小决定了该插值方法的“好坏”。

而最优化的插值方法往往依赖于被插值函数。

本题中,在函数式g(x)对应X,Y的条件下,可以根据对比函数图象明显看出:分段线性插值方法和3次多项式插值方法优于3次样条插值和最近点插值。

(2)在插值计算中,取样点的多少往往会影响所得插值函数优化程度。

一般情况下,取样点越多所得插值函数越优化,对应的函数值与标准函数值越接近。

通过对本题四个问题相应对比函数图象的观察,我们也明显看出:在区间[-6 6]内,当取样点为21,41时,分段线性插值法进行插值计算得到的函数图象基本上与原函数g(x)吻合。

AbstractIn this article ,we use piecewise linear interpolation to compute the sampling point and sample value according to the request of question. In order to judge the model's quality in a better way, we use nearest interpolation, cubic interpolation and spline interpolation regarded as the model reference of piecewise linear interpolation to deal the question in the same way at the same time. Then draw the function picture by function value of any sampling point in the interval of interpolating function. Finally, we make a comparison between the original function g(x) image and the interpolating function image.At the base of analysing the final result and comparing the constrastive image . We can summarize two items of important conclusion as follows:(1)At the same sampling point , different interpolating method canobtain different function value. Usually , the optimizationalgorithm depends on the size of error between the objectfunction value .(2) When processing interpolating compute , the number of thesampling point will make an effect on the quality of a model.Commonly, the more multitudinous the sampling points wereused ,the more precise the interpolation model will be .目录一.问题的重述 (1)二.问题的分析 (1)三.问题的假设 (1)四.分段线性插值原理 (2)五.问题的求解 (2)六.插值方法的优劣性分析 (5)附录 (6)一.问题的重述已知211)(xx g +=,66≤≤-x 用分段线性插值法求插值,绘出插值结果图形,并观察插值误差。

分段线性插值

分段线性插值

考察函数
f
(x)
1 1 x2
,
5 x5
右图给出了 P5 (x) 和 P10 (x) 的图像,当n 增大时, Pn (x) 在两端 会发出激烈的振荡
,这就是所谓龙格现
象。该现象表明,在
大范围内使用高次
插值,逼近的效果往
往是不理想的
-5
y f(x)
P5(x) 0
P10(x) 5x
另外,从舍入误差来看,高次插值误差的传播 也较为严重,在一个节点上产生的舍入误差会在计 算中不断扩大,并传播到其它节点上。因此,次数 太高的高次插值多项式并不实用,因为节点数增加 时,计算量增大了,但插值函数的精度并未提高。 为克服在区间上进行高次插值所造成的龙格现象, 采用分段插值的方法,将插值区间分成若干个小的 区间,在每个小区间进行线性插值,然后相互连接 ,用连接相邻节点的折线逼近被插函数,这种把插 值区间分段的方法就是分段线性插值法。
f
(xk
)
x xk xk1
f (xk1 )
( xk x xk1 )
在几何上就是用折线
y
y=f(x)
替代曲线,如右图所示
若用插值基函数表示,
则在a,b上
0
x0
x1
x2
xn x
n
S(x) li (x) f (xi ) ( a x b)
i0
其中
x
xi
xi1 xi1
,
xi1 x xi
上有误差估计式
f (x) S(x) hi2 max f (x) 8 xi x xi1
其中 hi xi1 xi
例5.19 已知f(x)在四个节点上的函数值如下表所示
x i 30 45 60 90

分段线性插值

分段线性插值

1.4分段插值 一.分段线性插值即用折线代替曲线。

设f (x )连续 优点:计算简单,适用于光滑性要求不高的插值问题。

缺点:分段插值函数只能保证连续性,失去了原函数的光滑性。

二.分段三次(Hermite )插值不少实际插值问题不仅要求函数值相等,而且还要求导数值也相等。

这就导致下面的Hermite 插值。

并满足: 从而由此条件可得: 类似可得的表达式。

下面是matlab 函数pieceline (x ,y ,u )实现分段线性插值多项式的计算。

function v=pline(x,y,u) delta=diff(y)./diff(x); n=length(x); k=ones(size(u)); for j=2:n-1k(x(j)<=u)=j; ends=u-x(k);v=y(k)+s.*delta(k);在每个区间 上,用1阶多项式 (直线) 逼近 f (x):],[1+i i x x 11111)()(++++--+--=≈i ii ii i i i y x x x x y x x x x x P x f ],[for 1+∈i i x x x 记 易证:当 ||max 1i i x x h -=+0→h )()(1x f x P h →一致给定000,...,;,...,;,...,,n n n x x y y y y ''在 上利用两端点的 y 及 y' 构造3次Hermite 函数。

],[1+i i x x 31111()()()()()i i i i i i i i S x y x y x y x y x ααββ++++=+++''3311'331 1.(), (),(), ()i i i i i i i i S x y S x y S x y S x y ++++===='''1111111111111()1, ()0, ()0, ()0,()0, ()1, ()0, ()0,()0, ()0, ()1, ()0,()0, ()i i i i i i i i i i i i i i i i i i i i i i i i i i i i x x x x x x x x x x x x x x ααββααββααββαα+++++++++++++==============''''''1110, ()0, () 1.i i i i x x ββ+++==''1111122()12,2()().i i i i i i i i i i ii x x x x x x x x x x x x x x x x αβ+++++--⎛⎫⎛⎫=+ ⎪ ⎪--⎝⎭⎝⎭-⎛⎫=- ⎪-⎝⎭程序中,pline是分段线性插值函数;输入参数x——给定的数据点的横坐标所组成的向量Y——给定的数据点的纵坐标所组成的向量U——需要计算的点所组成的向量输出参数v——u所对应的分段线性插值多项式的值,即v(i)=s1(u(i)),其中s1是未来满足分段线性插值多项式Detla是计算差商的最后计算s、v。

分段线性插值法

分段线性插值法

(1) ; (x j ) y j ( j 0,1,2,..., n)
(2) (x) 在每一个小区间[ xj, xj1 ]上是线性函
2
数值分析实验报告
数。
对于给定函数 f (x) 1 ,-1 x 1。在区间-1,1上 1 25x2
画出 f(x)和分段线性插值函数(x) 的函数图像。 1. 分段线性插值的算法思想:
// Center icon in client rectangle
int
cxIcon
=
GetSystemMetrics(SM_CXICON);
int
cyIcon
=
GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
14
数值分析实验报告
// Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } }
// The system calls this to obtain the cursor to display while the user drags
: CDialog(CLDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CLDlg)
// NOTE: the ClassWizard will add member initialization here

数值分析常用的插值方法

数值分析常用的插值方法

数值分析常用的插值方法数值分析中常用的插值方法有线性插值、拉格朗日插值、分段线性插值、Newton插值、Hermite插值、样条插值等。

下面将对这些插值方法进行详细介绍。

一、线性插值(linear interpolation)线性插值是最简单的插值方法之一、假设已知函数在两个点上的函数值,通过这两个点之间的直线来估计中间点的函数值。

线性插值公式为:f(x)=f(x0)+(x-x0)*(f(x1)-f(x0))/(x1-x0)其中,f(x)表示要求的插值点的函数值,f(x0)和f(x1)是已知的两个点上的函数值,x0和x1是已知的两个点的横坐标。

二、拉格朗日插值(Lagrange interpolation)拉格朗日插值是一种基于多项式的插值方法。

它通过多个已知点的函数值构造一个多项式,并利用这个多项式来估计其他点的函数值。

拉格朗日插值多项式的一般形式为:f(x) = Σ[f(xi) * Li(x)] (i=0,1,2,...,n)其中,f(x)表示要求的插值点的函数值,f(xi)是已知的多个点的函数值,Li(x)是拉格朗日基函数。

拉格朗日基函数的表达式为:Li(x) = Π[(x-xj)/(xi-xj)] (i≠j,i,j=0,1,2,...,n)三、分段线性插值(piecewise linear interpolation)分段线性插值是一种逐段线性近似函数的方法。

通过将整个插值区间分成多个小段,在每个小段上使用线性插值来估计函数的值。

分段线性插值的过程分为两步:首先确定要插值的点所在的小段,在小段上进行线性插值来估计函数值。

四、Newton插值(Newton interpolation)Newton插值也是一种基于多项式的插值方法。

利用差商的概念来构造插值多项式。

Newton插值多项式的一般形式为:f(x)=f(x0)+(x-x0)*f[x0,x1]+(x-x0)*(x-x1)*f[x0,x1,x2]+...其中,f(x)表示要求的插值点的函数值,f(x0)是已知的一个点的函数值,f[xi,xi+1,...,xi+k]是k阶差商。

计算方法1.3分段线性插值

计算方法1.3分段线性插值
计算方法1.3分段线 性插值
目录
• 引言 • 分段线性插值的基本原理 • 分段线性插值的构造方法
目录
• 分段线性插值的应用举例 • 分段线性插值的优缺点及改进方法 • 总结与展望
01
引言
目的和背景
数值计算中,插值是一种通过已知数 据点来估算未知数据点的方法。
分段线性插值作为一种常用的插值方 法,具有计算简单、易于实现等优点, 在实际问题中得到了广泛应用。
在许多实际问题中,函数关系往往是未知的 ,或者虽然知道函数关系但难以用解析式表 达,此时可以通过插值法来近似地表示函数 关系。
插值的概念和分类
插值的概念
在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数 据点。
插值的分类
根据插值函数的形式和构造方法的不同,插值可分为多项式插值、分段插值、 样条插值、三角插值等。其中,分段线性插值是一种简单而常用的插值方法。
每个子区间上的插值函数只与该 区间上的节点有关,因此局部数 据的改变不会影响整个插值函数。
易于实现
分段线性插值的算法相对简单, 易于编程实现,且对计算机资源 要求不高。
分段线性插值的缺点
插值精度有限
由于分段线性插值在每个子区间上都是线性的,因此对于非线性程 度较高的函数,插值精度可能较低。
不光滑
在节点处,分段线性插值函数的一阶导数可能不连续,导致插值曲 线不够光滑。
科学计算与仿真
在科学计算和仿真领域,高维分段线性插值可以作为数值 计算的基本工具之一,用于求解高维偏微分方程和其他复 杂数学问题。
05
分段线性插值的优缺点及 改进方法
分段线性插值的优点
计算简单
分段线性插值相比于其他插值方 法,如多项式插值或样条插值, 计算更为简单,不涉及复杂的数 学运算。

分段线性插值法

分段线性插值法

《数值分析》实验报告 实验序号:实验五 实验名称: 分段线性插值法1、 实验目的:随着插值节点的增加,插值多项式的插值多项式的次数也增加,而对于高次的插值容易带来剧烈的震荡,带来数值的不稳定(Runge 现象)。

为了既要增加插值的节点,减小插值的区间,以便更好的逼近插值函数,又要不增加插值多项式的次数以减少误差,可采用分段线性插值。

2、 实验内容:求一个函数ϕ(x )用来近似函数f (x ),用分段线性插值的方法来求解近似函数ϕ(x )并画出近似函数图像及原函数图像。

设在区间[a,b]上,给定n+1个插值节点b x x x x a n =<<<<=...210和相应的函数值n y y y ,...,,10,求一个插值函数)(x ϕ,满足以下条件:(1)),...,2,1,0()(n j y x j j ==ϕ; (2) )(x ϕ在每一个小区间[1,+j j x x ]上是线性函数。

对于给定函数11-,2511)(2≤≤+=x x x f 。

在区间[]11-,上画出f (x )和分段线性插值函数)(x ϕ的函数图像。

1. 分段线性插值的算法思想:分段线性插值需要在每个插值节点上构造分段线性插值基函数)(x l j ,然后再作它们的线性组合。

分段线性插值基函数的特点是在对应的插值节点上函数值取 1,其它节点上函数值取0。

插值基函数如下:设在节点a ≤x0<x1<…≤b=f(xi),(i=0,1,2,…,n)求折线函数L (x )满足:(1) L(x )∈C[a,b](2) L(x[i]=y[i])(3) L(x)在每个小区间(x[i],x[i+1])上是线性插值函数¢(x )叫做区间[a,b]上对数据(x[j],y[j])(j=0,1,2,…,n)的分段区间函数。

利用一介拉格朗日函数,直接得到线性插值函数为:L(x0)=(x-x[1])/x[0]-x[1];(x[0]≤x ≤x[1])L(x0)=0(x[1]≤x ≤x[n])分段线性方程的表达式:¢(x )=∑(j=0,..,n)y[j]*L[j](x);3、实验代码:// LDlg.cpp : implementation file//#include "stdafx.h"#include "L.h"#include "LDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog{public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL// Implementationprotected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT}void CAboutDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CLDlg dialogCLDlg::CLDlg(CWnd* pParent /*=NULL*/): CDialog(CLDlg::IDD, pParent){//{{AFX_DATA_INIT(CLDlg)// NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CLDlg::DoDataExchange(CDataExchange* pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CLDlg)// NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CLDlg, CDialog)//{{AFX_MSG_MAP(CLDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_LARGRI, OnLargri)ON_BN_CLICKED(IDC_BUTTON2, OnButton2)ON_BN_CLICKED(IDC_HERMITE, OnHermite)//}}AFX_MSG_MAPEND_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CLDlg message handlersBOOL CLDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herereturn TRUE; // return TRUE unless you set the focus to a control}void CLDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework.void CLDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags // the minimized window.HCURSOR CLDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CLDlg::OnOK(){int x00=300,y00=350,i,j;double x;CDC *pDC=GetDC();pDC->SetMapMode(MM_LOMETRIC);pDC->SetViewportOrg(x00,y00);//画坐标轴与原函数for(i=-700; i<=700; i++){pDC->SetPixel(i,0,RGB(0,0,0));pDC->SetPixel(0,i,RGB(0,0,0));}for(x=-1; x<=1; x+=0.001){double j=400.0/(1+25*x*x);pDC->SetPixel(x*500,j,RGB(255,0,0));}pDC->TextOut(-30,-10,"0");pDC->TextOut(-30,430,"1");pDC->TextOut(490,-10,"1");pDC->TextOut(-490,-10,"-1");pDC->MoveTo(-10,680); //x箭头pDC->LineTo(0,700);pDC->MoveTo(0,700);pDC->LineTo(10,680);pDC->MoveTo(680,10); //y箭头pDC->LineTo(700,0);pDC->MoveTo(700,0);pDC->LineTo(680,-10);pDC->TextOut(-30,700,"y");pDC->TextOut(700,-10,"x");}void CLDlg::OnLargri(){int x00=300,y00=350,i,j;double x;CDC *pDC=GetDC();pDC->SetMapMode(MM_LOMETRIC);pDC->SetViewportOrg(x00,y00);//画坐标轴for(i=-700; i<=700; i++){pDC->SetPixel(i,0,RGB(0,0,0));pDC->SetPixel(0,i,RGB(0,0,0));}double yx[]={-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1};pDC->TextOut(-30,-10,"0");pDC->TextOut(-30,430,"1");pDC->TextOut(490,-10,"1");pDC->TextOut(-490,-10,"-1");pDC->MoveTo(-10,680); //x箭头pDC->LineTo(0,700);pDC->MoveTo(0,700);pDC->LineTo(10,680);pDC->MoveTo(680,10); //y箭头pDC->LineTo(700,0);pDC->MoveTo(700,0);pDC->LineTo(680,-10);pDC->TextOut(-30,700,"y");pDC->TextOut(700,-10,"x");// 拉格朗日差值的函数double yy[12],lx[12],ly[12];double l_fenzi[12],l_fenmu[12];double l_x,l_y;for(i=0; i<=10; i++){yy[i]=1.0/(1+25*yx[i]*yx[i]);}for(i=0; i<=10; i++){l_fenmu[i]=1.0;for(j=0; j<=10; j++){if(i!=j)l_fenmu[i]=l_fenmu[i]*(yx[i]-yx[j]);}}double qq,pp;for(qq=-1; qq<=1; qq+=0.0003){for(i=0; i<=10; i++){l_fenzi[i]=1.0;for(j=0; j<=10; j++){if(i!=j)l_fenzi[i]=l_fenzi[i]*(qq-yx[j]);}}pp=0;for(i=0; i<=11; i++){pp=pp+1.0/(1+25*yx[i]*yx[i])*l_fenzi[i]/l_fenmu[i];}pDC->SetPixel(qq*500,pp*390+5,RGB(132,112,225));}}void CLDlg::OnButton2(){int x00=300,y00=350,i,j;double x;CDC *pDC=GetDC();pDC->SetMapMode(MM_LOMETRIC);pDC->SetViewportOrg(x00,y00);//画坐标轴与原函数for(i=-700; i<=700; i++){pDC->SetPixel(i,0,RGB(0,0,0));pDC->SetPixel(0,i,RGB(0,0,0));}double yx[]={-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1};double yy[14];for(i=0; i<=10; i++){yy[i]=1.0/(1+25*yx[i]*yx[i]);}pDC->TextOut(-30,-10,"0");pDC->TextOut(-30,430,"1");pDC->TextOut(490,-10,"1");pDC->TextOut(-490,-10,"-1");pDC->MoveTo(-10,680); //x箭头pDC->LineTo(0,700);pDC->MoveTo(0,700);pDC->LineTo(10,680);pDC->MoveTo(680,10); //y箭头pDC->LineTo(700,0);pDC->MoveTo(700,0);pDC->LineTo(680,-10);pDC->TextOut(-30,700,"y");pDC->TextOut(700,-10,"x");// 线性分段差值的图像CPen pen;CPen*oldpen;pen.CreatePen(PS_SOLID,5,RGB(0,0,0));oldpen=pDC->SelectObject(&pen);for(i=0; i<10; i++){pDC->MoveTo(yx[i]*480,yy[i]*400);pDC->LineTo(yx[i+1]*480,yy[i+1]*400);}}void CLDlg::OnHermite(){int x00=300,y00=350,i,j;double x;CDC *pDC=GetDC();pDC->SetMapMode(MM_LOMETRIC);pDC->SetViewportOrg(x00,y00);//画坐标轴与原函数for(i=-700; i<=700; i++){pDC->SetPixel(i,0,RGB(0,0,0));pDC->SetPixel(0,i,RGB(0,0,0));}double yx[]={-1,-0.8,-0.6,-0.4,-0.2,0,0.2,0.4,0.6,0.8,1};double yy[12];for(i=0; i<=10; i++){yy[i]=1.0/(1+25*yx[i]*yx[i]);}pDC->TextOut(-30,-10,"0");pDC->TextOut(-30,430,"1");pDC->TextOut(490,-10,"1");pDC->TextOut(-490,-10,"-1");pDC->MoveTo(-10,680); //x箭头pDC->LineTo(0,700);pDC->MoveTo(0,700);pDC->LineTo(10,680);pDC->MoveTo(680,10); //y箭头pDC->LineTo(700,0);pDC->MoveTo(700,0);pDC->LineTo(680,-10);pDC->TextOut(-30,700,"y");pDC->TextOut(700,-10,"x");//分段三次Hermite差值的函数double x0,x1,yd1,yd0,y1,y0;for(i=0; i<10; i++){x0=yx[i],x1=yx[i+1];y0=1.0/(1+25*x0*x0);y1=1.0/(1+25*x1*x1);yd0=-(50*x0)*1.0/((1+25*x0*x0)*(1+25*x0*x0));yd1=-(50*x1)*1.0/((1+25*x1*x1)*(1+25*x1*x1));for(double qq=x0; qq<x1; qq+=0.005){double pp= y0*(1+2*(qq-x0)/(x1-x0)) * (qq-x1)/(x0-x1) * (qq-x1)/(x0-x1)+y1*(1+2*(qq-x1)/(x0-x1)) * (qq-x0)/(x1-x0) * (qq-x0)/(x1-x0)+yd0*(qq-x0) * (qq-x1)/(x0-x1) * (qq-x1)/(x0-x1)+yd1*(qq-x1) * (qq-x0)/(x1-x0) * (qq-x0)/(x1-x0);pDC->SetPixel(qq*500,pp*400,RGB(225,185,15));}}}4.实验截图5.实验结果分析:分析:分段线性插值的方法克服了Lagrange插值法当节点不断加密时,构造的插值多项式的次数不断升高,高次多项式虽然是连续的,但是不一定都收敛到相应的被插函数而产生Runge现象。

数值分析实验五(分段线性插值)

数值分析实验五(分段线性插值)

《数值分析》实验报告实验编号:实验五课题名称:分段线性插值一、算法介绍给定的函数为f(x)=1/(1+25x*x),-1<=x<=1,将给定区间分成10分,得到11个节点:x[0],x[1],...,x[10],对于[x[0],x[1]]区间上,插值基函数L[0]=(x-x[1])/(x[0]-x[1]),其他区间上为零。

对于[x[i-1],x[i]]区间上,插值基函数L[i] = (x-x[i-1])/(x[i]-x[j-1])。

对于(x[i],x[i+1]]上,插值基函数L[i] = (x-x[i+1])/(x[i]-x[i+1]),其中i=1,2,...,10。

对于(x[n-1],x[n]]区间上,L[i] = (x-x[10])/(x[9]-x[10]),其他区间上为零。

构造得到的多项式g(x)=∑f(x[i])*l[i],其中i=0,1,2, (10)二、程序代码// testView.cpp : implementation of the CTestView class//#include "stdafx.h"#include "test.h"#include "testDoc.h"#include "testView.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CTestViewIMPLEMENT_DYNCREATE(CTestView, CView)BEGIN_MESSAGE_MAP(CTestView, CView)//{{AFX_MSG_MAP(CTestView)// NOTE - the ClassWizard will add and remove mapping macros here.// DO NOT EDIT what you see in these blocks of generated code!//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CTestView construction/destructionCTestView::CTestView(){// TODO: add construction code here}CTestView::~CTestView(){}BOOL CTestView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////////////////// CTestView drawingvoid CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereint i,j,k;double x,y,p_x,p_y,l,xx[100],f[100],F[100],sum,p_sum;CPen MyPen,*OldPen;pDC->SetViewportOrg(400,400); //定义坐标原点for(i=-500;i<500;i++){pDC->SetPixel(0,i,RGB(0,0,0));pDC->SetPixel(i,0,RGB(0,0,0)); //画出坐标}pDC->TextOut(-210,5,"-1");pDC->TextOut(196,5,"1");//原函数MyPen.CreatePen(PS_SOLID,1,RGB(255,0,0));//定义画笔颜色OldPen=pDC->SelectObject(&MyPen);x=-1.0,y=1/(1+25*x*x);p_x=x*200;p_y=-y*200;pDC->MoveTo(p_x,p_y);for (x=-1.0;x<=1.0;x+=0.0001){y=1/(1+25*x*x);p_x=x*200;p_y=-y*200;pDC->LineTo(p_x,p_y);}pDC->SelectObject(OldPen);MyPen.DeleteObject();//分段线性插值MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));OldPen=pDC->SelectObject(&MyPen);x=-1.0,y=1/(1+25*x*x);p_x=x*200,p_y=-y*200;pDC->MoveTo(p_x,p_y);for(k=0;k<=10000;k++){for(i=0;i<=10;i++){if(x==xx[i]){sum=f[i];break;}if(x<xx[i+1] && x>=xx[i]){sum=(x-xx[i+1])/(xx[i]-xx[i+1])*f[i];sum+=(x-xx[i])/(xx[i+1]-xx[i])*f[i+1];break;}}p_x=x*200;p_y=-sum*200;pDC->LineTo(p_x,p_y);x+=0.0002;}pDC->SelectObject(OldPen);MyPen.DeleteObject();}/////////////////////////////////////////////////////////////////////////////// CTestView printingBOOL CTestView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: add extra initialization before printing}void CTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////////////////// CTestView diagnostics#ifdef _DEBUGvoid CTestView::AssertValid() const{CView::AssertValid();}void CTestView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CTestDoc* CTestView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestDoc)));return (CTestDoc*)m_pDocument;}#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////// CTestView message handlers三、运算结果截屏红色的曲线为原函数图像,蓝色曲线为分段线性插值曲线四、算法分析分段线性插值的实质是用多段等分区间的折线去逼近曲线,上述图像中蓝色的曲线为分段线性插值多项式所对应的图像,由图像可看出在节点处都产生了尖点,说明分段线性插值多项式在各节点两边插值函数的导数不相等,是跳跃的间断点,所以不能形成光滑的图像。

分段线性插值

分段线性插值

分段线性插值来源与意义:本课题来源于教材第二章插值法,目的是从几何意义掌握分段线性插值的思想,加深对其的理解以及掌握用计算机与Matlab 解决相关问题的能力。

基本要求:要求自编程序;掌握编程思想,学会一门编程语言;报告要有较强的理论分析;有较强说服力的数据表或图像;对结果进行分析;给出相应结论;鼓励创新;一、 问题提出:考察分段线性插值: 对21()1f x x=+在(-5,5)上进行分段线性插值,取不同节点个数n ,得到不同分段线性插值函数。

(要求:自编程序,报告有数据表、图像、分析、结论。

) 虽然matlab 里有直接分段线形插值的函数,但为了对分段插值算法有更明确的理解,编写该程序是有必要的 需要解决的问题:1、由已知数据节点编写分段线形插值函数,从而能由所编函数得到非节点的函数值。

2、比较用不同节点数所得插值函数与真实函数的误差,从而得出节点数与插值效果的关系二、理论基础所谓分段线性插值就是通过插值点用折线段连接起来逼近f (x )。

设已知节点a=x 0<x 1<…<x n =b 上的函数值f 0,f 1,…,f n ,求一折线函数满足:1o],,[)(b a C x I h ∈2o k h f x I =)( ),,1,0(n k =,3o)(x I h 在每个小区间[x k ,x k+1]上是线性函数。

则称)(x I h 为分段线性插值函数。

模型一:由定义可知)(x I h 在每个小区间[x k ,x k+1]上可表示为)(x I h =1111++++--+--k kk k k k k k f x x x x f x x x x)(1+≤≤k k x x x模型二:首先确定间隔序列k ,使得:1+≤≤k k x x x第二个量是局部变量s ,其定义为 :kx x s -=最后一个量是一阶均差kk k k k x x y y --=++11δ则插值基函数可表示为kk k k k k x x y y x x y x L ---+=++11)()(kk s y δ+=.三、实验内容1、模型一: 用MATLAB 分别建立m 文件:(1)原函数fd1.m(2)分段线性插值函数fd2.m(3)比较不同节点数所得分段线性插值函数的插值效果fd3.m2、选取插值节点数为偶数在MATLAB 窗口中执行:fd3 n=2的数据见附录,图像如下:-5-4-3-2-1012345xy原函数(实线)-插值函数(虚线)-5-4-3-2-1012345-1-0.5xR (x )误差分析n=8的图如下:-5-4-3-2-1012345xy原函数(实线)-插值函数(虚线)-5-4-3-2-1012345-0.4-0.200.20.4xR (x )误差分析n=20的图-5-4-3-2-1012345xy原函数(实线)-插值函数(虚线)-5-4-3-2-112345-0.1-0.0500.050.1xR (x )误差分析3、模型二:用MATLAB 分别建立m 文件:(1)分段插值函数fd22(2)插值效果比较函数fd32(选取插值节点数为奇数) 程序代码(参见附录)在MATLAB 窗口中执行:fd32得下图:上图为不同节点数插值函数图像与原函数图像,下图为误差图像-5-4-3-2-1012345-5-4-3-2-10123453、由上所有的图可看出,由于原函数是偶函数,等距节点所得插值函数有很强对称性,下任取节点,编写程序fd33.m,得图上图为不同节点数插值函数图像与原函数图像,下图为误差图像-5-4-3-2-11234500.20.40.60.81-5-4-3-2-1012345-1-0.50.54、比较不同节点所得插值函数与被插函数误差的平方和,程序模板为d1.m 得下图:红星由fd32得奇数节点误差平方和,绿星加圈由fd3得偶数节点误差平方和,圈由f33得随机节点误差平方和,数据见附录20406080100120140n 节点数e 误差平方和四、结果分析1、不同插值节点数所得的分段线形插值函数,在节点处与原函数的函数值一定相同2、所得的分段线形插值函数在原函数斜率绝对值变化大的地方,与原函数的误差比较大3、由误差平方和e,插值节点个数越多,e有减小的趋势,最后趋于0。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数值分析》课程设计
题目考察分段线性插值
学生黄立健丁威程发林
指导教师郭阁阳
天津工程师范学院
课程设计任务书
数理系数学班学生黄立健丁威程发林
课程设计课题:
考察分段线性插值
一、课程设计工作日自 2009 年 6 月 22 日至 2009 年 6 月 28 日
二、同组学生:黄立健丁威程发林
三、课程设计任务要求(包括课题来源、类型、目的和意义、基本要求、完成时
间、主要参考资料等):
【来源与意义】
本课题来源于教材第二章插值法,目的是从几何意义掌握分段线性插值的思想,加深对其的理解以及掌握用计算机与Matlab解决相关问题的能力。

【基本要求】
要求自编程序;掌握编程思想,学会一门编程语言;报告要有较强的理论分析;有较强说服力的数据表或图像;对结果进行分析;给出相应结论;鼓励创新;
【参考资料】
1.数值分析,李庆扬,王能超,易大义,2001,清华大学出版社(第四版)。

2.数值方法,关治,陆金甫,2006,清华大学出版社。

3.数值分析与实验学习指导,蔡大用,2001,清华大学出版社。

4.数值分析与实验,薛毅,2005,北京工业大学出版社。

指导教师签字:教研室主任签字:
天津工程师范学院
课程设计评审表系班学生
一、 问题提出:
题目:对2
1
()1f x x
=
+在【-5,5】上进行分段线性插值,取不同节点个数n ,得到不同分段线性插值函数。

(要求:自编程序,报告有数据表、图像、分析、结论。


二、 理论基础:
通过学习构造插值公式的方法,以及分析了它们的余项知道了在实际应用插值函数作近似计算时,我们总是希望插值公式余项的绝对值小一些,即使得逼近的精度良好。

从插值公式余项表达式()n
R x 看,似乎提高插值多项式的次数便可达到
目的,但实际上会产生一称为Runge 现象的畸形现象,如下图所示:
从上图易知:Lagrange 插值多项式只在区间【-3.63,3.63】内收敛。

因此我们通过构造分段线性插值的方法(在每个小区间上采用一次Lagrange 插值)来消除Runge 现象。

下面我们构造分段线性插值函数:
易知 在每个子区间 上是一次插值多项式
分段线性插值的余项:
其中:
1[,](0,1,)i i x x i n +=()x ϕ11111(),i i
i i i i i i i i
x x x x x y y x x x x x x x ϕ+++++--=+≤≤--2
()()()8Mh f x x R x ϕ-=≤
max ''()
a x b
M f x ≤≤=
三、 实验内容:
1、分段插值:
先对【-5,5】进行不同的等分,并分别求出节点数为n=3,5,7,9时的插值情况,用plot 函数画图观察函数的逼近情况,如下所示:
X 轴
Y 轴
2、 误差分析:
本题中我们采取的是求解分段内中点的函数值与差值函数值的差值d 的均值ave ,通过改变节点数n ,比较在xi=-5:5这些点处的误差值,并描绘出节点数从3至20时的误差均值图像:


均 值
节点数i
2468101214161820
四、结果分析:
1、分段线性插值实行时,节点加密误差变小,且插值函数只依赖于本
段的节点值,计算误差基本不扩大、稳定。

2、在节点处的插值函数不可微,光滑度不够。

3、插值函数在节点处的值与同原函数值一致。

五、结论:
运用分段线性插值的方法进行插值时,插值节点选取越是密集,则构造的插值函数越逼近原函数。

六、参考文献:
1、《数值分析》汪卉琴,刘目楼编著冶金工业出版社;
2、《数值分析》,李庆扬,王能超,易大义,清华大学出版社(第四版)
3、《数值分析与实验》,薛毅,2005,北京工业大学出版社。

附录:
1、程序:
%已知函数‘fun’
》function y=fun(x)
y=1./(1+x.^2);
%分段线性插值函数
》function f=inter1(x,y,xi)
n=length(x);
m=length(xi);
for j=1:m
for i=1:n-1
if xi(j)>=x(i)&xi(j)<=x(i+1)
f(j)=y(i)+(xi(j)-x(i))*((y(i+1)-y(i))/(x(i+1)-x(i)));
end
end
end
%分段内中点的函数值与插值函数值的差值均值;
》function [d,ave]=dif(x,xi)
n=length(xi);
y=fun(x);
s=0;
for i=1:n-1
d(i)=(fun((xi(i)+xi(i+1))./2)-inter1(x,y,(xi(i)+xi(i+1))./2));
s=s+d(i);
end
ave=abs(s/(n-1));
%描绘出节点数从3至20时的误差均值图像
》function ave2=dp(xi)
ave=[];j=[];
for i=3:20
x=linspace(-5,5,i);
[d,ave(i-2)]=dif(x,xi);
end
j=[3:20];
plot(j,ave,'r-o');
ave2=ave
%运行过程及结果:
>> xi=-5:5
xi =
-5 -4 -3 -2 -1 0 1 2 3 4 5 >> x=linspace(-5,5,3)
x =
-5 0 5
>> y=fun(x)
y =
0.0385 1.0000 0.0385
>> fplot('fun',[-5,5])
>> hold on
>> plot(x,y,'ro-')
>> x=linspace(-5,5,5)
x =
-5.0000 -2.5000 0 2.5000 5.0000
>> y=fun(x)
y =
0.0385 0.1379 1.0000 0.1379 0.0385
>> plot(x,y,'go-')
>> x=linspace(-5,5,7)
x =
-5.0000 -3.3333 -1.6667 0 1.6667 3.3333 5.0000
>> y=fun(x)
y =
0.0385 0.0826 0.2647 1.0000 0.2647 0.0826 0.0385
>> plot(x,y,'yo-')
>> x=linspace(-5,5,9)
x =
-5.0000 -3.7500 -2.5000 -1.2500 0 1.2500 2.5000 3.7500 5.0000
>> y=fun(x)
y =
0.0385 0.0664 0.1379 0.3902 1.0000 0.3902 0.1379 0.0664 0.0385
>> plot(x,y,'mo-')
2、误差均值数据表:。

相关文档
最新文档