数值分析算法设计.doc

  1. 1、本文档共21页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数值分析算法设计

一、题目 在飞机制造业中,机翼的加工是一项关键技术。由于机翼的尺寸很大,通常在图纸中只能标出某些关键点的数据。下表给出的是某型号飞机的机翼上缘轮廓线的部分数据。 x 0.00 4.74 9.50 19.00 38.00 57.00 76.00 y 0.00 5.32 8.10 11.97 16.15 17.10 16.34 x 95.00 114.00 133.00 152.00 171.00 190.00 y 14.63 12.16 9.69 7.03 3.99 0.00 但是,在使用数控机床加工机翼时,由于机床走刀只能沿x方向和y方向走非常小的步长,因此机床编程时需要计算出轮廓线上x坐标每改变1个单位时y的相应坐标。 请根据加工要求分别用分段线性插值法、分段二次多项式插值法、分段三次多项式插值法和三次样条插值法,对上表中的数据进行细化。 二、算法设计 程序中有三个函数实现对数据的处理,分段线性插值,分段二次多项式插值,分段三次多项式插值都在main函数中实现,三中处理方法均采用Lagrange插值多项式的方法。三次样条插值在yt函数中实现。具体设计如下: 在次数不高于n的多项式集合 , 中寻求多项式 使其满足条件 i=(0,1,…,n) 满足此种条件的多项式成为n次插值多项式。 令取插值基函数为 (k=0,1,…,n) 显然,都是n次多项式,且具有下列性质 因此,函数组{}必在点集{}上线性无关,并且 就是满足插值条件的n次插值多项式。 分段线性插值法 将区间按照x的变化分成几个区间,在每段区间上运用线性定义计算区间内部的步长值。 即在Lagrange插值公式中,令n=1 分段二次多项式插值 在x所在区间上相邻三点之间做出一条曲线,在中间一点与其余两点中点之间的步长值则取曲线上的值,依次计算下去,在两个端点附近的值则按照相邻的曲线上的取值选取。 即在Lagrange插值公式中,令n=2 (3) 分段三次多项式插值 取在x上相邻的四点做曲线,只取其前三点区间内的值作为函数值。依次计算即得函数值。 即在Lagrange插值公式中,令n=3 (4)三次样条插值 对于区间[a,b]上的一个分划 π: 如果函数s(x)满足条件 s(x)在每个子区间(i=0,1,…,n-1)上是次数不高于k 的多项式; s(x)在区间(a,b)上有k-1阶连续导数。 则称s(x)是定义在[a,b]对应于分划π的k次多项式插值。 对应于k次插值共需要确定n+k个系数,在题目中共需要n+3个系数,依据题目所给定条件,程序中选择第三种边界条件。 在选择第三种边界条件时,将数组进行了周期性的扩充。在负半周将程序驻足完整。形成两个新的函数组dx,dy.在新的数组基础上应用第三种边界条件 既将 代入n元k次多项式函数,得到方程组 求解方程组,将所的M值代入 , 即可求得相应的函数值。 在求解M值时,程序中采用的是追赶法。 三、全部源程序 # include stdio.h # include math.h # define N 13 # define M 191 double x[N]={0.00,4.74,9.50,19.00,38.00,57.00,76.00,95.00,114.00,133.00,152.00,171.00,190.00}; double y[N]={0.00,5.32,8.10,11.97,16.15,17.10,16.34,14.63,12.16,9.69,7.03,3.99,0.00}; void yt(); double div2(int i,int j) { double m; m=(i-x[j+1])*(i-x[j+2])/(x[j]-x[j+1])/(x[j]-x[j+2])*y[j]; m+=(i-x[j])*(i-x[j+2])/(x[j+1]-x[j])/(x[j+1]-x[j+2])*y[j+1]; m+=(i-x[j])*(i-x[j+1])/(x[j+2]-x[j])/(x[j+2]-x[j+1])*y[j+2]; return(m); } void main() { int i=0,j=0; double solu1[M]={0},solu2[M]={0},solu3[M]={0}; /*分段线性插值*/ for(i=0;iM-1;i++) { if((i=x[j])(ix[j+1])) { solu1[i]=(i-x[j+1])/(x[j]-x[j+1])*y[j]+(i-x[j])/(x[j+1]-x[j])*y[j+1]; } else { i--; j++; } } solu1[M]=

您可能关注的文档

文档评论(0)

ligennv1314 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档