机械CADCAM实验报告

  • 格式:doc
  • 大小:149.00 KB
  • 文档页数:7

1 .

**大学实验报告(计算机类)

开课学院及实验室:机械工程与自动化专业实验中心 实验时间 :

年 月 日

学 生 姓 名 学 号 成 绩

学生所在学院 机械工程与自动化学院 年级/专业/班

课 程 名 称 机械CAD/CAM 课 程 代 码

实验项目名称 一元函数和二元函数插值编程 项 目 代 码 1

指 导 教 师 项 目 学 分

一、实验目的

1、 了解CAD中对设计资料的程序化处理方法;

2、 编程实现一元函数插值法查询工程数据,增加对工程手册的数据处理的感性认识。

二、内容与设计思想

插值法

设法构造某个简单的函数Y=P(x)作为列表函数f(x)的近似表达式,然后计算P(x)值以得到f(x)的近似值。并且使f(xi)-P(xi)=0 I=1,2,…,n成立。P(x)就称为f(x)的插值函数,点x1,x2,…,xn称为插值节点。

线性插值

已知插值点P 的相邻两点 ,

,则:

拉格朗日插值

为多次插值公式,考虑进其他节点位置,可提高插值精度。

二次插值多项式为(抛物线插值):

二元列表函数的插值,从几何意义上讲是在三维空间内选定几个点,通过这些点构造一块曲面g(x,y),用它近似地表示在这区间内原有的曲面f(x,y),从而得插值后的函数值为)y,x(gzkkk。根据插值函数g(x,y)的构造方法分为:

直线-直线插值

以构造曲面g(x,y)代替曲面f(x,y)。K为插值结果。如图1所示。

抛物线-直线插值 第 组

)x(fy11)x(fy22)())((11iiiiiixxxxyyyy312)()()(iiixfxAxf))(())(()(1111iiiiiiixxxxxxxxxAY

X O 1x2xx2y1yy线性插值 2 将AB和CD改为抛物线,k为插值结果K在xoy平面上的投影。如图2所示。

抛物线-抛物线插值

u,v,w三点的取得均由抛物线插值而来,k为插值结果K在xoy平面上的投影,要得到k点还需进行一次抛物线插值。如图2所示。

三、使用环境

能运行C等高级语言或面向对象程序设计语言的计算机平台,具体参数以实验室所配置计算机为准。

四、核心代码及调试过程 一元函数C程序代码:

#include

#include

void main()

{

int i;

int n=4;

float xi,yi;

float x[4]={1,2,3,4};

float y[4]={3,6,4,8}; 1jyjy1jy1ixix1ixabecdfrstuvwkyox图1直线-直线插值几何示意图 图2直线-抛物线插值

3

scanf("%f",&xi);

if((xix[n-1]))

printf("%s\n","输入数据越界!");

else

{

for(i=1;i

{

if(xi<=x[i])

{

i=i-1;

yi=(xi-x[i+1])*y[i]/(x[i]-x[i+1])+(xi-x[i])*y[i+1]/(x[i+1]-x[i]);

printf(" yi=%4.1f\n", yi);

break;

}

}

}

}

抛物线函数插值:

#include

#include

void main()

{

int i;

int n=4;

float xi,yi;

4

float x[4]={1,2,3,4};

float y[4]={3,6,4,8};

scanf("%f",&xi);

if((xix[n-1]))

printf("%s\n","输入数据越界!");

else

{

for(i=1;i

{

if(xi<=x[i])

{

if(i==1)

{

yi=(xi-x[i+1])*(xi-x[i])*y[i-1]/((x[i-1]-x[i])*(x[i-1]-x[i+1])) +

(xi-x[i-1])*(xi-x[i+1])*y[i]/((x[i]-x[i-1])*(x[i]-x[i+1]))+ (xi-x[i-1])*(xi-x[i])*y[i+1]/((x[i+1]-x[i-1])*(x[i+1]-x[i]));

printf(" yi=%4.1f\n", yi);

break;

}

else

{

if((xi-x[i-1])<(x[i]-xi))

i=i-1;

yi=(xi-x[i+1])*(xi-x[i])*y[i-1]/((x[i-1]-x[i])*(x[i-1]-x[i+1])) +

(xi-x[i-1])*(xi-x[i+1])*y[i]/((x[i]-x[i-1])*(x[i]-x[i+1]))+ (xi-x[i-1])*(xi-x[i])*y[i+1]/((x[i+1]-x[i-1])*(x[i+1]-x[i]));

printf(" yi=%4.1f\n", yi);

break;

}

5 }

}

二元函数插值:

#include "stdio.h"

#include "math.h"

float line(float xi,float yi,float xj,float yj,float x)

{

float y;

y=(x-xi)*(yj-yi)/(xj-xi)+yi;

return y;

}

float parabolic(float xm,float ym,float xi,float yi,float xk,float yk,float x)

{

float y;

y=(x-xi)/(xm-xi)*(x-xk)/(xm-xk)*ym + (x-xm)/(xi-xm)*(x-xk)/(xi-xk)*yi + (x-xm)/(xk-xm)*(x-xi)/(xk-xi)*yk;//公式3-3;

return y;

}

main()

{

float

D[6][10]={{2.59,2.40,2.33,2.21,2.09,2.00,1.88,1.80,1.72,1.01},{1.88,1.80,1.73,1.68,1.62,1.59,1.53,1.49,1.44,1.36},\

{1.64,1.59,1.55,1.52,1.48,1.46,1.42,1.38,1.34,1.26},{1.49,1.46,1.44,1.42,1.39,1.38,1.34,1.31,1.27,1.20},\

{1.39,1.37,1.35,1.34,1.33,1.31,1.29,1.27,1.22,1.17},{1.32,1.31,1.30,1.29,1.27,1.26,1.25,1.23,1.20,1.14}};

float x[6]={0.04,0.10,0.15,0.20,0.25,0.30};

float y[10]={6,3,2,1.5,1.2,1.1,1.05,1.03,1.02,1.01};

float xk,yk,zk;

float xa,xb,xc,xd,ya,yb,yc,yd;

float za,zb,zc,zd,ze,zf;

int i,j;

while(1)

{

printf("请输入r/d\n");

scanf("%f",&xk);

if(xk>=x[0] &&xk<=x[5])

break;

else

printf("越界\n");

}

6

while(1)

{

printf("请输入D/d\n");

scanf("%f",&yk);

if(yk>=y[9] && yk<=y[0])

break;

else

printf("越界\n");

}

for(i=1;i<6;i++)

{

if(xk<=x[i])

{

xa=xc=x[i-1];

xb=xd=x[i];

break;

}

}

for(j=1;j<10;j++)

{

if(yk>=y[j])

{

ya=yb=y[j-1];

yc=yd=y[j];

break;

}

}

za=D[i-1][j-1];

zb=D[i][j-1];

zc=D[i-1][j];

zd=D[i][j];

ze=line(xa,za,xb,zb,xk);

zf=line(xc,zc,xd,zd,xk);

zk=line(ya,ze,yc,zf,yk);

printf("%4.2f\n ", zk);

}

五、总结