- 1、本文档共21页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)