三次样条插值函数在调洪演算中的应用
- 格式:pdf
- 大小:261.21 KB
- 文档页数:4
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在矩阵运算上的优势。
MATLAB作业给定一个时间序列,使用三次样条插值方法进行均匀内插(题目的相关说明:按题目要求编写一个MATLAB程序函数,并把自己编制程序所得的结果与MATLAB库函数分析结果进行对比。
)理论基础:时间序列的概念:时间序列是一种定量预测方法,又称简单外延法,时间序列分析是根据系统观测得到的时间序列数据,通过曲线拟合和参数估计来建立数学模型的理论与方法,时间序列分析可分为以下三种情况(1)把一个时间序列的值变动为N 个组成部分,通常可以分为四种 a、倾向变动,又称长期趋势变动 b、循环变动,又称周期变动 c、季节变动,即每年有规则的反复进行变动 d、不规则变动,即随机变动。
然后把这四个综合到一起得出预测的结果。
虽然分成这四部分,但这四部分之间的相互关系是怎么样的呢,目前一般采用相乘的关系,其实各个部分都是在其他部分作用的基础上进行作用的,所以采用相乘是有一定依据的,此种方法适合于短期预测和库存预测(2)把预测对象、预测目标和对预测的影响因素都看成为具有时序的,为时间的函数,而时间序列法就是研究预测对象自身变化过程及发展趋势,如果未来预测是线性的,其数学模型为YT+L=aT+bTL,YT+L为未来预测值,aT为截距,bT为斜率,L为由T到需要预测的单位时间数(如5年、10年等)(3)根据预测对象与影响因素之间的关系及影响程度来推算未来,与目标的相关因素很多,只能选择那些因果关系较强的为预测影响的因素,此时间序列法用于短期预测比较有效,若要用于长期预测,还需要结合其他方法才行。
三次样条插值的实际应用:在制造船体和汽车外形等工艺中传统的设计方法是,首先由设计人员按外形要求,给出外形曲线的一组离散点值,施工人员准备好有弹性的样条(一般用竹条或有弹性的钢条)和压铁,将压铁放在点的位置上,调整竹条的形状,使其自然光滑,这时竹条表示一条插值曲线,我们称为样条函数。
从数学上看,这一条近似于分段的三次多项式,在节点处具有一阶和二阶连续微商。
三次样条插值函数在城区河道水面线计算中的应用
随着我国城镇化的不断发展,河道曲线是居民社区的重要组成部分。
为确定城区河道的水面线,需要手动测量实测点之间的距离,并且根据测量结果拟合表达河道水面线的曲线。
然而,由于河道曲线的复杂性,传统拟合方法很难从误差数据中拟合出精确的曲线。
因此,已成为重要研究课题,如何从实测数据中准确拟合城区河道水面线,甚至以及如何提高城区河道水面线拟合的精度。
三次样条插值函数是一种经典的函数拟合方法,它按照实测点的位置,根据三次函数的性质,经过一些误差的最小化,用二次函数的系数来估计曲线的拐点。
它可以有效地表示给定的实测数据,并可以用于曲线拟合和数据拟合等应用中。
因此,三次样条插值函数在城区河道水面线计算中得到了广泛应用。
首先,三次样条插值函数可以有效地反映河道形状的复杂性。
这种插值函数可以最大程度地拟合河道水面线,从而得到更准确的曲线。
此外,由于曲线
拟合后求解出的拐点点是以矩阵形式存在的,可以更加容易的对曲线的起伏进行分析和改善。
这样可以有效提高河道水面线计算的准确度。
另外,三次样条插值函数还可以用于河道水面线设计。
研究者首先根据实际河道情况,利用三次样条插值函数拟合出一个基础曲线,然后增加实测点以改善曲线的拐点,或者增加实测点的数量,来对河道水面线进行修正,达到期望的设计要求。
综上所述,三次样条插值函数可以有效地表示河道的复杂性,可以拟合出更准确的曲线,同时也可以用于曲线设计,具有很强的实际意义。
因此,三次样条插值函数可以在城区河道水面线计算中得到有效应用,对于城区河道水面线计算和设计具有重要的意义。
三次样条插值在工程拟合中的应用摘要: 介绍了工程实验、勘测、设计中常见的列表函数之数值插值方法、程序实现及工程应用, 应用此法可方便地将任何列表函数计算到工程设计、施工所需要的精确程度, 给出了各参数随主要参数变化而变化的光滑曲线, 并将其应用推广到一般情况.关键词: 列表函数; 数值拟合; 三次样条插值; MA TLAB 程序设计与应用在实际工程中, 广泛存在这样的问题: 根据设计要求和具体的工程条件, 在初始设计阶段会勘测得到若干组该工程的控制参数, 但这些参数之间彼此离散、不够密集, 利用它们来施工则不能满足施工的精度要求. 为了解决这一问题, 需要对已知的参数数据进行分析处理, 进行必要的插值、拟合, 以达到施工所需要的数据精度.本文以工程实例为基础, 对实际工程中插值方法的选取、插值的实现和插值曲线的拟合加以讨论, 提出能得到较合乎实际的插值方法, 给出一般工程人员就能实现的计算方法以及能得到光滑曲线的拟合方法.1 工程应用实例表1 所示的为某双曲拱坝体形原始参数[ 1对于这一类工程列表参数有一个显著的特点:尽管不同工程的参数多寡不同, 但都是由n 行k列的离散的列表数据给出, 虽然同一行代表某工程特定位置的几个参数(或高程参数, 或上游半径参数⋯) , 但相邻两行由于位置距离太大, 两行各参数之间究竟存在什么数值关系, 对工程设计、施工有何影响, 这是工程技术人员需要弄清楚的[ 2 ].以双曲拱坝为例, 它沿整个高程的变化是一个连续光滑的空间曲面. 从施工需要来看, 这些数据太稀疏, 难以满足设计、施工放样与钢筋配置等要求, 如果照此施工, 则有可能达不到工程精度、降低工程效率; 从计算机图形模拟来看, 要生成这个曲面仅由这一列表函数是得不到光滑曲面的, 是不可取的. 所以, 为使计算精确, 满足工程施工过程中任何断面位置、任意水平位置、任意高程位置所必需的施工数据与设计图纸, 保证工程施工的高品质,就要求作精确的数据处理.进一步分析可知, 在这些参数表中, 各行的参数都随某一主要参数的变化而变化, 如上游半径参数随高程的变化而变化⋯, 它们的这种函数关系,在数值分析中有许多的方法可以求得. 但是哪种方法能更好、更合乎实际地给出平滑曲线呢? 下面所选的插值方法能够较好地满足这一要求.2 插值方法的选择在数值分析中, 这种插值过程可具体使用线性( 1inear ) 插值、三次样条( sp line ) 插值、立方(cub ic) 插值等方法, 在曲线插值法中最常用的是线性插值法, 它是估计两个主干点之间数值的最简单、最易实现的方法, 但采用线性插值法会有以下缺点:一是使得曲线不能显示连接主干点间的凸状弧线;二是使得从曲线导出远期曲线时会形成人为的“尖头”(sp ikes) [ 2 ].因此, 通常采用样条法来构造曲线. 样条法是用一平滑曲线来对各主干点进行拟合的方法. 它是通过构造多项式(一个或一组不同阶多项式) 来形成一条把所有主干点连接起来的平滑曲线. 一般常常选择三次曲线(根据三次插值样条函数所得的曲线) 进行拟合.通常, 在[a, b ]上的以x i ( i=0, 1, 2, ⋯, n) 为节点的三次插值样条函数[ 3 ] 定义如下: 给定区间[a, b ]的一个划分$: a= x 0< x 1< x 2< ⋯< x n = b和区间[a, b ]上的一个函数f (x ) , 若函数S (x ) 满足下列条件:(1) 一致通过n+ 1 个插值点(x i, y i) , 即S (x i) = f (x i) = y i ( i= 0, 1, 2, ⋯, n) ;(2) 二阶连续, 即S (x ) ∈C2 [a, b ];(3) 三次分段, 即在每一个小区间[ x i- 1, x i ]( i= 1, 2, ⋯, n) 上均为三次多项式.则称S (x ) 为函数f (x ) 的三次插值样条函数. 在构造三次插值样条函数时, 为确定S (x ) 应根据n+ 1个插值条件, 3n- 3 个连续条件以及给定的边界条件, 再利用节点处的一阶导数或二阶导数就可构造出三次插值样条函数. 在构造曲线过程中, 关键是估计三次多项式函数和确定样条函数形式.从以上理论分析可知, 三次活动曲线具有优良的数学特征, 而且用三次曲线去拟合时, 其结果要比线性插值估计更接近于工程实际情况[ 4 ]. 三次曲线法又可分为三次样条插值法和立方插值法. 在数值分析中有许多的方法, 限于篇幅, 本文仅以工程上用得较多的、具有优良效果的三次样条插值为例介绍插值方法.3 插值计算原理三次样条函数的数学原理及其子程序, 可见于多种数学著作[ 5 ]与算法手册. 这里作简单介绍.由于拱坝或其他工程曲面都是连续而光滑的空间曲面, 它的断面高程自坝底至坝顶均满足a= j 1< j 2< ⋯< j n= b,且每一位置(高程) 都对应有一组几何参数: y 1, y 2,⋯, y n. 如上游半径、下游半径、拱厚等(见表1 所列) , 因此对于一组高程插值点j 1= t1< t2< t3< ⋯< tm ≤j n ,可用三次自然样条函数S (x ) 求解它们在各插值点的函数值及其一阶导数S ′(x ) 和二阶导数S ″(x ).三次样条函数S (x ) 是用分段三次多项式逼近函数y = f (x ) , 且满足S (x ) 为区间[a, b ]上曲线y= f (x ) 的三次样条插值函数的三个条件.经两次积分, 可得三次样条插值函数S (x ) 的表达式为利用函数S (x ) 在样点x i 处具有连续二阶导数的条件, 再根据三次自然样条插值法, 增加自然边界条件得到如下方程组:解上述方程组, 求得M i ( i= 0, 1, 2, ⋯, n) 代入S (x ) 公式, 即可得每个子区间[ x i- 1, x i ] ( i= 1, 2,⋯, n) 上的三次样条函数.根据上述原理, 对工程原始列表数进行插值计算, 即可满足多种施工要4 插值方法的实现由以上可以看出, 三次样条插值的关键是寻找插值函数, 但插值函数寻找相当复杂, 对于一般的工程人员很难完成, 那么怎样才能使三次样条插值这一优秀的插值方法被人们所掌握呢?M athworks公司推出了功能强大的数学计算软件MA T2LAB[ 6 ] , 它不但使源程序编写简单、源程序代码简短(因为现成的三次样条插值函数可供使用) , 而且可以利用其强大的作图功能方便地拟合出光滑曲线. 因此, 本文选用MA TLAB 语言作为计算语言MA TLAB 程序设计原理:在以上参数表中, 各行的各参数都随高程这一主要参数的变化而变化, 根据它们变化的这种函数关系, 以高程为插值的已知节点(其中已知节点个数n = 6) , 为使插值结果一致通过这些节点, 以1. 36为步长调用插值函数进行插值.MA TLAB 程序设计算法:( 1) 写入原始参数矩阵, 以同一组参数为行,以同一种参数为列;(2) 产生插值的精度矩阵, 在最小值与最大值之间以1. 36 为步长, 产生矩阵;(3) 调用MA TLAB 中的三次样条插值函数,产生插值结果矩阵, 以对每一种参数的插值结果为行产生矩阵, 再转置.MA TLAB 程序设计:x 0= [470∶1. 36∶504 ];ou t= [x 0; sp line (x (1∶6) , x (7∶12) , x 0) ; sp line (x (1∶6) , x (13∶18) , x 0) ; sp line (x (1∶6) , x (19∶24) , x 0)sp line (x (1∶6) , x (25∶30) , x 0) ; sp line (x (1∶6) , x (31∶36) , x 0) ; sp line (x (1∶6) , x (37∶42) , x 0) ]′运算数据分析:(1) 这组运算数据一致通过已知节点, 而且偏差较小、数学处理和程序设计都大大简化(与文献[1 ]相比).(2) 经过以上的运算, 可以使原来仅有的6 组数据变为26 组, 而且还可以根据工程人员的需要对上述程序步长进行修改, 就可任意提高精度, 从而使工程人员能够更好地了解各种参数在各点的数据, 使工程精度大大提高5 插值曲线拟合当然, 无论以多么小的数为步长、无论给出多少组数据, 这些参数还是一些离散的数据, 在有些情况下, 工程人员要了解某些数据随某一主要参数的变化而变化的连续曲线, 这时, 可以在数据插值的基础上, 发挥MA TLAB 在图形处理上的强大功能, 对以上插值所得的数据进行曲线拟合, 以便更好地了解各参数随某一主要参数变化而变化的趋势.在以上插值数据的基础上,在上面程序的尾部编写MA TLAB 作图程序, 作图程序如下, 运行后得到图1 所示插值拟合曲线.p lo t (x 0, ou t (27∶52) ,‘- ’)ho ld onp lo t (x 0, ou t (53∶78) ,‘- + ’)p lo t (x 0, ou t (79∶104) ,‘∶’)p lo t (x 0, ou t (105∶130) ,‘- - ’)p lo t (x 0, ou t (131∶156) ,‘- 3 ’)p lo t (x 0, ou t (157∶182) ,‘- . ’)legend (‘上游半径’,‘下游半径’,‘拱厚’,‘半中心角’,‘圆心距’,‘淤沙高程’)ho ld offgrid on从图1 中, 可以看到各参数随高程的变化而变化的曲线, 从而更好地去了解各参数的变化规律,实现对工程各参数的整体把握, 这是一般数值处理方法所无法实现的.6 小结以上仅为三次样条插值及其实现方法的一个实例, 本文在插值方法的选择上选取了能够得到平滑曲线的、具有优良数学特征的三次样条插值法;在插值的实现上选取了具有强大计算功能的数学软件MA TLAB, 它能够以较少的编码, 较简单的语句实现这一复杂的计算, 并能得到较合理的结论; 在曲线的拟合上我们在插值的基础上同样选取具有强大图形处理功能的MA TLAB 软件, 从而形成较准确、较平滑、较合实际的曲线. 总之, 以上所提供的方法是三次样条插值和MA TLAB 科学计算语言在工程中应用的一个实例, 它能使计算较简便, 又能很好地满足光滑性要求, 使曲线也不失真.实现了工程数学、计算数学、程序设计的结合与简化.三次样条插值不仅在工程方面, 而且在测绘、勘察、预测等方面都有着十分广泛的应用参考文献:[ 1 ]彭荣利, 靳萍, 欧阳建国. 工程列表函数的数值拟合与应用[J ]. 武汉大学学报(工学版) , 2002, 35 (4) : 42~45.[ 2 ]王瑞华. 水利工程数据插值计算及图形处理[J ]. 农田水利与小水电, 1994 (8) : 15~19.[ 3 ]鞠时光, 郭伟刚. 实用三次样条插值函数[J ]. 小型微型计算机系统, 1992, 13 (9) : 20~23.[ 4 ]谢赤, 钟钻. 插值法在零息收益曲线构造中的实证研究[J ]. 数量经济技术经济研究, 2002 (4) : 31~34.[ 5 ]曾绍标, 韩秀芹. 工程数学基础[M ]. 北京: 科学出版社, 2001.[ 6 ]王沫然. MA TLAB 与科学计算(第2 版) [M ]. 北京: 电子工业出版社, 2003。
三次样条插值法根据李庆阳的《数值分析》这本教材中的讲解编写的程序,使用的是第一边界条件,用追赶法求解了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;}///////////////////////////////////////////////////////////////////// /////////////。
(建筑工程管理)三次样条插值在工程拟合中的应用三次样条插值于工程拟合中的应用摘要:介绍了工程实验、勘测、设计中常见的列表函数之数值插值方法、程序实现及工程应用,应用此法可方便地将任何列表函数计算到工程设计、施工所需要的精确程度,给出了各参数随主要参数变化而变化的光滑曲线,且将其应用推广到壹般情况.关键词:列表函数;数值拟合;三次样条插值;MATLAB程序设计和应用于实际工程中,广泛存于这样的问题:根据设计要求和具体的工程条件,于初始设计阶段会勘测得到若干组该工程的控制参数,但这些参数之间彼此离散、不够密集,利用它们来施工则不能满足施工的精度要求.为了解决这壹问题,需要对已知的参数数据进行分析处理,进行必要的插值、拟合,以达到施工所需要的数据精度.本文以工程实例为基础,对实际工程中插值方法的选取、插值的实现和插值曲线的拟合加以讨论,提出能得到较合乎实际的插值方法,给出壹般工程人员就能实现的计算方法以及能得到光滑曲线的拟合方法.1工程应用实例表1所示的为某双曲拱坝体形原始参数[1对于这壹类工程列表参数有壹个显著的特点:尽管不同工程的参数多寡不同,但均是由n行k列的离散的列表数据给出,虽然同壹行代表某工程特定位置的几个参数(或高程参数,或上游半径参数⋯),但相邻俩行由于位置距离太大,俩行各参数之间究竟存于什么数值关系,对工程设计、施工有何影响,这是工程技术人员需要弄清楚的[2].以双曲拱坝为例,它沿整个高程的变化是壹个连续光滑的空间曲面.从施工需要来见,这些数据太稀疏,难以满足设计、施工放样和钢筋配置等要求,如果照此施工,则有可能达不到工程精度、降低工程效率;从计算机图形模拟来见,要生成这个曲面仅由这壹列表函数是得不到光滑曲面的,是不可取的.所以,为使计算精确,满足工程施工过程中任何断面位置、任意水平位置、任意高程位置所必需的施工数据和设计图纸,保证工程施工的高品质,就要求作精确的数据处理.进壹步分析可知,于这些参数表中,各行的参数均随某壹主要参数的变化而变化,如上游半径参数随高程的变化而变化⋯,它们的这种函数关系,于数值分析中有许多的方法能够求得.可是哪种方法能更好、更合乎实际地给出平滑曲线呢?下面所选的插值方法能够较好地满足这壹要求.2插值方法的选择于数值分析中,这种插值过程可具体使用线性(1inear)插值、三次样条(spline)插值、立方(cubic)插值等方法,于曲线插值法中最常用的是线性插值法,它是估计俩个主干点之间数值的最简单、最易实现的方法,但采用线性插值法会有以下缺点:壹是使得曲线不能显示连接主干点间的凸状弧线;二是使得从曲线导出远期曲线时会形成人为的“尖头”(spikes)[2].因此,通常采用样条法来构造曲线.样条法是用壹平滑曲线来对各主干点进行拟合的方法.它是通过构造多项式(壹个或壹组不同阶多项式)来形成壹条把所有主干点连接起来的平滑曲线.壹般常常选择三次曲线(根据三次插值样条函数所得的曲线)进行拟合.通常,于[a,b]上的以xi(i=0,1,2,⋯,n)为节点的三次插值样条函数[3]定义如下:给定区间[a,b]的壹个划分$:a=x0<x1<x2<⋯<xn=b和区间[a,b]上的壹个函数f(x),若函数S(x)满足下列条件:(1)壹致通过n+1个插值点(xi,yi),即S(xi)=f(xi)=yi(i=0,1,2,⋯,n);(2)二阶连续,即S(x)∈C2[a,b];(3)三次分段,即于每壹个小区间[xi-1,xi](i=1,2,⋯,n)上均为三次多项式.则称S(x)为函数f(x)的三次插值样条函数.于构造三次插值样条函数时,为确定S(x)应根据n+1个插值条件,3n-3个连续条件以及给定的边界条件,再利用节点处的壹阶导数或二阶导数就可构造出三次插值样条函数.于构造曲线过程中,关键是估计三次多项式函数和确定样条函数形式.从之上理论分析可知,三次活动曲线具有优良的数学特征,而且用三次曲线去拟合时,其结果要比线性插值估计更接近于工程实际情况[4].三次曲线法又可分为三次样条插值法和立方插值法.于数值分析中有许多的方法,限于篇幅,本文仅以工程上用得较多的、具有优良效果的三次样条插值为例介绍插值方法.3插值计算原理三次样条函数的数学原理及其子程序,可见于多种数学著作[5]和算法手册.这里作简单介绍.由于拱坝或其他工程曲面均是连续而光滑的空间曲面,它的断面高程自坝底至坝顶均满足a=j1<j2<⋯<jn=b,且每壹位置(高程)均对应有壹组几何参数:y1,y2,⋯,yn.如上游半径、下游半径、拱厚等(见表1所列),因此对于壹组高程插值点j1=t1<t2<t3<⋯<tm≤jn,可用三次自然样条函数S(x)求解它们于各插值点的函数值及其壹阶导数S′(x)和二阶导数S″(x).三次样条函数S(x)是用分段三次多项式逼近函数y=f(x),且满足S(x)为区间[a,b]上曲线y=f(x)的三次样条插值函数的三个条件.经俩次积分,可得三次样条插值函数S(x)的表达式为利用函数S(x)于样点xi处具有连续二阶导数的条件,再根据三次自然样条插值法,增加自然边界条件得到如下方程组:解上述方程组,求得Mi(i=0,1,2,⋯,n)代入S(x)公式,即可得每个子区间[xi-1,xi](i=1,2,⋯,n)上的三次样条函数.根据上述原理,对工程原始列表数进行插值计算,即可满足多种施工要4插值方法的实现由之上能够见出,三次样条插值的关键是寻找插值函数,但插值函数寻找相当复杂,对于壹般的工程人员很难完成,那么怎样才能使三次样条插值这壹优秀的插值方法被人们所掌握呢?Mathworks公司推出了功能强大的数学计算软件MAT2LAB[6],它不但使源程序编写简单、源程序代码简短(因为现成的三次样条插值函数可供使用),而且能够利用其强大的作图功能方便地拟合出光滑曲线.因此,本文选用MATLAB语言作为计算语言MATLAB程序设计原理:于之上参数表中,各行的各参数均随高程这壹主要参数的变化而变化,根据它们变化的这种函数关系,以高程为插值的已知节点(其中已知节点个数n=6),为使插值结果壹致通过这些节点,以1.36为步长调用插值函数进行插值.MATLAB程序设计算法:(1)写入原始参数矩阵,以同壹组参数为行,以同壹种参数为列;(2)产生插值的精度矩阵,于最小值和最大值之间以1.36为步长,产生矩阵;(3)调用MATLAB中的三次样条插值函数,产生插值结果矩阵,以对每壹种参数的插值结果为行产生矩阵,再转置.MATLAB程序设计:x0=[470∶1.36∶504];out=[x0;spline(x(1∶6),x(7∶12),x0);spline(x(1∶6),x(13∶18),x0);spline(x(1∶6),x(19∶24),x0) spline(x(1∶6),x(25∶30),x0);spline(x(1∶6),x(31∶36),x0);spline(x(1∶6),x(37∶42),x0)]′运算数据分析:(1)这组运算数据壹致通过已知节点,而且偏差较小、数学处理和程序设计均大大简化(和文献[1]相比).(2)经过之上的运算,能够使原来仅有的6组数据变为26组,而且仍能够根据工程人员的需要对上述程序步长进行修改,就可任意提高精度,从而使工程人员能够更好地了解各种参数于各点的数据,使工程精度大大提高5插值曲线拟合当然,无论以多么小的数为步长、无论给出多少组数据,这些参数仍是壹些离散的数据,于有些情况下,工程人员要了解某些数据随某壹主要参数的变化而变化的连续曲线,这时,能够于数据插值的基础上,发挥MATLAB于图形处理上的强大功能,对之上插值所得的数据进行曲线拟合,以便更好地了解各参数随某壹主要参数变化而变化的趋势.于之上插值数据的基础上,于上面程序的尾部编写MATLAB作图程序,作图程序如下,运行后得到图1所示插值拟合曲线.plot(x0,out(27∶52),‘-’) holdonplot(x0,out(53∶78),‘-+’)plot(x0,out(79∶104),‘∶’)plot(x0,out(105∶130),‘--’)plot(x0,out(131∶156),‘-3’)plot(x0,out(157∶182),‘-.’)legend(‘上游半径’,‘下游半径’,‘拱厚’,‘半中心角’,‘圆心距’,‘淤沙高程’)holdoffgridon从图1中,能够见到各参数随高程的变化而变化的曲线,从而更好地去了解各参数的变化规律,实现对工程各参数的整体把握,这是壹般数值处理方法所无法实现的.6小结之上仅为三次样条插值及其实现方法的壹个实例,本文于插值方法的选择上选取了能够得到平滑曲线的、具有优良数学特征的三次样条插值法;于插值的实现上选取了具有强大计算功能的数学软件MATLAB,它能够以较少的编码,较简单的语句实现这壹复杂的计算,且能得到较合理的结论;于曲线的拟合上我们于插值的基础上同样选取具有强大图形处理功能的MATLAB软件,从而形成较准确、较平滑、较合实际的曲线.总之,之上所提供的方法是三次样条插值和MATLAB科学计算语言于工程中应用的壹个实例,它能使计算较简便,又能很好地满足光滑性要求,使曲线也不失真.实现了工程数学、计算数学、程序设计的结合和简化.三次样条插值不仅于工程方面,而且于测绘、勘察、预测等方面均有着十分广泛的应用参考文献:[1]彭荣利,靳萍,欧阳建国.工程列表函数的数值拟合和应用[J].武汉大学学报(工学版),2002,35(4):42~45.[2]王瑞华.水利工程数据插值计算及图形处理[J].农田水利和小水电,1994(8):15~19.[3]鞠时光,郭伟刚.实用三次样条插值函数[J].小型微型计算机系统,1992,13(9):20~23.[4]谢赤,钟钻.插值法于零息收益曲线构造中的实证研究[J].数量经济技术经济研究,2002(4):31~34.[5]曾绍标,韩秀芹.工程数学基础[M].:科学出版社,2001.[6]王沫然.MATLAB和科学计算(第2版)[M].:电子工业出版社,2003。
三次样条插值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和⽂章所述⽅法进⾏插值计算,对⽐计算结果。