2.7三次样条插值
详细讲解三次样条插值法及其实现方法61页PPT
39、没有不老的誓言,没有不变的承 诺,踏 上旅途 ,义无 反顾。 40、对时间的价值没有没有深切认识 的人, 决不会 坚韧勤 勉。
66、节制使快乐增加并使享受加强。 ——德 谟克利 特 67、今天应做的事没有做,明天再早也 是耽误 了。——裴斯 泰洛齐 68、决定一个人的一生,以及整个命运 的,只 是一瞬 之间。 ——歌 德 69、懒人无法享受休息之乐。——拉布 克 70、浪费时间是一桩大罪过。——卢梭
三次样条插值的方法和思路
三次样条插值的方法和思路摘要:1.三次样条插值的基本概念2.三次样条插值的数学原理3.三次样条插值的实现步骤4.三次样条插值的优缺点5.三次样条插值在实际应用中的案例正文:在日常的科学研究和工程应用中,我们经常会遇到需要对一组数据进行插值的问题。
插值方法有很多,其中三次样条插值是一种常见且有效的方法。
本文将从基本概念、数学原理、实现步骤、优缺点以及实际应用案例等方面,全面介绍三次样条插值的方法和思路。
一、三次样条插值的基本概念三次样条插值(Cubic Spline Interpolation)是一种基于分段多项式的插值方法。
它通过在各个节点上构建一条三次多项式曲线,使得这条曲线在节点之间满足插值条件,从而达到拟合数据的目的。
二、三次样条插值的数学原理三次样条插值的数学原理可以分为两个部分:一是分段三次多项式的构建,二是插值条件的满足。
1.分段三次多项式的构建假设有一组数据点序列为(x0,y0),(x1,y1),(x2,y2),(x3,y3),我们可以将这些数据点连接起来,构建一条分段三次多项式曲线。
分段三次多项式在每个子区间上都是一个三次多项式,它们之间通过节点值进行连接。
2.插值条件的满足为了使分段三次多项式在节点之间满足插值条件,我们需要在每个子区间上满足以下四个条件:(1)端点条件:三次多项式在区间的端点上分别等于节点值;(2)二阶导数条件:三次多项式在区间内的二阶导数等于节点间的斜率;(3)三阶导数条件:三次多项式在区间内的三阶导数等于节点间的曲率;(4)内部点条件:三次多项式在区间内部满足插值函数的连续性。
通过求解这四个条件,我们可以得到分段三次多项式的系数,从而实现插值。
三、三次样条插值的实现步骤1.确定插值节点:根据数据点的位置,选取合适的节点;2.构建分段三次多项式:根据节点值和插值条件,求解分段三次多项式的系数;3.计算插值结果:将待插值点的横坐标代入分段三次多项式,得到插值结果。
三次样条插值ppt
把以上各式由后向前代入,可得
Nn (x) f (x0) f [x0, x1](x x0) f [x0, x1, xn](x x0) (x xn1)
Rn (x) f (x) Nn (x) f [x, x0, x1, xn ](x x0) (x xn)
yi
n1 ( x) ( x xi )n' 1 ( xi )
(2)插值误差估计
定理2 设 f (n) (x) 在[a,b] 上连续,f (n1) (x)在 (a,b) 内存在, 节点 a x0 x1 xn b,Pn (x) 是拉格朗日插值多项 式,则对任意 x [a,b] , 插值余项
x4 f ( x4 ) f [x3, x4 ] f [x2 , x3 , x4 ] f [x1, x2, x3, x4 ] f [x0, x1, x2, x3, x4 ]
(2) Newton插值公式
由差约定义 x [a,b]
f (x) f (x0 ) f [x, x0 ](x x0 )
f [x, x0 ] f [x0, x1] f [x, x0, x1](x x1)
xn1] f [x1, x2 , x0 xn
xn ] n 阶差商
差商表
xk
f
(xk )
一阶 差商
二阶差商
三阶差商 四阶差商
x0 f (x0 )
x1 f (x1) f [x0, x1]
x2 f (x2 ) f [x1, x2 ] f [x0 , x1, x2 ]
x3 f (x3 ) f [x2, x3] f [x1, x2 , x3 ] f [x0, x1, x2, x3]
详细讲解三次样条插值法及其实现方法
样条函数的定义 定义4.1 设区间[a,b]上给定一个节点划分
a=x0<x1<……<xn-1<xn=b 如果存在正整数k使得[a,b]上的分段函数s(x)满足 如下两条: (1)在[a,b]上有直到k-1阶连续导数。 (2)在每个小区间[xi,xi+1]上是次数不大于k的多项式。 则称分段函数s(x)是以(2.6)为节点集的k次样条函数。
x xi i i 1 hi
) mi1hi
( ) xi1x
1 hi
x [xi , xi1], hi xi1 xi , i 0,1,, n 1
(x) (2x 1)( x 1)2,1(x) x(x 1)2 13
对Si (x)求二阶导数 ,并整理后得
Si( x)
6( xi
xi 1 hi3
2x)
因为分段三次Hermite插值多项式已经至少是一阶连续 可导了,为了让它成为三次样条函数只需确定节点处 的一阶导数使这些节点处的二阶导数连续即可!
S(xi 0) S(xi 0), i 1,, n 1
S(x)
y ( xxi i 0 hi
)
y ( ) m h ( xi1x i1 0 hi
( yn
yn 1 )
2 hn1
(mn1
2mn )
立即可得下式:
21
其中:
nm1 nmn1 2mn gn
n
h0
h0 hn1
, n
hn1 h0 hn1
1 n
gn
3 n
y1 y0 h0
n
yn
yn1 hn1
联合基本方程得一个广义三对角或周期三对角方程组:
2 1
1
1
2
三次样条插值算法详解
三次样条插值算法要求数据点数量较多,且在某些情况下可能存在数值不稳定性,如数据 点过多或数据点分布不均等情况。此外,该算法对于离散数据点的拟合效果可能不如其他 插值方法。
对未来研究的展望
01
02
03
改进算法稳定性
针对数值不稳定性问题, 未来研究可以探索改进算 法的数值稳定性,提高算 法的鲁棒性。
3
数据转换
对数据进行必要的转换,如标准化、归一化等, 以适应算法需求。
构建插值函数
确定插值节点
根据数据点确定插值节点,确保插值函数在节点处连续且光滑。
构造插值多项式
根据节点和数据点,构造三次多项式作为插值函数。
确定边界条件
根据实际情况确定插值函数的边界条件,如周期性、对称性等。
求解插值函数
求解线性方程组
06
结论
三次样条插值算法总结
适用性
三次样条插值算法适用于各种连续、光滑、可微的分段函数插值问题,尤其在处理具有复 杂变化趋势的数据时表现出色。
优点
该算法能够保证插值函数在分段连接处连续且具有二阶导数,从而在插值过程中保持数据 的平滑性和连续性。此外,三次样条插值算法具有简单、易实现的特点,且计算效率较高 。
根据数据点的数量和分布,合理分段,确保 拟合的精度和连续性。
求解线性方程组
使用高效的方法求解线性方程组,如高斯消 元法或迭代法。
结果输出
输出拟合得到的插值函数,以及相关的误差 分析和图表。
03
三次样条插值算法步骤
数据准备
1 2
数据收集
收集需要插值的原始数据点,确保数据准确可靠。
数据清洗
对数据进行预处理,如去除异常值、缺失值处理 等。
三次样条插值报告
三次样条插值多项式实验的目的及意义:为了取得理想结果:在不增加更多的插值条件下,能够求得一个插值多项式,既有良好的逼近效果,又有好的光滑性,引进三次样条插值 多项式。
如果已知函数y=f(x)在节点a=x0<x1<…<xn=b 处的函数值和导数值:()i i x f y =,i=0,1,2,…,n如果S(x)满足条件:1. S(x)是一个分段的三次多项式且()i i y x S =;2. S(x)在[a,b]具有二阶连续导数。
则称S(x)是三次样条插值函数。
S(x)的具体形式为:()()()()⎪⎪⎩⎪⎪⎨⎧∈∈∈=-]12,121,01,[,...............][,][,n n n x x x x s x x x x s x x x x s x s其中()x S i 在[]i i x x ,1-上是三次多项式()iiiiid x c x b x a x S +++=23由插值条件()ii y x S =,i=0,1,2,…,n ,得n+1个条件。
边界条件一:()()nn y x S y x S '',''00== 边界条件二:()()nn y x S y x S '''',''''00==数学公式:()()2211133[2]()[2()]()i i i i i i i i i i ih x x x x h x x x x H x y y h h ---+-----=++2211122()()()()i i i i i i i ix x x x x x x x m m h h -------+ 算法描述:Step1:输入未知数X 及(xi,yi),i=0,1,…,n ; Step2:计算步长H[i]; Step3:计算[][]()⎪⎪⎪⎩⎪⎪⎪⎨⎧+=-=+=-+++i i i i i i i ii i i i i x x f x x f u g u hh h ,,311111λλλStep4:根据边界条件,求解相应的方程得到m0,m1,…, mn Step5:判断X 属于[]i i x x ,1-,i=1,2,…,n 中的哪一个Step6:计算()x s y i i ≈Step7:输出y. 程序原代码如下: #include "stdio.h" #define N 5 void main() { int i,k; float X,s,y0,yn;float a[N][N+1],h[N],u[N],v[N],g[N],m[N],p[N],q[N],w[N];printf("please input X:"); //X 为未知数的大小scanf("%f",&X);printf("please input x:"); //输入x的大小for(i=0;i<N;i++)scanf("%f",&a[i][0]);printf("please input y:"); //输入y的大小for(i=0;i<N;i++)scanf("%f",&a[i][1]);for(i=1;i<N;i++)h[i]=a[i][0]-a[i-1][0]; //计算步长for(i=1;i<N;i++){v[i]=h[i+1]/(h[i]+h[i+1]);u[i]=1-v[i];g[i]=3*u[i]*(a[i+1][1]-a[i][1])/h[i+1]+3*v[i]*(a[i][1]-a[i-1][1])/h[i]; }printf("\t(1)已知边界条件1\n");printf("\t(2)已知边界条件2\n");printf("请选择边界条件序号:");scanf("%d",&k);if(k==1){printf("请输入y0和yn的一阶导:"); //输入边界条件一scanf("%f%f",&m[0],&m[N-1]);p[0]=0; //用追赶法求解m[N]q[0]=0;g[1]=g[1]-v[1]*m[0];g[N-2]=g[N-2]-u[N-2]*m[N-1];for(i=1;i<N;i++){w[i]=2-u[i]*p[i-1];p[i]=v[i]/w[i];q[i]=(g[i]-u[i]*q[i-1])/w[i];}m[N-2]=q[N-2];for(i=N-3;i>0;i--)m[i]=q[i]-p[i]*m[i+1];printf("输出m[i]的值:\n");for(i=0;i<N;i++)printf("%f\n",m[i]);for(i=1;i<N;i++) //计算最终结果if(X>a[i-1][0]&&X<a[i][0])s=(h[i]+2*(X-a[i-1][0]))*(X-a[i][0])*(X-a[i][0])*a[i-1][1]/(h[i]*h[i]*h[i]) +(h[i]-2*(X-a[i][0]))*(X-a[i-1][0])*(X-a[i-1][0])*a[i][1]/(h[i]*h[i]*h[i])+ (X-a[i-1][0])*(X-a[i][0])*(X-a[i][0])*m[i-1]/(h[i]*h[i])+(X-a[i-1][0])*(X-a[i-1][0])*(X-a[i][0])*m[i]/(h[i]*h[i]);printf("s(%f)=%f\n",X,s);}if(k==2){printf("请输入y0和yn的二阶导:"); //输入边界条件二scanf("%f%f",&y0,&yn);g[0]=3*(a[1][1]-a[0][1])/h[1]-h[1]*y0/2;g[N-1]=3*(a[N-1][1]-a[N-2][1])/h[N-1]+h[N-1]*yn/2;q[0]=g[0];u[0]=1;v[N-1]=1;w[0]=2;for(i=1;i<N;i++){w[i]=2-v[i]*u[i-1]/w[i-1];q[i]=g[i]-v[i]*q[i-1]/w[i-1];}m[N-1]=q[N-1]/w[N-1];for(i=N-2;i>=0;i--)m[i]=(q[i]-u[i]*m[i+1])/w[i];printf("输出m[i]的值:\n");for(i=0;i<N;i++)printf("%f\n",m[i]);for(i=1;i<N;i++)if(X>=a[i-1][0]&&X<=a[i][0])s=(h[i]+2*(X-a[i-1][0]))*(X-a[i][0])*(X-a[i][0])*a[i-1][1]/(h[i]*h[i]*h[i]) +(h[i]-2*(X-a[i][0]))*(X-a[i-1][0])*(X-a[i-1][0])*a[i][1]/(h[i]*h[i]*h[i])+ (X-a[i-1][0])*(X-a[i][0])*(X-a[i][0])*m[i-1]/(h[i]*h[i])+(X-a[i-1][0])*(X-a[i-1][0])*(X-a[i][0])*m[i]/(h[i]*h[i]);printf("s(%f)=%f\n",X,s);}}数值计算:已知y=f(x)的如下数值求三次样条插值函数S(x),满足条件1.s’(0)=0,s’(4)=482.s’’(0)=0,s’’(4)=24Please input X:2.5Please input x:0 1 2 3 4 Please input y:-8 -7 0 19 56(1)已知边界条件1(2)已知边界条件2请选择边界条件的序号:1请输入y0和yn的一阶导:0 48 0.0000003.00000012.00000027.00000048.000000s(2.500000)=7.625000press any key tocontinue请选择边界条件的序号:2请输入y0和yn的二阶导:0 24 -0.0000003.00000011.99999927.00000248.0000007.625000press any key tocontinue s(2.500000)=7.625000 对计算结果进行评价分析:()()443845h M x S x f ≤-三次样条插值函数与三次Hermite 插值函数相比,不仅光滑度有提高,而且要求求解时还不需要增加内节点处的导数值,因此比较实用。
-三次样条插值课件
Ai
1 hi
y i 1
1 6
M
h2
i1 i
,
Bi
1 hi
yi
1 6
M
i
hi2
将其代入(5.31)即得
第8页,共38页。
Si (x)
M i1
(xi x)3 6hi
Mi
(x xi1 )3 6hi
yi1
M i1 6
hi2
(xi hi
x)
yi
Mi 6
hi2
(x
xi1) hi
)
将
x0
1, x1
2, y0
1, y1
3, h1
1, M 0
0, M1
3 4
代入上式化简后得
S1 (x)
1 8
x3
3 8
x2
7 4
x
1
同理S(x)在 x1 , x2 上的表达式为
S2 (x)
1 8
x3
3 8
x2
7 4
x
1
第20页,共38页。
S(x)在 x2 , x3 上的表达式为
S3 (x)
S i( x)
M i1
xi x xi1 xi
Mi
x xi1 xi xi1
记 hi xi x,i1 则有
S i( x)
M i1
xi x hi
Mi
x xi1 hi
第7页,共38页。
连续两次积分得
Si (x)
M i1
(xi x)3 6hi
Mi
(x xi1 )3 6hi
Ai (xi
y0
M 0
h1 2
y1 y0 h1
h1 6
第二章三次样条插值
mk 1 2mk
hk 1 hk hk 1
k 1
3( hk yk1 yk hk1 yk yk1 )
hk hk 1
hk
hk hk 1
hk 1
k mk1 2mk k mk 1 gk
k
hk
hk hk 1
k
hk 1 hk hk 1
gk
3(k
yk yk 1 hk 1
根据S ( x)在[a, b]上二阶导数连续 在节点xj j (1, 2, , n 1)处就应满足连续性条件
S(x j 0) S(x j 0) S ' (x j 0) S '(x j 0) S"(x j 0) S"(x j 0)
共(n+1)+(3n-3)=4n-2个条件,因此还需要 两个条件才能确定S(x)
注:三次样条与分段 Hermite 插值的根本区别在于S(x)自 身光滑,不需要知道 f 的导数值(除了在2个端点可能需 要);而Hermite插值依赖于f 在所有插值点的导数值。
f(x)
H(x)
S(x)
要求出S(x),则在每个小区间上 [x j , x要j1确] 定4个 待定系数,共有n个小区间,所以应确定4n个参 数。
可在区间端点a,b上各加一个条件(边界条件), 具体要根据实际问题要求给定;
1. 已知两端的一阶导数值
S(x0 ) f0
S(xn ) fn
2. 两端的二阶导数已知
S(x0 ) f0 S"(xn ) fn
其特殊情况为
S(x0 ) S(xn ) 0
3. 当f(x)是xn x0为周期的周期函数时,则要求 S(x)也是周期函数,这时边界条件应满足:
三次样条插值法
三次样条插值法根据李庆阳的《数值分析》这本教材中的讲解编写的程序,使用的是第一边界条件,用追赶法求解了M矩阵。
为了调用方便,我将整个函数所有的信息构造成一个结构体,输入插值点的坐标和数量,定义边界条件后,将这个结构体的指针作为参数传给Spline3()函数,就完成了函数计算,计算结果也存储在该结构体中。
程序如下:/*=================================================================== ====*///=====================三次样条插值的函数S(x)实现=============================// 创建人:汪雅楠// 北京交通大学 QQ312818820// 说明:根据研究生教材《数值分析》(李庆杨)第51页~第56页编写/* 初始条件: 1. 已知两端的一阶导数值2. 已知两端的二阶导数值3. 周期样条函数### 此函数选择1条件 ###函数建立: 1. 设定样条函数S(x)的一阶导数为变量ki,用分段三次Hermitte差值2. 设定样条函数S(x)的二阶导数为变量Ki,用分段积分### 此函数选择2方法 ###矩阵求解:追赶法求解严格三对角占优矩阵{M},根据教材第195页编写*//*=================================================================== ====*/#include <stdio.h>///////////////////////////////////////////////////////////////////// ///////////#define MAXNUM 50 //定义样条数据区间个数最多为50个typedef struct SPLINE //定义样条结构体,用于存储一条样条的所有信息{ //初始化数据输入float x[MAXNUM+1]; //存储样条上的点的x坐标,最多51个点float y[MAXNUM+1]; //存储样条上的点的y坐标,最多51个点unsigned int point_num; //存储样条上的实际的点的个数float begin_k1; //开始点的一阶导数信息float end_k1; //终止点的一阶导数信息//float begin_k2; //开始点的二阶导数信息//float end_k2; //终止点的二阶导数信息//计算所得的样条函数S(x)float k1[MAXNUM+1]; //所有点的一阶导数信息float k2[MAXNUM+1]; //所有点的二阶导数信息//51个点之间有50个段,func[]存储每段的函数系数float a3[MAXNUM],a1[MAXNUM];float b3[MAXNUM],b1[MAXNUM];//分段函数的形式为Si(x) = a3[i] * {x(i+1) - x}^3 + a1[i] * {x(i+1) - x} +// b3[i] * {x - x(i)}^3 + b1[i] * {x - x(i)}//xi为x[i]的值,xi_1为x[i+1]的值}SPLINE,*pSPLINE;typedef int RESULT; //返回函数执行的结果状态,下面为具体的返回选项#ifndef TRUE#define TRUE 1#endif#ifndef FALSE#define FALSE -1#endif#ifndef NULL#define NULL 0#endif#ifndef ERR#define ERR -2#endif///////////////////////////////////////////////////////////////////// //////////////*=================================================================== ============*** 函数名称:Spline3()*** 功能说明:完成三次样条差值,其中使用追赶法求解M矩阵*** 入口参数:(pSPLINE)pLine 样条结构体指针pLine中的x[],y[],num,begin_k1,end_k1*** 出口参数:(pSPLINE)pLine 样条结构体指针pLine中的函数参数*** 返回参数:返回程序执行结果的状态TRUE or FALSE===================================================================== ===========*/RESULT Spline3(pSPLINE pLine){float H[MAXNUM] = {0}; //小区间的步长float Fi[MAXNUM] = {0}; //中间量float U[MAXNUM+1] = {0}; //中间量float A[MAXNUM+1] = {0}; //中间量float D[MAXNUM+1] = {0}; //中间量float M[MAXNUM+1] = {0}; //M矩阵float B[MAXNUM+1] = {0}; //追赶法中间量float Y[MAXNUM+1] = {0}; //追赶法中间变量int i = 0;////////////////////////////////////////计算中间参数if((pLine->point_num < 3) || (pLine->point_num > MAXNUM + 1)){return ERR; //输入数据点个数太少或太多}for(i = 0;i <= pLine->point_num - 2;i++){ //求H[i]H[i] = pLine->x[i+1] - pLine->x[i];Fi[i] = (pLine->y[i+1] - pLine->y[i]) / H[i]; //求F[x(i),x(i+1)] }for(i = 1;i <= pLine->point_num - 2;i++){ //求U[i]和A[i]和D[i]U[i] = H[i-1] / (H[i-1] + H[i]);A[i] = H[i] / (H[i-1] + H[i]);D[i] = 6 * (Fi[i] - Fi[i-1]) / (H[i-1] + H[i]);}//若边界条件为1号条件,则U[i] = 1;A[0] = 1;D[0] = 6 * (Fi[0] - pLine->begin_k1) / H[0];D[i] = 6 * (pLine->end_k1 - Fi[i-1]) / H[i-1];//若边界条件为2号条件,则//U[i] = 0;//A[0] = 0;//D[0] = 2 * begin_k2;//D[i] = 2 * end_k2;/////////////////////////////////////////追赶法求解M矩阵B[0] = A[0] / 2;for(i = 1;i <= pLine->point_num - 2;i++){B[i] = A[i] / (2 - U[i] * B[i-1]);}Y[0] = D[0] / 2;for(i = 1;i <= pLine->point_num - 1;i++){Y[i] = (D[i] - U[i] * Y[i-1]) / (2 - U[i] * B[i-1]);}M[pLine->point_num - 1] = Y[pLine->point_num - 1];for(i = pLine->point_num - 1;i > 0;i--){M[i-1] = Y[i-1] - B[i-1] * M[i];}//////////////////////////////////////////计算方程组最终结果for(i = 0;i <= pLine->point_num - 2;i++){pLine->a3[i] = M[i] / (6 * H[i]);pLine->a1[i] = (pLine->y[i] - M[i] * H[i] * H[i] / 6) / H[i];pLine->b3[i] = M[i+1] / (6 * H[i]);pLine->b1[i] = (pLine->y[i+1] - M[i+1] * H[i] * H[i] / 6) /H[i]; }return TRUE;}///////////////////////////////////////////////////////////////////// /////////////SPLINE line1;pSPLINE pLine1 = &line1;///////////////////////////////////////////////////////////////////// /////////////main(){line1.x[0] = 27.7;line1.x[1] = 28;line1.x[2] = 29;line1.x[3] = 30;line1.y[0] = 4.1;line1.y[1] = 4.3;line1.y[2] = 4.1;line1.y[3] = 3.0;line1.point_num = 4;line1.begin_k1 = 3.0;line1.end_k1 = -4.0;Spline3(pLine1);return 0;}///////////////////////////////////////////////////////////////////// /////////////。
2[1].7三次样条插值
即
lim S ( x ) = lim S ( x ) lim S ′ ( x) = lim S ′ ( x) = m lim S ′′( x) = lim S ′′ ( x) S ′( x ) = f ′ S ′( x ) = f ′ 或
将(13)式化为矩阵形式
2 λ2
µ1 λ3
2
µ2 λ4
2
µ3
2 O O O
λn − 2
λn − 1
O 2
m1 g 1 − λ1 f 0′ m2 g2 g3 m3 M = M M M µ n − 2 mn − 2 gn−2 2 mn − 1 g n − 1 − µ n − 1 f n′
共4 n − 2个条件
′ ′ lim S k′( x ) = lim S k′− 1 ( x ) + −
S k ( x )是[ xk , xk + 1 ]上的三次样条插值多项式, 应有4个待定的系数 即要确定S ( x )必须确定4n个待定的系数
少两个条件
并且我们不能只对插值函数在中间节点的状态进行限制 也要对插值多项式在两端点的状态加以要求 也就是所谓的边界条件: 第一类(一阶)边界条件: 第二类(二阶)边界条件 第三类(周期)边界条件
f(x) H(x) S(x)
二、三次样条插值多项式
a ≤ x0 , x1 ,L , xn ≤ b为区间[ a , b ]的一个分割 如果函数f ( x )在节点x0 , x1 ,L , xn处的函数值为
f ( x j ) = y j , j = 0 ,1,L , n 如果S ( x )是f ( x )的三次样条插值函数, 则其必满足
三次样条插值
由三次样条函数的定义,在每个[ xi , xi +1 ]上要确定 S( x) ∈ C 2[a, b] 三次样条函数的定义, 共有4个待定系数,需要 个条件!共有n个小区间 需4n个条件 共有 个待定系数,需要4个条件!共有 个小区间, 4n个条件! 个待定系数 个条件!
例如,对于第一种条件,可以导出以下两个方程
6 2 M 0 + M 1 = ( f [ x0 , x1 ] − f ′( x0 )) = d 0 h1 6 M n −1 + 2 M n = ( f ′( x n ) − f [ xn −1 , xn ]) = d n hn
可得以下线性代数方程组:
2 λ0 M0 d0 λ1 2 µ1 M1 d1 M = M O O O λn−1 2 µn−1 Mn−1 dn−1 λn 2 Mn dn
xi Mi
f ( x ) y i −1 f ′′( x ) M i −1
yi
f ′′( x ) M i −1
M i S i′′( x ) = M i −1l i −1 ( x ) + M i l i ( x )
由连接条件 Si′(−i x 0) = Si′+x(− ix− 0),i = 1 2Ln , xi x − 1 x i −1 Si′′( x) = M i −1 + Mi mn 由条件 xi − m 0 , m 1 ,xL xi −1 , m n + 1 i − 共n+1个未知数: xi −1 个未知数: 个未知数 上式可以写成关于n+1个未知数的 个线性方程组: 个未知数的n-1个线性方程组 上式可以写成关于 个未知数的 个线性方程组: xi , x x − xi −1 Si h , (i i 由补充的两个条件,恰好构成封闭线性方程组,1该方程组的特 由补充的两个条件− h恰好构成封闭线性方程组x−−1 ) = f ( xi −1 ) i+M M λi= a ii −11+ 2 M i + µ i, b i i += = ,d ii = i = 1 , 2 L = 1 −1 a i M i− M= n− 1 2 c h 点是:除了首末方程外, c mhi = d 点是:除了首末方程外,每个方程中只有三个未知数而且脚标 h i −(1x+) h i f ( x ) S = a m h+−ib m h+ i 1 + i
三次样条插值法
2m0 + m1 = 3 f [ x0 , x1 ] = g 0 ; mn −1 + 2mn = 3 f [ xn −1 , xn ] = g n .
于是,用矩阵形式表为
2 1 0 λ 2 µ 1 1 0 λ2 2 L L L 0 0 0 0 0 0
用
y j +1 − y j 1 1 = f [ x j , x j +1 ] ,上面方程可简化为 + 除全式,并注意 y j = f j , h j −1 h j hj
λ j m j +1 + 2m j + µ j m j +1 = g j
其中
( j = 1, 2, L , n − 1);
λj =
hj h j −1 + h j
( j = 0, 1, L , n) ,共有 4n − 2
,可根据实际 通常可在区间 [a, b] 端点 a = x0 , b = xn 上各加一个条件(称为边界条件) 问题的要求给定。常见的有以下三种: 1° 已知两端的一阶导数值,即
S ′( x0 ) = f 0′, S ′( xn ) = f n′ .
g1 − λ1 f 0′ g2 g3 = . M g n−2 g n −1 − µ n −1 f n′
如果边界条件为 S ′′( x0 ) = f 0 ,
''
S ′′( xn ) = f n′′ ,则得两个方程
h 2m0 + m1 = 3 f [ x0 , x1 ] − 0 f 0′′ = g 0 ; 2 m + 2m = 3 f [ x , x ] + hn −1 f ′′ = g . n −1 n n −1 n n n 2
三次样条插值算法详解
s3( s3(
x0 xn
) )
M0 Mn
0 0
7
第三类又称周期边界条件:
由区间端点处的函数值或导数值满足周期条件给出
s3 (x0 0) s3 (xn 0)
s3
(
x0
0)
s3 (xn
0)
s3(x0插值 问题就分成三类! 其实不止这三类!
8
样条函数的例子
x
j
),
j 1,,n 1
4
(1)因为s(x)在每个小区间上是一个次小于三次的多项式,故 有四个未知系数; (2)因为s(x)有n分段,从而共有4n个未知系数!
(3)但插值条件与样条条件仅给出4n-2个条件,无法定出4n个 未知系数,还差2个条件!这2个条件我们用边界条件给出!
5
通常我们对插值多项式在两端点的状态加以要求也就是 所谓的边界条件:
化为矩阵形式
17
2 1
2
2
2
m1 g1 1m0
m2
g2
3 2 3 4 2
m3
g3
n2 2 n2 mn2
gn2
n1 2 mn1 gn1 n1mn
这是一个严格对角占优的三对角方程组,
用追赶法可以求解!
18
第二类三次样条插值问题的方程组
分枝,进一步扩大了样条函数的应用范围。
1
样条函数的定义 定义4.1 设区间[a,b]上给定一个节点划分
a=x0<x1<……<xn-1<xn=b 如果存在正整数k使得[a,b]上的分段函数s(x)满足如下 两条: (1)在[a,b]上有直到k-1阶连续导数。 (2)在每个小区间[xi,xi+1]上是次数不大于k的多项式。 则称分段函数s(x)是以(2.6)为节点集的k次样条函数。
三次样条插值
三次样条插值
三次样条插值是插值运算的一种,它具有计算精度高、收敛性好以及曲线拟合准确等特点,是插值运算中最常用的插值方法之
三次样条插值是以曲线为基本元素,把离散点数据连接成一个曲线,并能够在曲线上求出任意点的函数值。
它通过拟合所有离散数据点,来求出一个连续曲线,从而解决了插值法的局限性。
三次样条插值的基本原理是:在离散点的两端,曲线的曲率是零,由此可以计算出曲线的系数,从而得到曲线的表达式,这样就可以得到曲线上任意点的函数值。
三次样条插值的优点在于计算精度高、收敛性好,可以很好地拟合离散数据,并且经过插值后得到的曲线更加平滑,其结果更加可靠。
由于它的优点,三次样条插值得到了广泛的应用,如在统计分析中,用于拟合离散数据;在机械工程中,用于优化加工轨迹;在号处理中,用于滤波等。
总之,三次样条插值是插值运算的一种,它的准确性高,拟合性好,广泛应用于各种领域,是科学研究中的一种重要方法。
三次样条插值
三次样条插值0 引⾔三次样条插值以构造简单,使⽤⽅便,拟合准确,具有“保凸”的重要性质等特点成为了常⽤的插值⽅法。
⼀般三次样条插值解算过程中通过追赶法求解三弯矩阵,但使⽤计算机求解时会表现出解的精度不⾼的问题,导致其计算结果⽆法应⽤到⼯程实践之中。
因此需要找出⼀种提⾼解精度的⽅法。
1 基本概念三次样条函数的定义:在区间内对于给定的函数值,其中,如果函数满⾜条件:(1)在每个⼦区间,上都是不⾼于三次的多项式;(2)、、在上都连续;(3),。
则称为函数关于节点的三次样条函数。
想要求解三次样条插值函数,只需在每个⼦区间上确定⼀个三次多项式共有4个系数,确定它们需要 4n 个条件,因此要完全确定共需 4n 个条件。
由所满⾜的条件(1)、(2)、(3),可确定个条件,仍然缺少两个条件。
这两个条件通常由实际问题对三次样条插值函数在端点的状态要求给出,也称之为边界条件,常见的边界条件有:1)夹持边界条件(Clamped Spline):给定两端点的⼀阶导数值,即,;2)⾃然边界条件(Natural Spline):使两端点的⼆阶导数值为零,即;3)⾮扭结边界条件(Not-A-Knot Spline):强制第⼀个插值点的三阶导数值等于第⼆个点的三阶导数值,最后第⼀个点的三阶导数值等于最后第⼆个点的三阶导数值,即,。
2 计算⽅法设三次样条函数,(0),,,由三次样条函数定义(1)(2)(3)可得:,(1)如下构造式(1)矩阵:(2)由式(1)可知:,,,,(3)1)在夹持边界条件时,,,,;,,,;2)在⾃然边界条件时,,,,;,,,;3)在⾮扭结边界条件时,,,,;,,,;由n个未知数的⾮齐次⽅程组有惟⼀解的充分必要条件是,可知矩阵⽅程(2)在以上三种情况下都有惟⼀解。
对矩阵⽅程(2)采⽤⾼斯列主元消去法即可求解得出。
最后,代⼊式(0)可以得出:,,,,3 应⽤算例有点集,在⾮扭结边界条件下进⾏插值。
同时使⽤Matlab R2010a和⽂章所述⽅法进⾏插值计算,对⽐计算结果。
自编的三次样条插值matlab程序(含多种边界条件)
d2 0.67221 0.43138 0.28102 0.22141 0.24664 0.2551 0.43028
0.9802
则旋转后的三次样条的系数及图像为:
xx2=[x2(1):0.001:x2(end)]'; [yy2 b2 c2 d2]=spline3(x2,y2,xx2,1,v1,vn); fprintf('\t\t\tb2\t\t\tc2\t\t\td2\n'); disp([b2 c2(1:end-1,1) d2]); plot(x2,y2,'*b',xx2,yy2,'-.k'); grid on; b2 c2 -0.97849 -0.74704 -0.35362 -0.067629 0.0061747 0.3081 0.6992
" 又 设 cn Sn 1 xn 2 , 记 i xi 1 xi , i yi 1 yi , i 1, 2, , n 1 , 则由 (1.3)可 得 :
ci 1 ci , i 1, 2, , n 1. 3 i 从(1.2)解得: bi i ci i di i2 i i 2ci ci 1 , i 1, 2, , n 1. i i 3 将(1.4)与(1.5)代入(1.3)得: di
ai yi , i 1, 2, n 1. 2 3 y2 y1 b1 x2 x1 c1 x2 x1 d1 x2 x1 , 2 3 y y b x x n 1 n 1 n n 1 cn 1 xn xn 1 d n 1 xn xn 1 n 由节点处的一阶与二阶光滑性可知: Si'1 xi Si' xi , Si"1 xi Si" xi , i 1, 2, , n.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
加以整理后可得
hk 2( x xk ) hk 2( x xk 1 ) 2 Sk ( x) ( x xk 1 ) yk ( x xk )2 yk 1 hk3 hk3 ( x xk 1 ) ( x xk ) 2 ( x xk 1 ) mk ( x xk )2 mk 1 hk2 hk2
f ( x j ) y j , j 0,1,, n 而三次样条函数 (x)满足 S S( x j ) y j , j 0,1,, n
------(1)
则称S( x)为f ( x)在[a, b]上的三次样条插值函数
2.7 三次样条
/* Cubic Spline */
2
定义 设 a x0 x1 ... xn b 。三次样条函数 S( x) C
f(x) H(x)
S(x)
二、三次样条插值多项式
a x0 , x1 ,, xn b为区间 a, b]的一个分割 [ 如果函数 ( x)在节点x0 , x1 ,, xn处的函数值为 f
f ( x j ) y j , j 0,1,, n 如果S( x)是f ( x)的三次样条插值函数则其必满足 ,
x xk
lim S k 1 ( x )
由于以上两式相等,得
1 hk 1 mk 1 2( 1 hk 1 1 1 y y y y )mk mk 1 3( k 1 2 k k 2 k 1 ) hk hk hk hk 1
共个n 1个方程, n 1个未知量
g0 gn
与基本方程组(12)联合,并化为矩阵形式,得
2 1 1 2
2
1 3
2
2
2
n 1
2 n 1 1 2
m0 g 0 m1 g 1 m2 g 2 mn 1 g n 1 m g n n
p 1,2
一般使用第一、二类边界条件, 常用第二类边界条件 加上任何一类边界条件(至少两个)后
确定S( x)必须确定4n个待定的系数的条件正 好也是4n个
即
lim S ( x ) lim S ( x ) lim S ( x) lim S ( x) m lim S ( x) lim S ( x) S ( x ) f S( x ) f 或
a x0 , x1 ,, xn b为区间 a, b]的一个分割 [ 如果函数S( x)在区间 a, b]上满足条件: [
(1) S( x), S( x), S( x)都在区间 a, b]上连续,即S( x) C 2 [a, b] [
(2) S( x)在每个小区间xk , xk 1 ]上都是三次多项式 [ 则称 S( x)为区间 a, b]上的三次样条函数 [ (3) 如果函数f ( x)在节点x0 , x1 ,, xn处的函数值为
S ( x0 ) f0 S ( xn ) f n
设 S( x j ) mj , j 0,1,, n
逐个求f ( x)在小区间 xk , xk 1 ]上的三次插值多项式 k ( x) [ S 将Sk ( x)表示为 xk , xk 1 ]上的两点三次 [ Hermite 插值多项式
将(13)式化为矩阵形式
2 2
1 3
2
2 4
2
2
3
n 2
n 1
2
m1 g 1 1 f 0 m2 g2 g3 m3 n 2 mn 2 gn2 2 mn 1 g n 1 n 1 f n
2
2
x xk x x k k 1
2
2
x xk 1 x xk mk 1 x xk 1 mk x xk x x xk x k 1 k k 1
令hk xk 1 xk, 0,1,, n 1 k
S ( x)在[a , b]上必 然是分段函数即 ,
x [ x0 , x1 ] S0 ( x ) S1 ( x ) x [ x1 , x2 ] S (x ) S ( x) x [ x , x ] n1 n 1 n
Sk ( x)是[ xk , xk 1 ]上的(两点)三次样条插值多项式满足 ,
lim S k( x ) lim S k 1 ( x )
共4n 2个条件
Sk ( x)是[ xk , xk 1 ]上的三次样条插值多项 , 应有4个待定的系数 式 即要确定S( x)必须确定4n个待定的系数
少两个条件
并且我们不能只对插值函数在中间节点的状态进行限制
也要对插值多项式在两端点的状态加以要求
k 1 , , n 1
用
1 hk 1
1 除上式的两边, 并加以整理, 得 hk
k mk 1 2mk k mk 1k hk hk 1
------(12)
k 1 , , n 1
yk yk 1 yk 1 yk g k 3(k k ) hk 1 hk
例1. 对于给定的节点及函数值 k 0 1 2 3 xk 1 2 4 5 f ( xk ) 1 3 4 2
求满足自然边界条件 ( x0 ) S ( xn ) 0的三次样条 S 插值函数S ( x),并求f ( 3)的近似值
lim S k( x ) lim S k 1 ( x )
x xk
k 1,2 ,, n 1
x xk
lim S k( x )
6 4 2 ( yk 1 yk ) mk mk 1 2 hk hk hk 4 6 2 ( yk yk 1 ) mk 1 mk 2 hk 1 hk 1 hk 1
( ( ( ( ( Sk (x) H3k ) ( x) yk0k ) ( x) yk 11k ) ( x) mk 0k ) ( x) mk 1 1k ) ( x)
x xk yk 1 2 xk 1 xk
x xk 1 x xk 1 x x yk 1 1 2 x x k 1 k k 1 k
这是一个三对角方程组 如果问题要求满足第二类(二阶自然)边界条件:
S ( x0 ) f0 S ( xn ) f n
f0 f n 0时,称为自然边界条件
由(11)式,可知
6( x0 x1 2 x0 ) S0( x0 ) ( y1 y0 ) 3 h0 6 x0 2 x0 4 x1 6 x0 4 x0 2 x1 m0 m1 2 2 h0 h0 4 2 6 2 ( y1 y0 ) m0 m1 f 0 h0 h0 h0
x xk
Sk ( x j ) y j
k
j 0,1,, n
k 1,2 ,, n 1 k 1,2 ,, n 1 k 1,2 ,, n 1
x xk
k 1
x xk
k
x xk
k 1 k 1
k
x xk
k
x xk
0
0
n
n
6 4 2 Sn 1 ( xn ) 2 ( yn yn 1 ) mn 1 mn f n hn 1 hn 1 hn 1
(15)(16)式是关于m0 , m1 , mn 1 , mn的方程, 整理后得
y1 y0 h0 2m0 m1 3 f 0 h0 2 yn yn 1 hn 1 mn 1 2 mn 3 f n hn 1 2
(19)式与(14)一样,都是三对角方程组,并且都严格对角占优
可以使用追赶法求解,并且解是唯一的
对于问题要求满足第三类(周期)边界条件 请同学们自己思考 现在回到(10)式
通过(14)或(19)式, 解出m0 , m1 ,, mn后 将m0 , m1 ,, mn代入(10)式
便可得到S0 ( x), S1 ( x),, Sn 1 ( x)从而得到 三次样条插值函数 ( x) S
对Sk (x)求二阶导数,并整理后得
6( xk xk 1 2 x) Sk( x) ( yk 1 yk ) 3 hk 6 x 2 xk 4 xk 1 6 x 4 xk 2 xk 1 mk mk 1 2 2 hk hk
由条件
x xk
S0 ( x0 ) y0 , Sn1 ( xn ) yn
Sk ( xk ) Sk 1 ( xk ) yk
x xk x xk
lim S k ( x ) lim S k 1 ( x )
x xk x xk
k 1,2 ,, n 1
也就是所谓的边界条件:
第一类(一阶)边界条件:
第二类(二阶)边界条件 第三类(周期)边界条件
S ( x0 ) f0 S ( xn ) f n S ( x0 ) f0 S ( xn ) f n
x x0 ( ( p) lim S0 p ) ( x) lim Sn 1 ( x) x xn
§ 2.7 三次样条插值
什么是样条: 是 指飞机或轮船等的制造过程中为描绘 出光滑的外形曲线(放样)所用的工具
样条本质上是一段一段的三次多项式拼合而成的曲线 在拼接处,不仅函数是连续的,且一阶和二阶导数也是连续的 1946年,Schoenberg将样条引入数学,即所谓的样条函数