三次样条函数
样条函数(三次样条)

样条插值是一种工业设计中常用的、得到平滑曲线的一种插值方法,三次样条又是其中用的较为广泛的一种。
1. 三次样条曲线原理假设有以下节点1.1 定义样条曲线是一个分段定义的公式。
给定n+1个数据点,共有n个区间,三次样条方程满足以下条件:a. 在每个分段区间(i = 0, 1, …, n-1,x递增),都是一个三次多项式。
b. 满足(i = 0, 1, …, n )c. ,导数,二阶导数在[a, b]区间都是连续的,即曲线是光滑的。
所以n个三次多项式分段可以写作:,i = 0, 1, …, n-1其中ai, bi, ci, di代表4n个未知系数。
1.2 求解已知:a. n+1个数据点[xi, yi], i = 0, 1, …, nb. 每一分段都是三次多项式函数曲线c. 节点达到二阶连续d. 左右两端点处特性(自然边界,固定边界,非节点边界)根据定点,求出每段样条曲线方程中的系数,即可得到每段曲线的具体表达式。
插值和连续性:, 其中i = 0, 1, …, n-1微分连续性:, 其中i = 0, 1, …, n-2样条曲线的微分式:将步长带入样条曲线的条件:a. 由(i = 0, 1, …, n-1)推出b. 由(i = 0, 1, …, n-1)推出c. 由(i = 0, 1, …, n-2)推出由此可得:d. 由(i = 0, 1, …, n-2)推出设,则a. 可写为:,推出b. 将ci, di带入可得:c. 将bi, ci, di带入(i = 0, 1, …, n-2)可得:端点条件由i的取值范围可知,共有n-1个公式,但却有n+1个未知量m 。
要想求解该方程组,还需另外两个式子。
所以需要对两端点x0和xn的微分加些限制。
选择不是唯一的,3种比较常用的限制如下。
a. 自由边界(Natural)首尾两端没有受到任何让它们弯曲的力,即。
具体表示为和则要求解的方程组可写为:b. 固定边界(Clamped)首尾两端点的微分值是被指定的,这里分别定为A和B。
三次样条函数的边界条件

三次样条函数的边界条件
一、第一种边界条件:固定边界条件(也叫夹紧边界条件)
1. 一阶导数边界条件
- 想象一下你在摆弄一个有弹性的东西,在两端你把它的“斜率”给定好了。
比如说,在区间的左端点a和右端点b,你规定了这个三次样条函数在这两点的一阶导数的值,就好像你在这两个端点抓住这个函数,让它按照你规定的倾斜程度开始和结束。
- 就好比你有一个弯曲的小棍,你在小棍的两端规定了它开始和结束弯曲的方向的陡峭程度。
2. 二阶导数边界条件
- 这个呢,就像是你在规定这个函数在边界处的“弯曲程度”。
在端点a和b,你设定了二阶导数的值。
这就好比你在控制小棍在两端的弯曲的曲率,是弯得更厉害还是比较平缓,你说了算。
二、第二种边界条件:自然边界条件
1. 二阶导数为零边界条件
- 这个边界条件很有趣哦。
它就像是你在说这个函数在边界处是比较“平滑”的,没有额外的弯曲。
就好像你在玩一个有弹性的绳子,在两端它没有被拧或者额外弯曲,是很自然地伸展着,所以二阶导数为零,就表示在边界处这个函数的弯曲没有突然的变化。
三、第三种边界条件:周期边界条件
1. 函数值和一阶导数相等边界条件
- 这就像是一个循环的东西。
想象你有一个环形的轨道,三次样条函数就沿着这个轨道走。
在区间的起点a和终点b,函数值是一样的,而且它在这两点的“倾斜程度”(一阶导数)也是一样的。
就好像你在这个环形轨道上,从一个点出发转一圈回来,函数的状态要能无缝对接,就像小火车在环形轨道上跑,回到起点的时候速度(一阶导数)和高度(函数值)都要和出发的时候一样。
第三讲三次样条函数

给定区间[0, 上 例1 给定区间 3]上 3 个点的函数 值 f(0)=0, f(1)=2, f(3)=4, 试求数 a, b, c, d, 使函数 S(x)为给定点上的三次样条插值 为给定点上的三次样条插值 函数. 函数 其中 x2 + x + d , 0≤ x ≤1 S( x) = 3 . 2 ax + bx + cx + 1, 1 ≤ x ≤ 3
答案: 答案 a = −1, b = 4, c = −2, d = 0.
给定n+1个样点 i, yi )(i=0, 1, …, n), 个样点(x 给定 个样点 确定一个三次样条插值函数需要4n个独 确定一个三次样条插值函数需要 个独 立条件. 在定义中, 已指定了4n–2个条件 即 个条件, 立条件 在定义中 已指定了 个条件
yi Mi yi +1 Mi +1 + − hi ( xi +1 − x ) + − hi ( x − xi ) 6 6 hi hi
x ∈ [ x i , x i +1 ]
( xi +1 − x )2 ( x − xi )2 S ′( x ) = − Mi + Mi +1 2hi 2hi yi +1 − yi Mi +1 − Mi hi + − hi 6
M 0 d0 M d 1 1 M 2 d2 = M M λ n −1 M n −1 d n −1 2 M n dn
对于第1型插值问题 对于第 型插值问题: 型插值问题 λ 0 = 1, d 0 = 6 ( y1 − y 0 ) h0 − y 0′ h0 , µ n = 1, d n = 6 y n′ − ( y n − y n − 1 ) hn − 1 hn − 1 . 对于第2型插值问题 型插值问题: 对于第 型插值问题 λ 0 = 0, d 0 = 2 y 0′′ , µ n = 0, d n = 2 y n′′ . 对于第3型插值问题 对于第 型插值问题: 型插值问题
三次样条插值函数

三次样条插值函数MATLAB 编程实现三次样条插值函数为()()[)()[]1011,,,,n n n S x x x x S x S x x x x-⎧∈⎪=⎨⎪∈⎩ 利用三次埃尔米特插值函数表示三次样条插值函数,即()()()()())111111,,j j j j j j j j j j j S x y x y x m x m x x x x ααββ++++++⎡=+++∈⎣(0,1,,1j n =-)基函数满足()()()()()()21112111121121111212jj j j j j j j j j j j j j j j j j j jj j j j x x x x x x x x xx xx x x x x x xx xx x x x xx x x x x x xααββ++++++++++++⎛⎫⎛⎫--=+ ⎪⎪ ⎪⎪--⎝⎭⎝⎭⎛⎫⎛⎫--=+ ⎪⎪ ⎪⎪--⎝⎭⎝⎭⎛⎫-=-⎪ ⎪-⎝⎭⎛⎫-=-⎪ ⎪-⎝⎭由上式易得()()()()()()()()()()()()()()1331111331112211112211612612246246j j j j j j j j j j j j j j j j j j j j j j jj j j j j x x x x x x xx x x x x x x x x x x x x xx xx x x x x x x x x ααββ+++++++++++++++''=---+''=-+--+''=---+''=---则有()()()()()()()()()()()111111113333111111122221111661212242466j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j S x y x y x m x m x x x x x y x y x x x x x x x x x x x x x m x m x x x x x x x x x ααββ+++++++++++++++++++''''''''''=+++⎡⎤⎡⎤++⎢⎥⎢⎥=-+-+⎢⎥⎢⎥----⎣⎦⎣⎦⎡⎤++⎢⎥+-+-⎢⎥----⎣⎦)1,j j x x x +⎡⎤⎢⎥⎡∈⎣⎢⎥⎣⎦(0,1,,1j n =-)同理有()()()()()()()()()()()()()()()11111113333111111122221111661212242466j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j j S x y x y x m x m x x x x x y x y x x x x x x x x x x x x x m x m x x x x x x x x x ααββ------------------''''''''''=+++⎡⎤⎡⎤++⎢⎥⎢⎥=-+-+⎢⎥⎢⎥----⎣⎦⎣⎦⎡⎤⎡++⎢⎥+-+-⎢⎥----⎣⎦⎣)1,j j x x x -⎤⎢⎥⎡∈⎣⎢⎥⎦(1,,j n =)根据样条函数二阶导数连续性,即()()100j j j j S x S x +''''+=-(1,,1j n =-)即()()()()()()()()()()()()()()()()111111332211111111113322111166426624j j jj j j j j j j jj j j j j j j j j j j j j j jj j j j j jj j j j j j j j x x y x x y x x x x m m x x x x x x x x x x y x x y x x x x m m x x x x x x x x ++++++++++--------------+++--------=+++----(1,,1j n =-)化简得()()()()()111111111111233j j j j j j j j j j j j j j j j j j jj j xx m x x m x x m x x x x y y y y x x x x +-+--+-++-+--+-+---=-+---(1,,1j n =-)可得线性方程组()()()()()()()()()()0121201023231213121221111110212110211032213221322122233333n n n n n n n n n n n n m m x x x x x x m x x x x x x m x x x x x x m m m x x x x y y y y x x x x x x x x y y y y x x x x y ------⨯+-+⨯⎛⎫ ⎪ ⎪ ⎪---⎛⎫⎪ ⎪--- ⎪ ⎪⎪ ⎪⎪ ⎪ ⎪--- ⎪⎝⎭ ⎪ ⎪ ⎪⎝⎭---+------+---=()()()121112112113n n n n n n n n n n n n n x x x x y y y x x x x ----------⨯⎛⎫⎪ ⎪ ⎪ ⎪⎪⎪ ⎪-- ⎪-+- ⎪--⎝⎭为了使样条插值问题有惟一解,我们在原有方程基础上增加两个边界条件。
三次样条函数三弯矩算法

摘要求函数在给定区间上的定积分,在微积分学中已给出了许多计算方法,但是,在实际问题计算中,往往仅给出函数在一些离散点的值,它的解析表达式没有明显的给出,或者,虽然给出解析表达式,但却很难求得其原函数。
这时我们可以通过数值方法求出函数积分的近似值。
在用近似值代替真实值时,遇到的问题就是近似值的代数精度是否足够。
当代数精度不足够时,很显然提高插值函数的次数是一种方法,但是考虑到数值计算的稳定性,当次数过高时,会出现龙格现象,用增大n的方法来提高数值积代数精度是不可取的。
正如我们所知道的分段线性插值,逼近程度好,但光滑性差。
分段三次Hermite插值,逼近程度好,光滑性也有所提高,但是需要增加更多的条件,不太实用。
因此,我们将介绍一种结合二者的优点的插值方法——三次样条插值。
本实验将介绍三次样条插值的三弯矩算法。
关键词:龙格现象三弯矩算法代数精度分段三次Hermite插值1、实验目的1) 通过本次实验体会并学习三次样条插值的优点。
2) 通过对三次样条插值进行编程实现,提高自己的编程能力。
3) 用实验报告的形式展现,提高自己在写论文方面的能力。
2、算法流程如果已知函数)(x f y =在节点a =x 0<x 1<⋯<x n =b,y i =f (x i ),i =0,1,2,⋯,n 处的函数值和导数值:n i x f y i i ,,2,1,0),( ==如果)(x S 满足条件:1) S (x )是一个分段的三次多项式且i i y x s =)(;2) S (x )在[a,b]具有二阶连续导数。
则称S (x )是三次样条插值函数。
S (x )的具体形式为:其中S i (x)在[x n−1,x n ]上是三次多项式S i (x )=a i x 3+b i x 2+c i x +d i 由插值条件S (x i )=y i ,i=0,1,2,…,n ,得n+1个条件。
边界条件一:S ′(x 0)=y 0′,S ′(x n )=y n ′边界条件二:S ′′(x 0)=y 0′′,S ′′(x n )=y n ′′边界条件三:假定函数y =f(x)是以b-a 为周期的周期函数,这时要求S(x)也是周期函数,即{S (x 0+0)=S(x n −0)S ′(x 0+0)=S ′(x n −0)S ′′(x 0+0)=S ′′(x n +0)()()()()⎪⎪⎩⎪⎪⎨⎧∈∈∈=-]12,121,01,[,...............][,][,n n n x x x x s x x x x s x x x x s x s针对三种边界条件的求解方法的不同,可以分为三转角算法和三弯矩算法,本实验将介绍和学习三转角算法。
2-5三次样条函数系数ci的求解

c n 1 a n 1 c n b n 1
x i -1
xi
x i 1
x n -1
c n 1 b n 1 a n 1 c n
cn
y n k n 1, n ( x n x n 1 ) b n 1 ( 2 a n 1 )( x n x n 1 )
( x 2 x 1 )( b1 a 1 c 2 ) 2 ( x 3 x 1 ) c 2 ( x 3 x 2 ) c 3 k 2 , 3 k 1, 2
c2
(x3 x2 ) 2 ( x 3 x1 ) a1 ( x 2 x1 )
c3
k 2 , 3 k 1, 2 ( x 2 x 1 ) b1 2 ( x 3 x1 ) a1 ( x 2 x1 )
a1
1 2
bi
k i ,i 1 k i 1,i ( x i x i 1 ) b i 1 2 ( x i 1 x i 1 ) a i 1 ( x i x i 1 )
b2
k 2 ,3 k 1, 2 ( x 2 x 1 ) b1 2 ( x 3 x1 ) a1 ( x 2 x1 )
课题二、船体型线的数值表示
(五)三次样条函数系数求解
一、概述
si ( x) yi ( y i 1 y i x i 1 x i
2
( c i 1 2 c i )( x i 1 x i ))( x x i ) c i 1 c i x i 1 x i )( x x i )
2 c1 c 2
k 1, 2 f ( x1 ) x 2 x1
1 2 b1
c1 k 1, 2 f ( x 1 ) 2 ( x 2 x1 )
样条函数及三次样条插值PPT课件

(x)
lim
x xk
Sk 1( x)
lim
x
x
k
Sk (x)
lim
x
x
k
Sk1( x)
k 1,2,,n 1
------(4)
lim
x
x
k
Sk( x)
lim
x
x
k
Sk1( x)
共4n 2个条件
5
Sk (x)是[xk , xk 1 ]上的三次样条插值多项式,应有4个待定的系数 即要确定S(x)必须确定4n个待定的系数 少两个条件 并且我们不能只对插值函数在中间节点的状态进行限制 也要对插值多项式在两端点的状态加以要求 也就是所谓的边界条件:
例. 使用不同的插值方法于函数
y
1
1 x2
x [5,5]
最后,介绍一个有用的结论
定理 . 设f (x) C 2[a,b], S(x)是以xk (k 0,1,, n)
为节点, 满足任意边界条件的三次样条插值函数,
设hi
xi 1
xi
,
h
max
0in1
hi
,
min
0in1
hi
,
则当 h
c 时
S(x)和S(x)在[a,b]上一致收敛到f (x)和f (x)
------(6)
13
由(11)式,可知
S0( x0
)
6( x0
x1 h03
2 x0
) ( y1
y0 )
6 x0
2 x0 h02
4 x1
m0
6 x0
4 x0 h02
2 x1
m1
6 h02
(
三次样条插值函数

cout<<resetiosflags(ios::showpos);//除去正负号格式
cout<<"x<-["<<x[i]<<","<<x[i+1]<<"]"<<endl;
{
if(a[i][i]==0||a[i][i-1]==0)
{
cout<<"a["<<n-1<<"]["<<n-1<<"]可约"<<endl;
break;
}
if(fabs(a[i][i])<=fabs(a[i][i-1]))
{
{
b[i]-=v[i]*dyn;
}
}
cout<<endl<<"解得对角方程组"<<endl<<"A="<<endl;;
for(i=0;i<n-1;i++)
{
for(j=0;j<n-1;j++)
{
cout<<setw(10)<<A[i][j];
cout<<"a["<<n-1<<"]["<<n-1<<"]强超"<<endl;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
[Sn]=Hermite(px,py,0,0,2) %根据插值点及其值计算三次样条函数
for i=1:10 %采用自然边界
Sx=-6+i:0.01:-5+i;
Sy=polyval(Sn(i,:),Sx)
plot(Sx,Sy,'b-.')
end %绘制函数图像
s2=[1,-X(i)]; s2=conv(s2,s2); b=[-2,H(i)+2*X(i+1)]; s2=conv(s2,b);
s3=[1,-X(i+1)]; s3=conv(s3,s3); c=[1,-X(i)]; s3=conv(s3,c);
s4=[1,-X(i)]; s4=conv(s4,s4); d=[1,-X(i+1)]; s4=conv(s4,d);
for k=1:n
H(k)=X(k+1)-X(k);
end
for k=1:m-2
u(k)=H(k+1)/(H(k+1)+H(k));
l(k)=1-u(k);
end
for i=2:m-1
A(i,i-1)=l(i);
A(i,i)=2
A(i,i+1)=u(i);
end
mY=zeros(m,1);g=mY;
for i=1:m-1
s1=[1,-X(i+1)]; s1=conv(s1,s1); a=[2,H(i)-2*X(i)]; s1=conv(s1,a);
s2=[1,-X(i)]; s2=conv(s2,s2); b=[-2,H(i)+2*X(i+1)]; s2=conv(s2,b);
s3=[1,-X(i+1)]; s3=conv(s3,s3); c=[1,-X(i)]; s3=conv(s3,c);
《数值分析》实验报告:实验二
实验名称:三次样条函数的实现
实验地点:八教
所使用的工具软件及环境:Matlab
一、实验目的:
1.利用Matlab实现三次样条函数;
2.利用Matlab绘制函数图像;
二、实验内容:
1.根据所给定的节点值和节点上的函数值,取边界条件为“自然边界条件”,编制构造三次样条函数的Matlab程序;
2.给定函数f(x)=1/(1+x^2),取插值节点为-5:1:5,利用编制的Matlab程序求出三次样条函数,并绘制出准确函数f(x)以及所求出的三次样条函数图像,进行比较。
3.自己设定一个函数,分别构造并绘制出该函数的Lagrange插值多项式和三次样条的函数图像,进行分析和比较。
三、操作步骤:
hold on
Sn
由上图可得:在边界两端采用二导数值时的拟合度比采用自然边界的拟合度高。
任课教师:鲍亮2010年10月6日
if flag==1
A(1,1)=1;A(m,m)=1;
for k=1:m
if k==1
g(1)=f0;
elseif k==m
g(m)=fn;
else
g(k)=3*((u(k-1).*(Y(k)-Y(k-1))./H(k-1))+l(k-1).*(Y(k+1)-Y(k))./H(k));
end
end
G(k+1)=gk;
end
G(m)=3*(Y(m)-Y(m-1))/H(m-1);l(n)=1;
for i=2:(m-1)
A(i,i)=2;A(m,m)=2;
A(i+1,i)=l(i);
A(i,i+1)=u(i);
end
mY=A\G';
syms x
m=length(X);Sn=zeros(m-1,4);
hold on
Sn
[Ln] = SF_Lagrange(px,py); %根据插值点及其值计算Lagrange插值多项式
Lx = -5:0.01:5; %绘图点
Ly = polyval(Ln,Lx); %计算绘图点上的多项式函数值
plot(Lx,Ly,'g--') %绘制多项式图像legend('sin(x)','point','Ln','Location','NorthEast')
Matlab程序如下:
一、构造三次样条函数的程序:
1、
a)用2个参数(针对自然边界)
function [Sn]=SF_Hermite(X,Y)
m=length(X);n=m-1;A=zeros(m,m);
H=zeros(1,n);
u=zeros(1,n);
G=zeros(1,n);
l=zeros(1,n);
plot(Sx,Sy,'b-.')
end%绘制函数图像
hold off
Sn
3:
functionSF_ZYT
x = -5 : 0.01 : 5;
y = sin(x);
plot(x,y,'r:') %绘制准确函数图像
hold on
px = -5 : 1 : 5; %插值点
py = sin(px); %插值点上的函数值
else
g(k)=3*((u(k-1).*(Y(k)-Y(k-1))./H(k-1))+l(k-1).*(Y(k+1)-Y(k))./H(k));
end
end
end
mY=inv(A)*g;
m=length(X);Sn=zeros(m-1,4);
for i=1:m-1
s1=[1,-X(i+1)]; s1=conv(s1,s1); a=[2,H(i)-2*X(i)]; s1=conv(s1,a);
end
if flag==2
A(1,1)=2;A(m,m)=2;
A(1,2)=1;A(m,m-1)=1;
for k=1:m
if k==1
g(1)=3*(Y(2)-Y(1))/(X(2)-X(1))-H(1)/2*f0;
elseif k==m
g(m)=3*(Y(m)-Y(m-1))/(X(m)-X(m-1))+H(m-1)/2*fn;
Sn(i,:)=Y(i)*s1/(H(i)^3)+Y(i+1)*s2/(H(i)^3)+mY(i)*s3/(H(i)^2)+mY(i+1)*s4/(H(i)^2);
end
二、主程序:
2:
function SF_ZYT
X = -5 : 0.1 : 5;
Y = 1./(1+X.^2);
plot(X,Y,'r:')
hold off
Ln
四、实验结果:
图Hale Waihona Puke 绘制如下:2:从图像中可以看出:对于该函数,采用自然边界的三次样条函数图像对于标准图像有相当好的拟合度。
3:
构造的函数为f(x)=sin(x)
标准函数图像和拉格朗日插值图像比较:
标准函数图像和三次样条图像比较:
标准、拉格朗日、三次样条图像比较:
结论:由上面3个图像可以看出:在边界处采用自然边界的三次样条函数的图像与朗格朗日插值图像相比,后者对于f(x)=sin(x)的拟合度高。
u(1)=1;A(1,1)=2;A(1,2)=u(1);
for k=1:n
hk=X(k+1)-X(k);H(k+1)=hk;
end
H=H(2:n+1);
for k=1:n-1
uk=H(k)/(H(k)+H(k+1));u(k+1)=uk;
lk=1-u(k+1);l(k)=lk;
gk=3*((l(k).*(Y(k+1)-Y(k))./H(k))+(u(k+1).*(Y(k+2)-Y(k+1))./H(k+1)));
拓展思考:
在边界两端采用二阶导数值时的拟合情况:
[Sn]=Hermite(px,py,-sin(-5),-sin(5),2) %根据插值点及其值计算三次样条函数
for i=1:10
Sx=-6+i:0.01:-5+i;
Sy=polyval(Sn(i,:),Sx)
plot(Sx,Sy,'b-.')
end %绘制函数图像
hold on
pX = -5 : 1 : 5;
pY =1./(1+pX.^2) ;
plot(pX,pY,'m+')
[Sn]=Hermite(pX,pY,0,0,2) %根据插值点及其值计算三次样条函数
for i=1:10
Sx=-6+i:0.01:-5+i;
Sy=polyval(Sn(i,:),Sx)
s4=[1,-X(i)]; s4=conv(s4,s4); d=[1,-X(i+1)]; s4=conv(s4,d);
Sn(i,:)=Y(i)*s1/(H(i)^3)+Y(i+1)*s2/(H(i)^3)+mY(i)*s3/(H(i)^2)+mY(i+1)*s4/(H(i)^2);
end
b)用5个参数(针对两端一阶、二阶导数值已知情况):
function [Sn]=SF_Hermite(X,Y,f0,fn,flag)
if length(X)~=length(Y)
error('变量不匹配');
end
m=length(X);n=m-1;A=zeros(m,m);