三次B样条曲线插补算法的VC实现

三次B样条曲线插补算法的VC实现
三次B样条曲线插补算法的VC实现

三次B 样条曲线插补算法的VC 实现

孔凡国,郝尚华,钟廷志

(五邑大学 机电系,广东 江门 529020)

摘要:结合三次B 样条曲线的数学性质,理论分析了三次B 样条曲线的插补过程,推导出了三次B 样条曲线的插补运算公式。在对三次B 样条曲线进行研究的基础上,介绍三次B 样条曲线插补算法实现方法,并在VC 环境中对B 样条曲线的插补过程进行了实现,实现了数控插补的动态运算。

关键词:三次B 样条;插补;VC

VC Implement of the Cubic B-spline curve

Interpolation

KONG Fan-guo ,HAO Shang-hua ,ZHONG Ting-zhi

(Department of Mechatronics ,Wuyi University ,Jiangmen 529020,China ) Abstract :Combined with mathematics characters of the cubic B-spline curve, the interpolation process of the cubic B-spline curve is analyzed and calculation interpolation formula is deduced. Finally the cubic B-spline curve interpolation operator is programmed under the platform of VC to realize dynamic simulation.

Keyword :cubic B-spline ;interpolation ;VC

在数控加工中用一小段直线或圆弧去拟合实际曲线,这种拟合方法就是“插补”。 它实质上是根据有限的信息完成“数据密化”的工作。插补的计算方法和计算精度影响到整个数控系统的精度和效率,因此插补算法对整个数控系统的性能指标至关重要,可以说插补是整个数控系统控制软件的核心。

1 三次B 样条曲线插补原理

B 样条曲线是对Bezier 曲线的改进,它不仅保留了Bezier 曲线的优点,而且具有局部控制的能力,B 样条曲线方程可为:

给定n+1个控制点i P (i =0,1,……,n ),也称为特征多边形的顶点,k 次(k +1阶)B 样条曲线的表达式是:

,0()()n i

i k i P u N u ==∑P 1k n ≤≤ (1)

在上式中当k=3,i =0,1,2,3时,可得三次B 样条曲线方程是: 3,30()()i

i i P u N u ==∑P 01u ≤≤ (2)

用矩阵形式可表示为:

013223133136301()1 01303061410P u u u u u --????????-??????=≤≤??????-????????

P P P P (3)

u 为由样条控制点确定的可变系数。

本文采用参数化数据采样插补原理来实现插补过程,其基本思想是:按照给定的采样周期将时间轴分成等间隔的小区间。插补过程中根据进给速度、加减速要求和允许误差,在各采样周期产生空间小直线段1L ?、2L ?、…、i L ?、…去逼近被插补曲线,逐步求得所需的各插补直线段端点1P 、2P 、…、 i P 、…的坐标值。

根据插补的思想可以知道,插补过程实际上是通过参变量u 作为直接控制量,从而求得插补点的坐标位置及插补点沿插补轨迹的移动速度等被控量的过程。

2 三次B 样条曲线插补算法设计

在插补过程的每一采样周期中,首先根据进给速度要求和允许误差求出轨迹空间中的插补直线段,然后将此直线段映射到参变量空间,得到与其相对应的参变量空间中的小直线段,即参变量的增量值。进一步通过对参变量的积分求出参变量空间中的当前点坐标。最后,求取与参变量空间中当前点相对应的轨迹空间中的映射点,得到插补轨迹上的当前点的坐标值。

由于三次B 样条曲线的各坐标分量均为参数u 的函数可以直接计算。在每个插补周期T 内,有相等的微小增量u ,即参数u 的增量步长恒定,然后由公式计算得下一个插补点。这种插补算法虽然计算简单,速度快,但其存在插补速度不恒速等缺点。

要使得样条插补在轨迹空间内匀速,就必须要根据编程进给速度来确定一个插补周期内的轮廓步长,然后将此参数映射到参数空间中,得到与其相对应的参数空间内的增量u 。 设V 是样条曲线的切线速度矢量:

()()dP u dP u du V dt du dt

== 设V 是样条曲线的编程进给速度,则: ()dP u du V V du dt

== 可得: ()du V dP u dt

du

= 222242()()()

dP u d P u V du du d u dt dP u du

?? ???=- 设控制系统的插补周期为T ,1i i t t T +-=,u 是关于t 的函数,令()i i u t u =,11()i i u t u ++=,用泰勒级数将1()i u t +在i t 展开可得:

22211121()()()2i i

i i i i i i t t t t du d u u u t t t t o t dt dt +++===+-+-+

所以,插补递推公式的一阶近似为:

1()

i

i i u u V T u u dP u du +=≈+ (4) 二阶近似为: 222

214()()()

()2i i i u u dP u d P u V T du du V T

u u dP u dP u du du +=?? ???≈+- (5) 由于现在的数控系统插补周期T 一般都很小,在曲线半径不太小的情况下,一阶近似迭代求解已经可以满足精度要求。如果曲线曲率半径很小,便要采用二阶近似。

由于每个插补周期内的参数增量:

()

i

i i u u V T u dP u du == (6) 是由编程进给速度和插补周期决定,在每一个插补周期中生成的轨迹空间的弦长是不变的,所以进给速度是不变的。

3 程序流程

根据上文的理论分析及公式推导,可按照图1所示的流程设计程序。

图1 三次B样条曲线匀速插补算法流程图

4 插补算法的VC程序实现

该程序主要用于演示在平面坐标系中三次B样条曲线的插补过程,以及速度控制的实现。要求用户输入控制点点数、插补速度和插补周期,并在绘图区选择控制顶点。绘图区采用Windows的默认坐标系,即左上角为原点(0,0),向右方向为X轴正方向,向下为Y 轴正方向。

程序运行后,首先根据输入的控制定点数,申请内存空间,并进行初始化,用于保存各控制顶点信息,然后将鼠标选取的坐标点信息以此存放到申请的内存空间中,当最后一个点选择完毕后,程序将按照前面输入的插补速度和插补周期,结合公式(3)、(6),计算出每个插补周期的u的增量和小直线段的终点,以插补速度V匀速的绘制出所要求出的三次B 样条曲线。

(1)参数输入

在本程序中需要用户输入三个数据:控制点的数目、曲线的插补周期和插补速度,且控制点数不能小于4,插补速度和插补周期大于0。

(2)程序运行

完成上述信息输入后,通过鼠标点击在绘图区选取给定个数的控制点的坐标,程序将在最后一个点选取完成后自动按照给定速度,匀速的绘制出相应的三次B样条曲线。以10个

控制定点为例,绘制出的三次B样条曲线如图2所示:

图2 程序运行实例

5 结论

对过对三次B样条曲线的数学性质、三次B样条曲线插补过程的分析和研究,用VC 实现了三次B样条曲线插补算法,实现过程中采用动态改变参数u的增量实现了插补的匀速进行,该程序略加改动即可应用于简易数控系统。因此,对于更好地理解插补原理及工程实践都有借鉴意义。

参考文献:

[1].周凯. PC数控原理、系统及应用[M].北京:机械工业出版社,2006.9.

[2].胡自化,张平.三次B样条曲线恒速进给实时插补算法的研究[J].北京:制造技术与

机床,2000 (8).

[3].周凯,陆启建.样条曲线采样插补技术[J].大连:组合机床与自动化加工技术,1998 (4).

[4].叶伯生,杨叔子.CNC系统中三次B-样条曲线的高速插补方法研究[J]. 武汉:中国机

械工程,1998.9(3).

[5].施法中. 计算机辅助几何设计与非均匀有理B样条[M]. 北京:北京航空航天大学出版,

1994.

三次样条插值作业题

例1 设)(x f 为定义在[0,3]上的函数,有下列函数值表: 且2.0)('0=x f ,1)('3-=x f ,试求区间[0,3]上满足上述条件的三次样条插值函数)(x s 本算法求解出的三次样条插值函数将写成三弯矩方程的形式: ) ()6()() 6()(6)(6)(211123 13 1j j j j j j j j j j j j j j j j x x h h M y x x h h M y x x h M x x h M x s -- + -- + -+ -= +++++其中,方程中的系数 j j h M 6, j j h M 61+,j j j j h h M y )6(2- , j j j j h h M y ) 6(211++- 将由Matlab 代码中的变量Coefs_1、Coefs_2、Coefs_3以及Coefs_4的值求出。 以下为Matlab 代码: %============================= % 本段代码解决作业题的例1 %============================= clear all clc % 自变量x 与因变量y ,两个边界条件的取值 IndVar = [0, 1, 2, 3]; DepVar = [0, 0.5, 2, 1.5]; LeftBoun = 0.2; RightBoun = -1; % 区间长度向量,其各元素为自变量各段的长度 h = zeros(1, length(IndVar) - 1); for i = 1 : length(IndVar) - 1 h(i) = IndVar(i + 1) - IndVar(i); end % 为向量μ赋值

三次样条插值方法的应用

CENTRAL SOUTH UNIVERSITY 数值分析实验报告

三次样条插值方法的应用 一、问题背景 分段低次插值函数往往具有很好的收敛性,计算过程简单,稳定性好,并且易于在在电子计算机上实现,但其光滑性较差,对于像高速飞机的机翼形线船体放样等型值线往往要求具有二阶光滑度,即有二阶连续导数,早期工程师制图时,把富有弹性的细长木条(即所谓的样条)用压铁固定在样点上,在其他地方让他自由弯曲,然后沿木条画下曲线,称为样条曲线。样条曲线实际上是由分段三次曲线并接而成,在连接点即样点上要求二阶导数连续,从数学上加以概括就得到数学样条这一概念。下面我们讨论最常用的三次样条函数及其应用。 二、数学模型 样条函数可以给出光滑的插值曲线(面),因此在数值逼近、常微分方程和偏微分方程的数值解及科学和工程的计算中起着重要的作用。 设区间[]b ,a 上给定有关划分b x x n =<<<= 10x a ,S 为[]b ,a 上满足下面条件的函数。 ● )(b a C S ,2∈; ● S 在每个子区间[]1,+i i x x 上是三次多项式。 则称S 为关于划分的三次样条函数。常用的三次样条函数的边界条件有三种类型: ● Ⅰ型 ()()n n n f x S f x S ''0'',==。 ● Ⅱ型 ()()n n n f x S f x S ''''0'''',==,其特殊情况为()()0''''==n n x S x S 。 ● Ⅲ型 ()() 3,2,1,0,0==j x S x S n j j ,此条件称为周期样条函数。 鉴于Ⅱ型三次样条插值函数在实际应用中的重要地位,在此主要对它进行详细介绍。 三、算法及流程 按照传统的编程方法,可将公式直接转换为MATLAB 可是别的语言即可;另一种是运用矩阵运算,发挥MATLAB 在矩阵运算上的优势。两种方法都可以方便地得到结果。方法二更直观,但计算系数时要特别注意。这里计算的是方法一的程序,采用的是Ⅱ型边界条件,取名为spline2.m 。 Matlab 代码如下: function s=spline2(x0,y0,y21,y2n,x) %s=spline2(x0,y0,y21,y2n,x) %x0,y0 are existed points,x are insert points,y21,y2n are the second

样条插值和曲线拟合

第三章 样条插值和曲线拟合 1.x y = 有如下的函数表 8。 解 先作差商表 4 167 1210 13 9 3 42015 11008 16012 4 60 13 1611 1 10 0-?- -- 故:8.2)48(5 1 2)8(1=-+=p 819047619.2) 98)(48(210 1 )48(512)8(2=----+=p 844444.2)98)(48)(18(3 4201) 48)(18(601 )18(311)8(3=---?+----+=p 6222.2)1(4781008 1478601) 18(86 1 )08(10)8(4=-???-??+---?+=p 已知 828427.28=,因此选定 )8(,16,9,42321p x x x ===最接近8。 利用Neville 方法得: xi 8-xi f(xi) 2.8284271 8 0 8 1 7 1 -1.33333333 3.3333333 2.4 4 4 2 2.866666667 2.6222222 2.8 2.8444444 9 -1 3 2.819047619 2.8571429 16 -8 4 f(8)= 2.828427125 xi 8-xi f(xi) 8 0 8 1 7 1 -1 1/3 3 1/3 2 2/5 4 4 2 2 13/15 2 28/45 2 4/5 2 38/45 9 -1 3 2 86/105 2 6/7 16 -8 4 已知 828427.28=,故选定)8(,16,9,42321 p x x x ====2.819047619最接近8.

贝塞尔曲线和B样条曲线(优质参考)

§4.3 贝塞尔曲线和B 样条曲线 在前面讨论的抛物样条和三次参数样条曲线,他们的共同特点是:生成的曲线通过所有给定的型值点。我们称之为“点点通过”。但在实际工作中,往往给出的型值点并不是十分精确,有的点仅仅是出于外观上的考虑。在这样的前提下,用精确的插值方法去一点点地插值运算就很不合算;另外,局部修改某些型值点,希望涉及到曲线的范围越小越好,这也是评价一种拟合方法好坏的指标之一。 针对以上要求,法国人Bezier 提出了一种参数曲线表示方法,称之为贝塞尔曲线。后来又经Gorgon, Riesenfeld 和Forrest 等人加以发展成为B 样条曲线。 一、 贝塞尔曲线 贝塞尔曲线是通过一组多边折线的各顶点来定义。在各顶点中,曲线经过第一点和最后一点,其余各点则定义曲线的导数、阶次和形状。第一条和最后一条则表示曲线起点和终点的切线方向。 1.数学表达式 n+1个顶点定义一个n 次贝塞尔曲线,其表达式为: )()(0,t B p t p n i n i i ∑== 10≤≤t ),...,2,1,0(n i p i =为各顶点的位置向量,)(,t B n i 为伯恩斯坦基函数 i n i n i t t n i n t B ---= )1()! 1(!! )(, 2.二次贝塞尔曲线 需要3个顶点,即210,,p p p ,将其代入曲线表达式: 2,222,112,00)(B p B p B p t p ++=

220202,021)1() 1()! 02(!0! 2t t t t t B +-=-=--= - 21212,122)1(2)1()! 12(!1! 2t t t t t t B -=-=--= - 22222,2)1()! 22(!2! 2t t t B =--= - 221202)22()21()(p t p t t p t t t p +-++-= [ ] ?? ?? ? ???????????????--=2102 0010221211p p p t t 10≤≤t 2102)21(2)1(2)(tp p t p t t p +-+-=' )(222)0(0110p p p p p -=+-=' 0)0(p p = )(222)1(1221p p p p p -=+-=' 2)1(p p = 当2 1 = t 时: 21021041214141)412212()412121(21p p p p p p p ++=+?-?++?-=?? ? ?? )](2 1 [21201p p p ++= 02210212)2121(2)121(221p p p p p p -=?+?-+-=?? ? ??'

三次样条插值在工程拟合中的应用

三次样条插值在工程拟合中的应用 摘要: 介绍了工程实验、勘测、设计中常见的列表函数之数值插值方法、程序实现及工程应用, 应用此法可方便地将任何列表函数计算到工程设计、施工所需要的精确程度, 给 出了各参数随主要参数变化而变化的光滑曲线, 并将其应用推广到一般情况. 关键词: 列表函数; 数值拟合; 三次样条插值; MA TLAB 程序设计与应用 在实际工程中, 广泛存在这样的问题: 根据设计要求和具体的工程条件, 在初始设计阶段会勘测得到若干组该工程的控制参数, 但这些参数之间彼此离散、不够密集, 利用它们来施工则不能满足施工的精度要求. 为了解决这一问题, 需要对已知的参数数据进行分析处理, 进行必要的插值、拟合, 以达到施工所需要的数据精度.本文以工程实例为基础, 对实际工程中插值方法的选取、插值的实现和插值曲线的拟合加以讨论, 提出能得到较合乎实际的插值方法, 给出一般工程人员就能实现的计算方法以及能得到光滑曲线的拟合方法. 1 工程应用实例 表1 所示的为某双曲拱坝体形原始参数[ 1 对于这一类工程列表参数有一个显著的特点:尽管不同工程的参数多寡不同, 但都是由n 行k 列的离散的列表数据给出, 虽然同一行代表某工程特定位置的几个参数(或高程参数, 或上游 半径参数?) , 但相邻两行由于位置距离太大, 两行各参数之间究竟存在什么数值关系, 对工 程设计、施工有何影响, 这是工程技术人员需要弄清楚的[ 2 ].以双曲拱坝为例, 它沿整个高程的变化是一个连续光滑的空间曲面. 从施工需要来看, 这些数据太稀疏, 难以满足设计、施工放样与钢筋配置等要求, 如果照此施工, 则有可能达不到工程精度、降低工程效率; 从计算机图形模拟来看, 要生成这个曲面仅由这一列表函数是得不到光滑曲面的, 是不可取的. 所以, 为使计算精确, 满足工程施工过程中任何断面位置、任意水平位置、任意高程位置所必需的施工数据与设计图纸, 保证工程施工的高品质,就要求作精确的数据处理.进一步分析可知, 在这 些参数表中, 各行的参数都随某一主要参数的变化而变化, 如上游半径参数随高程的变化而变化?, 它们的这种函数关系,在数值分析中有许多的方法可以求得. 但是哪种方法能更好、更合 乎实际地给出平滑曲线呢? 下面所选的插值方法能够较好地满足这一要求.

三次样条拟合范例

1设计目的、要求 对龙格函数2 2511 )(x x f += 在区间[-1,1]上取10=n 的等距节点,分别作多项式插值、三次样条插值和三次曲线拟合,画出)(x f 及各逼近函数的图形,比较各结果。 2设计原理 (1) 多项式插值:利用拉格朗日多项式插值的方法,其主要原理是拉格朗日多项 式,即: 01,,...,n x x x 表示待插值函数的1n +个节点, 0()()n n j k k j j k L x y l x y ===∑,其中0,1,...,j n =; 011011()...()()...() ()()...()...()...() k k n k k k k k k k n x x x x x x x x l x x x x x x x x x -+-+----= ---- (2) 三次样条插值:三次样条插值有三种方法,在本例中,我们选择第一边界条 件下的样条插值,即两端一阶导数已知的插值方法: 00'()'S x f = '()'n n S x f = (3)三次曲线拟合:本题中采用最小二乘法的三次多项式拟合。最小二乘拟合是 利用已知的数据得出一条直线或者曲线,使之在坐标系上与已知数据之间的距离的平方和最小。在本题中,n= 10,故有11个点,以这11个点的x 和 y 值为已知数据,进行三次多项式拟合,设该多项式为 23432xi i i i p a a x a x ax =+++,该拟合曲线只需2[]xi i p y -∑的值最小即可。 3采用软件、设备 计算机、matlab 软件

4设计内容 1、多项式插值: 在区间[] -上取10 1,1 n的等距节点,带入拉格朗日插值多项式中,求出各个节点的插值, = 并利用matlab软件建立m函数,画出其图形。 在matlab中建立一个lagrange.m文件,里面代码如下: %lagrange 函数 function y=lagrange(x0,y0,x) n=length(x0);m=length(x); for i=1:m z=x(i); s=0.0; for k=1:n p=1.0; for j=1:n if j~=k p=p*(z-x0(j))/(x0(k)-x0(j)); end end s=p*y0(k)+s; end y(i)=s; end 建立一个polynomial.m文件,用于多项式插值的实现,代码如下: %lagrange插值 x=[-1:0.2:1]; y=1./(1+25*x.^2); x0=[-1:0.02:1]; y0=lagrange(x,y,x0); y1=1./(1+25*x0.^2); plot(x0,y0,'--r') %插值曲线 hold on %原曲线 plot(x0,y1,'-b') 运行duoxiangshi.m文件,得到如下图形:

三次样条插值的MATLAB实现

MATLAB 程序设计期中考查 在许多问题中,通常根据实验、观测或经验得到的函数表或离散点上的信息,去研究分析函数的有关特性。其中插值法是一种最基本的方法,以下给出最基本的插值问题——三次样条插值的基本提法: 对插值区间[]b a ,进行划分:b x x x a n ≤

关于三次样条插值函数的学习报告(研究生)资料

学习报告—— 三次样条函数插值问题的讨论 班级:数学二班 学号:152111033 姓名:刘楠楠

样条函数: 由一些按照某种光滑条件分段拼接起来的多项式组成的函数;最常用的样条函数为三次样条函数,即由三次多项式组成,满足处处有二阶连续导数。 一、三次样条函数的定义: 对插值区间[,]a b 进行划分,设节点011n n a x x x x b -=<< <<=,若 函数2()[,]s x c a b ∈在每个小区间1[,]i i x x +上是三次多项式,则称其为三次样条函数。如果同时满足()()i i s x f x = (0,1,2)i n =,则称()s x 为()f x 在 [,]a b 上的三次样条函数。 二、三次样条函数的确定: 由定义可设:101212 1(),[,] (),[,]()(),[,] n n n s x x x x s x x x x s x s x x x x -∈??∈?=???∈?其中()k s x 为1[,]k k x x -上的三次 多项式,且满足11(),()k k k k k k s x y s x y --== (1,2,,k n = 由2()[,]s x C a b ∈可得:''''''()(),()(),k k k k s x s x s x s x -+-+== 有''1()(),k k k k s x s x -++= ''''1()(),(1 ,2,,1)k k k k s x s x k n -+ +==-, 已知每个()k s x 均为三次多项式,有四个待定系数,所以共有4n 个待定系数,需要4n 个方程才能求解。前面已经得到22(1)42n n n +-=-个方程,因此要唯一确定三次插值函数,还要附加2个条件,一般上,实际问题通常对样条函数在端点处的状态有要求,即所谓的边界条件。 1、第一类边界条件:给定函数在端点处的一阶导数,即 ''''00(),()n n s x f s x f == 2、第二类边界条件:给定函数在端点处的二阶导数,即

三次样条函数

计算方法实验报告 1、实验题目 三次样条插函数。 2、实验内容 三次样条插值是建立在Hermite 插值的基础上的。Hermite 插值是在一个区间上的插值,而三次样条插则是建立多个区间上插值,构造一个具有二阶光滑度的曲线,在求出给定点上对应的函数。本实验就是建立一个能根据三次样条插值函数求根的程序。 3、算法思想 给定一个区间,并把它分成n 等份,并且给出了每个结点对就的横坐标和纵坐标。利用程序输出给定插值点对应的值。横坐标设为:X 0, X 1, X 2, X 3, …X n 纵坐标为Y 0, Y 1, Y 2, …Y n ,设插点为u 。则令h k =X k+1-X k ,λk =1-+k k k h h h , μk =11--+k k k h h h , g k =3(1 11--+-+-k k k k k k k k h y y h y y λμ), 其中k=1,2,…,n-1 再根据第一类边界条件则可以确定公式6.16,再根据6.17解出方程中的m 向量,最后代入公式6.8求解。 4、源程序清单 #include #define N 21/*最大结点个数减一*/ void sanCi() { /*定义过程数据变量*/ float x[N],y[N],h[N]; /*横纵坐标及区间长度*/ float rr[N],uu[N],gg[N]; /*计算m 用的中间数组rr 、uu 、gg 分别对应:λ、μ、g 数组*/

float aa[N],bb[N],tt[N]; /*矩阵分解时用到的中间变量aa、bb、tt分别对应:α、β数组以及A=LU时中间矩阵*/ float mm[N]; /*最后要用到的系数m*/ int n,k,kv,chose; /* n为实际结点个数,k为下标,kv为最后确定k的值*/ float s,u; /*最后计算u对应的值*/ printf("请输入区间段数:"); scanf("%d",&n); /*输入结点个数*/ /*输入所有横坐标:*/ printf("输入所有横坐标:"); for(k=0; k<=n; k++) scanf("%f",&x[k]); /*输入对应纵坐标:*/ printf("输入对应纵坐标:"); for(k=0; k<=n; k++) scanf("%f",&y[k]); for(k=0; k

B样条曲线与曲面

四、B 样条曲线与曲面 Bezier 曲线具有很多优越性,但有二点不足: 1)特征多边形顶点数决定了它的阶次数,当n 较大时,不仅计算量增大,稳定性降低,且控制顶点对曲线的形状控制减弱; 2)不具有局部性,即修改一控制点对曲线产生全局性影响。 1972年Gordon 等用B 样条基代替Bernstein 基函数,从而改进上述缺点。 B样条曲线的数学表达式为: ∑=+?= n k n k k i n i u N P u P 0 ,,) ()( 在上式中,0 ≤ u ≤ 1; i= 0, 1, 2, …, m 所以可以看出:B样条曲线是分段定义的。如果给定 m+n+1 个顶点 Pi ( i=0, 1, 2,…, m+n),则可定义 m+1 段 n 次的参数曲线。 在以上表达式中: N k,n (u) 为 n 次B 样条基函数,也称B样条分段混合函数。其表达式为: ∑ -=+--+??-=k n j n j n j n k j k n u C n u N 0 1,)()1(!1)( 式中:0 ≤ u ≤1 k = 0, 1, 2, …, n 1.均匀B 样条曲线 1 一次均匀B 样条曲线的矩阵表示 空间n+1个顶点 i P (i = 0,1,…,n )定义n 段一次(k =0,1,n=1)均匀B 样条曲线,即每 相邻两个点可构造一曲线段P i (u ),其定义表达为: []10 ;,...,1 0111 1)(1≤≤=??? ?????????-=-u n i u u P i i i P P =(1-u )P i -1 + u P i = N 0,1(u )P i -1 + N 1,1(u )P i 第i 段曲线端点位置矢量:i i i i P P P P ==-)1(,)0(1,且一次均匀B 样条曲线就是控制多边 形。

三次样条差值拟合车门曲线

数学实验(三次样条)

数学实验(三次样条插值) 实验1: 某汽车制造商用三次样条插值设计车门的曲线,其中一段的数据如下: i x 0 1 2 3 4 5 6 7 8 9 10 i y 0.0 0.79 1.53 2.19 2.71 3.03 3.27 2.89 3.06 3.19 3.29 i y 0.8 0.2 用三次样条插值求)(10x S ,用软件绘制)(10x S 的图像,即车门的曲线。 1、计算)(10x S : 程序: // splineaaaa.cpp : 定义控制台应用程序的入口点。 //**三次样条差值** //***第一步,利用差商,代替导数,求差商; //***第二步,利用追赶法求解三对角方程组,得到M[i]; //***第三步,将求得值带入三次样条函数,求得S(x); #include #include #include #define N 10 double x[N + 1], fx[N + 1], h[N ], H[N ], f[N ], a[N + 1], b[N + 1], c[N + 1], M[N + 1], beta[N + 1], y[N + 1],s[N ];//定义变量数组; double tiaojian1, tiaojian2; //边界条件; //求插商; void chashang() { int i; for (i = 0; i <= N - 1; i++) h[i] = x[i + 1] - x[i]; for (i = 0; i <= N - 1; i++) f[i] = (fx[i + 1] - fx[i]) / (x[i + 1] - x[i]); for (i = 1; i <= N - 1; i++) { a[i] = h[i - 1] / (h[i - 1] + h[i]); b[i] = h[i] / (h[i - 1] + h[i]); c[i] = 3 * (a[i] * f[i - 1] + b[i] * f[i]); }

三次样条曲线插补模拟

主程序M文件(King.m): function varargout = King(varargin) % KING MATLAB code for King.fig % KING, by itself, creates a new KING or raises the existing % singleton*. % % H = KING returns the handle to a new KING or the handle to % the existing singleton*. % % KING('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in KING.M with the given input arguments. % % KING('Property','Value',...) creates a new KING or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before King_OpeningFcn gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to King_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES % Edit the above text to modify the response to help King % Last Modified by GUIDE v2.5 06-May-2013 21:39:33 % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @King_OpeningFcn, ... 'gui_OutputFcn', @King_OutputFcn, ... 'gui_LayoutFcn', [] , ... 'gui_Callback', []);

样条函数(三次样条)

样条插值是一种工业设计中常用的、得到平滑曲线的一种插值方法,三次样条又是其中用的较为广泛的一种。 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, …, n b. 每一分段都是三次多项式函数曲线 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。则可以推出

基于多项式插值与三次样条插值曲线拟合的比较

2015级《数值分析》课外课堂大作业 论文题目:基于多项式插值与三次样条插值曲线拟合的比较姓名:XXX 学号:XXXXXXXXXXX 学院:XXXXXXXXXXXXXXX 专业方向: XXXXXXXXXXXXXXX 联系方式:(QQ号) (手机号) 导师姓名: 完成人(亲笔)签字 二0一五年十二月

基于多项式插值与三次样条插值曲线拟合的比较 摘要:在数值计算中经常要计算函数,当函数只在有限点集上给定函数值要包含改点集的区间上用公式给出函数的简单表达式,这就涉及在已知区间上用简单函数逼近已知复杂函数问题。本文为了解决这类问题就采用多项式插值与三次样条插值两种插值法并利用MATLAB数值分析软件进行编程,实现相应数据的曲线拟合以获得最佳曲线模型与相应数据的曲线拟合,选出最优的插值法以解决所给数据的曲线拟合问题。 关键词:函数;多项式插值;三次样条插值;曲线拟合;MATLAB Abstract:In numerical analysis ,the function value is often calculated .when the function is only given a function point set ,the simple expression of the function is given by the interval .which involves the use of a simple function to approximate the known complex function .in order to solve this problem ,we use polynomial interpolation and cubic spline interpolation tow kind of interpolation method and use MATLAB numerical analysis software to program ,to achieve the curve fitting of the corresponding date to obtain the best cure fitting ,and to choose the best interpolation method to solve the problem of curve fitting to the date. Keyword: Function ; Polynomial interpolation ; Cubic spline interpolation ; Fitting of a curve ; MATLAB

三次B样条曲线插补算法的VC实现

三次B 样条曲线插补算法的VC 实现 孔凡国,郝尚华,钟廷志 (五邑大学 机电系,广东 江门 529020) 摘要:结合三次B 样条曲线的数学性质,理论分析了三次B 样条曲线的插补过程,推导出了三次B 样条曲线的插补运算公式。在对三次B 样条曲线进行研究的基础上,介绍三次B 样条曲线插补算法实现方法,并在VC 环境中对B 样条曲线的插补过程进行了实现,实现了数控插补的动态运算。 关键词:三次B 样条;插补;VC VC Implement of the Cubic B-spline curve Interpolation KONG Fan-guo ,HAO Shang-hua ,ZHONG Ting-zhi (Department of Mechatronics ,Wuyi University ,Jiangmen 529020,China ) Abstract :Combined with mathematics characters of the cubic B-spline curve, the interpolation process of the cubic B-spline curve is analyzed and calculation interpolation formula is deduced. Finally the cubic B-spline curve interpolation operator is programmed under the platform of VC to realize dynamic simulation. Keyword :cubic B-spline ;interpolation ;VC 在数控加工中用一小段直线或圆弧去拟合实际曲线,这种拟合方法就是“插补”。 它实质上是根据有限的信息完成“数据密化”的工作。插补的计算方法和计算精度影响到整个数控系统的精度和效率,因此插补算法对整个数控系统的性能指标至关重要,可以说插补是整个数控系统控制软件的核心。 1 三次B 样条曲线插补原理 B 样条曲线是对Bezier 曲线的改进,它不仅保留了Bezier 曲线的优点,而且具有局部控制的能力,B 样条曲线方程可为: 给定n+1个控制点i P (i =0,1,……,n ),也称为特征多边形的顶点,k 次(k +1阶)B 样条曲线的表达式是: ,0()()n i i k i P u N u ==∑P 1k n ≤≤ (1) 在上式中当k=3,i =0,1,2,3时,可得三次B 样条曲线方程是: 3,30()()i i i P u N u ==∑P 01u ≤≤ (2) 用矩阵形式可表示为: 013223133136301()1 01303061410P u u u u u --????????-??????=≤≤??????-???????? P P P P (3)

第三章 样条插值和曲线拟合

第三章样条插值与曲线拟合 学习目标:掌握分段线性插值、分段Hermite插值、样条插值 方法以及贝齐尔曲线拟合曲 线的方法。重点是分段线性 插值、分段Hermite插值、样 条插值。

1901年龙格(Runge )给出一个例子: ,定义在区间[-1,1]上,这是一个很光滑的函数,它的任意阶导数都存在,对它在[-1,1]上作等距节点插值时,插值多项式的情况见图1 §1 多项式插值的龙格现象 22511)(x x f +=

俄罗斯数学家伯恩斯坦(C.H.Bernstein )在1916年还给出如下定理。 定理1 函数 在[-1,1]上取n 个等距节点 ,构造n-1次插值多项式 ,当n 增大时,除了-1,0,1三点外,在[-1,1]中任何点处都不收敛于 。 x x f = )(1,11=-=n x x )(1 x P n -x 上述介绍的现象和定理告诉我们用高次插值多项式是不妥当的,从数值计算上来看也是这样,前一章介绍过的差分的误差传播会随阶数的提高越来越严重,因此,实践上作插值时一般只用一次、二次,最多用三次插值多项式。而提高插值精度的方法,可采用分段插值:

譬如在[a,b]上定义的连续函数 ,在[a,b]上取节点 构造一个分段一次多项式 ,即 在 上为 由一次插值的余项知在 上, )(x f b x x x x a n n =<<<<=-121 )(x L )(x L ],[1+i i x x i i i i i i i i x x x x x f x x x x x f --+--++++1111)()() )()(,,()()()(11++--=-=i i i i x x x x x x x f x L x f x R ],[1+i i x x 228 )(h M x R ≤

B样条曲线矩阵

五、B样条曲线的矩阵表示 1)二阶B样条曲线 设空间P0 P1, …., P n为n+1个控制点,节点矢量为其中每相邻两个控制点之间可以构造出一段二阶B样条曲线。其中的第j=i-1段二阶B样条曲线P j(t)的矩阵表示为: ; 其中,。 对于二阶均匀B样条曲线,其矩阵表示与非均匀B样条曲线的相同: 。 2)三阶B样条曲线 给定节点矢量为,n+1个控制点为P0,P1, …., P n。其中每相邻三个点可构造出一段二次的B样条曲线。其中的第j(=i-2)段三阶B样条曲线P j(u)的矩阵表示为: ; 其中, 。 对于三阶均匀B样条曲线,其矩阵表示为 。 三阶均匀B样条曲线的端点位置、一阶导数和二阶导数矢量分别为: P i,3(0)=(P i+P i+1)/2,

P i,3(1)=(P i+1+P i+2)/2; P'i,3(0)= P i+1-P i, P'i,3(1)=P i+2-P i+1, P'i,3(1)=P'i+1,3(0); P''i,3(t)=P i-2P i+1+P i+2 , 三阶均匀B样条曲线的首末点通过相应边的中点;首末点的切矢方向与相应边重合;二阶导数矢量等于该曲线的两条边矢量P i+1-P i和P i+2-P i+1所构成的对角线矢量。 三阶均匀B样条曲线段为抛物线,两相邻曲线段之间为一阶连续。 3)四阶B样条曲线 设节点矢量为,控制点为P0P1, …., P n,其中每相邻四个点可构造出一段三次的B样条曲线。其中的第j(=i-3)段三次B样条曲线P i(u)的矩阵表示为: ;。 其中, , m =-m2,2/3- m3,3-(t i+1-t i)2/[(t i+2-t i)(t i+2-t i-1)],m r,j是第r行第j列的元素。 3,2 第j(=i-3)段三次均匀B样条曲线P j(t)的矩阵表示: 。 三次均匀B样条曲线的端点位置、一阶导数和二阶导矢量分别为: P (0)=(P i+4P i+1+P i+2)/6, i,4 P (1)=(P i+1+4P i+2+P i+3)/6; i,4 P' (0)=(P i+2-P i)/2, i,4 P' (1)= (P i+3-P i+1)/2, i,4 P' (1)= P'i+1,3(0); i,3

三次样条插值

3.6三次样条插值 一、教学目标及基本要求 通过对本节的学习,使学生掌握三次样条插值方法。 二、教学内容及学时分配 本章主要介绍线性方程求根的迭代法的加速方法。要求 1.了解数值分析的三次样条函数及有关概念。 2.正确理解三次样条差值的基本思想、数学原理、算法设计。 3.了解插值是数值逼近的重要方法之一,正确理解三次样条插值的基本思想、计算公式、算法设计、程序框图设计和源程序。 4.掌握三次样条差值原理和程序设计方法。 三、教学重点难点 1.教学重点:三次样条函数、三次样条插值。 2. 教学难点:三次样条插值。 四、教学中应注意的问题 多媒体课堂教学为主。适当提问,加深学生对概念的理解,迭代加速的算法实现。 五、教案正文 一 样条函数的概念 分段线性插值在节点处没有连续的一阶导函数,其光滑性较差。对于飞机的机翼的型线及船舶型往往要求有二阶光滑度(即在节点处要求二阶导函数连续)。 样条函数的概念来源于工程设计的实践。所谓“样条”(spline)是早期工程设计中的一种绘图工具,它是富有弹性的细长条。绘图时,用压铁迫使样条通过指定的型值点,并保证样条的光滑外形。在绕度不大的情况下,样条的曲线即为三次样条函数。 二 几何意义

三 构造三次样条函数的理论分析 如上图所示,通过已知的六个点,构造5个三次多项式函数分别是:红色、蓝色、黑色、紫色和绿色5根曲线。为确定一根曲线,就需要确定4个待定系数,所以总共需要4*5=20个待定系数。 另外,分析需要的约束条件。 每一根函数都要过已知的左右两个点,则有5*2=10个约束条件。 此外,每两个相邻曲线在相邻点处要求充分光滑,即在连接点处左右两个函数在该点具有1次和2次的导函数连续,图中有4个“中间点”,故又有4*2=8个约束条件。 若在整个图形的两端在加2个约束条件,整个3次样条函数就确定了。如: ①左右两端点上的1阶导函数已知; ②左右两端点上的2阶导函数已知,如()()00n S x S x ′′′′==(称为自然边界条件); ③若原来的函数f(x)是以xn-x0为周期的周期函数,则y0=yn,且()()000n S x S x ′′′′+=?。

Matlab程序三次样条插值函数

已知一组数据点,编写一程序求解三次样条插值函数满足 并针对下面一组具体实验数据 求解,其中边界条件为. 解:Matlab计算程序为: clear clc x=[0.25 0.3 0.39 0.45 0.53] y=[0.5000 0.5477 0.6245 0.6708 0.7280] n=length(x); for i=1:n-1 h(i)=x(i+1)-x(i); end for i=1:n-2 k(i)=h(i+1)/(h(i)+h(i+1)); u(i)=h(i)/(h(i)+h(i+1)); end for i=1:n-2 gl(i)=3*(u(i)*(y(i+2)-y(i+1))/h(i+1)+k(i)*(y(i+1)-y(i))/h(i)); end g0=3*(y(2)-y(1))/h(1); g00=3*(y(n)-y(n-1))/h(n-1); g=[g0 gl g00]; g=transpose(g) k1=[k 1]; u1=[1 u]; Q=2*eye(5)+diag(u1,1)+diag(k1,-1) m=transpose(Q\g) syms X; for i=1:n-1 p1(i)=(1+2*(X-x(i))/h(i))*((X-x(i+1))/h(i))^2*y(i); p2(i)=(1-2*(X-x(i+1))/h(i))*((X-x(i))/h(i))^2*y(i+1); p3(i)=(X-x(i))*((X-x(i+1))/h(i))^2*m(i); p4(i)=(X-x(i+1))*((X-x(i))/h(i))^2*m(i+1);

相关文档
最新文档