(27)三次插值样条曲线

三次插值样条曲线在灵活性和计算速度之间进行了合理的折中。与更高次样条相比,三次插值样条只需较少的计算和存储,且较稳定。与二次插值样条相比,三次插值样条在模拟任意形状时显得更灵活。

三次插值样条曲线由分段的三次多项式来描述。设其参变量为t,则分段三次插值样条曲线表达式的一般形式为:

             P(t) = B1 + B2t + B3t2 + B4t3     (0≤t≤tm)           (4-13)

其中,P(ti) = [x(ti)  y(ti)  z(ti)]可以看作三次插值样条曲线上某一点的位置向量,ti是该点的参变量,x(ti)、y(ti)、z(ti)可以看作是该点的坐标值。

式(4-13)中的B1、B2、B3、B4为四个待定系数。必须确定这四个系数,这需要设定四个独立条件。


n+1个型值点产生n 段曲线,每段曲线都需要确定四个系数。确定系数的不同方法导致不同的三次插值样条曲线:

三次自然样条曲线
Hermite样条曲线
Cardinal样条曲线


三次自然样条曲线 

三次自然样条曲线是最早用于图形应用的三次插值样条曲线。

 三次自然样条曲线具有C2连续性。

  n+1个型值点(P0、P1、P2……Pn)插值产生n段曲线,每段曲线有4个系数,共有4n个多项式系数需要确定。


4n个多项式系数的确定:
①  对于每个内型值点(P1、P2……Pn-1,共n-1个)有4个边界条件:在该型值点两侧的两个相邻曲线段在该点处具有相同的一阶和二阶导数,并且两个曲线段都要通过该点。——4(n-1)个方程
②  曲线起点为第一个型值点P0,曲线终点为最后一个型值点Pn。——2个方程
③  在P0 和 Pn两点处设二阶导数为0。——2个方程


三次自然样条曲线能够做到曲线通过所有型值点。
 缺点:
① 必须解方程组。
② 整条曲线受所有型值点控制,如果型值点中有任何一个改动,则整条曲线都受影响。因此,不允许“局部控制”。
③ 在实际应用中很少采用三次自然样条曲线。 


Hermite样条曲线 

Hermite样条曲线是以法国数学家Charles Hermite命名的,它是一个分段三次多项式,并且在每个型值点处有给定的切线。
与三次自然样条曲线不同,Hermite样条曲线可以局部调整,因为每个曲线段仅依赖于端点约束。
整条曲线通过所有的型值点,对于每个曲线段来说,它通过两个相邻的型值点。

Hermite样条曲线段的确定:
 已知:设曲线段的起点和终点分别为P0和P1,并且曲线段在两端点处的切矢量分别为P'0和P'1。参变量t是在两个端点取值0和1之间变化。
                   
对于每个三次曲线段,有了四个独立条件:两个端点的位置向量以及曲线段在两端点处的切矢量。根据这四个条件可以得到方程组,求出分段表达式(4-13)中的四个系数: 

P0 = B1 + B2t + B3t2 + B4t3 = B1                   (当t=0)

P1 = B1 + B2t + B3t2 + B4t3 = B1 + B2+ B3 + B4         (当t=1)

P'0 = B2 + 2B3t + 3B4t2 = B2                      (当t=0)   (4-14)

P'1 = B2 + 2B3t + 3B4t2 = B2 + 2B3 + 3B4             (当t=1)

式(4-14)写成矩阵形式:

           

求解上述方程组中的B1、B2、B3、B4,可得Hermite样条曲线的矩阵表达式:

       

将式(4-16)展开,得到第k段Hermite样条曲线的表达式:

  P(t) = Pk(2t3-3t2+1) + Pk+1(-2t3+3t2) + Pk'(t3-2t2+t) + Pk+1'(t3-t2)       (4-17)

Hermite样条曲线能局部修改,对某些数字化应用有用。但对计算机图形学中的大部分问题而言,除了型值点坐标外,更好的做法是不需要输入曲线斜率值或其它几何信息就能生成样条曲线。因此,出现了Cardinal样条,它不需要输入控制点上的曲线导数值,而是采用控制点的坐标位置来计算导数。 


Cardinal样条曲线

Cardinal样条曲线也是分段三次插值曲线,并且每个曲线段端点处均指定切线,但不一定要给出端点处的切线值。
一个Cardinal样条曲线段由四个连续控制点给出。中间两个控制点是曲线段的端点,另外两个控制点用来计算端点斜率。 

设P(t)是两个控制点Pk和Pk+1间的参数三次函数式,则从Pk-1到Pk+2间的4个控制点用于建立Cardinal样条曲线段的边界条件: 

                     

                      P0 = Pk

                      P1 = Pk+1

                      P'0 = 1/2(1- ts)(Pk+1- Pk-1)           (4-18)

                      P'1 = 1/2(1- ts)(Pk+2- Pk

控制点Pk和Pk+1处的斜率分别与弦Pk-1Pk+1和PkPk+2成正比。

参数ts:称为张力参数,它控制Cardinal样条曲线与输入控制点之间的松紧程度。

                  

张力参数 ts 在Cardinal曲线形状中的作用:

                 

以将边界条件式(4-18)转换成矩阵形式: 

       

其中,s = (1-ts)/2。

将矩阵形式(4-19)展开,得Cardinal样条曲线多项式形式:

P(t) = Pk-1(-st3 + 2st2 - st) + Pk[(2-s)t3 + (s-3)t2 + 1] +

          Pk+1[(s-2)t3 + (3-2s)t2 + st] + Pk+2(st3 - st2)             (4-20) 







 



 

 

 

 
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是用于计算三次插值样条方程的函数: ```matlab function [s,coeff] = cubic_spline(x,y) % x和y分别是数据点的横纵坐标,输出s是插值函数的函数句柄,coeff是插值函数的系数矩阵 n = length(x); dx = zeros(1,n-1); dy = zeros(1,n-1); vl = 0; vn = 0; A = zeros(n,n); r = zeros(n,1); for i = 1:n-1 %定义deltas dx(i) = x(i+1) - x(i); dy(i) = y(i+1) - y(i); end for i=2:n-1 %加载A矩阵 A(i,i-1:i+1) = [dx(i-1) 2*(dx(i-1) +dx(i)) dx(i)]; r(i) = 3*(dy(i)/dx(i) - dy(i-1)/dx(i-1));%右侧端点 end %设置端点条件 %仅仅使用5对点中的一对; A(1, 1) = 1;%自然样条条件 A(n, n) = 1; % A(1,1) = 2;%曲率-相邻条件 % r(1) = vl; % A(n,n) = 2; % r(n) = vn; % A(1,1:2) = [2*dx(1) dx(1)]; % r(1) = 3*(dy(1)/dx(1)-vl);%钳制 % A(n,n-1:n) = [dx(n-1) 2*dx(n-1)]; % r(n) = 3*(vn-dy(n-1)/dx(n-1)); % A(1,1:2) = [1,-1]; % a(n,n-1:n) = [1, -1]; % A(1,1:3) = [dx(2) -(dx(1)+dx(2)) dx(1)]; %当n>=4,非纽结 % A(n,n-2:n) = [dx(n-1) -(dx(n-2)+dx(n-1)) dx(n-2)]; coeff = zeros(n,3); coeff(:,2) = A\r; %解系数C for i=1:n-1 %解b和d coeff(i,3) = (coeff(i+1,2) - coeff(i,2))/(3*dx(i)); coeff(i,1) = dy(i)/dx(i)-dx(i)*(2*coeff(i,2)+coeff(i+1,2))/3; end coeff = coeff(1:n-1,1:3);%三个系数 %构造插值函数 s = @(xq) interp_spline(x,y,coeff,xq); end function yq = interp_spline(x,y,coeff,xq) %根据系数矩阵和插值点的横坐标计算插值函数在该点的值yq n = length(x); yq = zeros(size(xq)); for i = 1:length(xq) if xq(i) < x(1) || xq(i) > x(n) yq(i) = NaN; else for j = 1:n-1 if xq(i) >= x(j) && xq(i) <= x(j+1) yq(i) = coeff(j,1) + coeff(j,2)*(xq(i)-x(j)) + ... coeff(j,3)*(xq(i)-x(j))^2 + ... coeff(j+1,3)*(xq(i)-x(j))^3/(3*(x(j+1)-x(j))); break; end end end end end ``` 其中,`cubic_spline`函数用于计算样条插值的系数矩阵,并返回一个插值函数的函数句柄;`interp_spline`函数用于根据系数矩阵和插值点的横坐标计算插值函数在该点的值。使用该函数时,只需要调用`cubic_spline`函数即可,例如: ```matlab x = [0 1 2 3 4]; y = [10 5 3 4 8]; [s,coeff] = cubic_spline(x,y); xq = linspace(0,4,100); yq = s(xq); plot(x,y,'o',xq,yq); ``` 上述代码将生成一条经过数据点的三次插值样条曲线

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值