机械CAD/CAM基础
实验报告
实验名称:
实验日期: 年 月 日
一、实验目的
二、实验设备
三、实验步骤
四、实验总结
实验名称:
实验日期: 年 月 日
一、实验目的
二、实验设备
三、实验步骤
四、实验总结
实验名称:
实验日期: 年 月 日
一、实验目的
二、实验设备
三、实验步骤
四、实验总结
第二篇:机械CADCAM实验报告
.
**大学实验报告(计算机类)
开课学院及实验室:机械工程与自动化专业实验中心 实验时间 : 年 月 日
一、实验目的
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),从而得插值后的函数值为。根据插值函数g(x,y)的构造方法分为:
直线-直线插值
以构造曲面g(x,y)代替曲面f(x,y)。K为插值结果。如图1所示。
抛物线-直线插值
将AB和CD改为抛物线,k为插值结果K在xoy平面上的投影。如图2所示。
抛物线-抛物线插值
u,v,w三点的取得均由抛物线插值而来,k为插值结果K在xoy平面上的投影,要得到k点还需进行一次抛物线插值。如图2所示。
三、使用环境
能运行C等高级语言或面向对象程序设计语言的计算机平台,具体参数以实验室所配置计算机为准。
四、核心代码及调试过程
一元函数C程序代码:
#include<stdio.h>
#include<math.h>
void main()
{
int i;
int n=4;
float xi,yi;
float x[4]={1,2,3,4};
float y[4]={3,6,4,8};
scanf("%f",&xi);
if((xi<x[0]) || (xi>x[n-1]))
printf("%s\n","输入数据越界!");
else
{
for(i=1;i<n;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<stdio.h>
#include<math.h>
void main()
{
int i;
int n=4;
float xi,yi;
float x[4]={1,2,3,4};
float y[4]={3,6,4,8};
scanf("%f",&xi);
if((xi<x[0]) || (xi>x[n-1]))
printf("%s\n","输入数据越界!");
else
{
for(i=1;i<n;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;
}
}
}
二元函数插值:
#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");
}
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);
}
五、总结
1.一元函数插值法适合查询哪类数据?
答:一元函数插值法适合查询二维平面的离散型数据。
2.二元函数插值法适合查询哪种数据?
答:二元函数插值法适合查询三维空间内选定的几个点。
3.抛物线插值时对节点的选择有何要求?
(1)若︱X-Xi-1︱<=︱X-Xi︱,即X靠近Xi-1点,则选Xi-2,Xi-1,Xi。
(2)若︱X-Xi-1︱>︱X-Xi︱,即X靠近Xi点,则选Xi-1,Xi, Xi+1。
(3)若X1<=X<=X2, 即X靠近表头,则选X1,X2,X3。
(4) 若Xn-1<=X<=Xn,即X靠近表尾,则选Xn-1,X,Xn。
4.实验体会:
机械CAD上机实验总体而言难度较大,虽然当时我选修了C语言编程,但是由于是选修的,就没太过认真的了解和分析,于是在CAD上机的过程中就遇到了非常大的困难。但是在老师的帮助指导下,在同学的耐心帮助下,程序这个问题也慢慢就好些了。而在深入学习机械CAD的过程中,发现CAD系统可以与其他系统集成,成为更有效的计算机辅助系统,让人们的生产生活更加的方便和准确。