资源预览内容
第1页 / 共63页
第2页 / 共63页
第3页 / 共63页
第4页 / 共63页
第5页 / 共63页
第6页 / 共63页
第7页 / 共63页
第8页 / 共63页
第9页 / 共63页
第10页 / 共63页
亲,该文档总共63页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第二章计算机数据处理,引言 在机械产品的设计过程中,经常需要引用一系列标准、规范、计算公式及大量的数据资料,如数据列表、实验曲线等,在传统的设计过程中,设计人员通过查阅相关的设计手册来获得;在设计手册中,这些资料多以数表和线图的形式给出,故在进行计算机辅助设计过程中,需将数表及线图转换成计算机能够处理的形式,以方便在使用过程中通过应用程序进行调用和检索查询,这就涉及到工程数据的计算机处理。 教学目的 本章让学生在学习了几种工程数据计算机处理方法后,可以比较和分析各种工程数据计算机处理方法的特点,并自己动手利用高级语言编制相关程序。,常用设计数据或资料的计算机处理 主要包括三种方法,数组化: 将数表中的数据或将线图离散化成数表的数据编入程序,存入一维、二维或多维数组。 文件化: 数据量较大时,将数表中的数据或将线图离散化成数表的数据,存入数据文件或数据库。数据独立于应用程序 公式化:将数表或线图转化为公式编入程序。,工程数据的计算机处理主要包括三种方法,工程数据程序化 将工程数据直接编写在应用程序中,在应用程序内部对数据进行查询、处理和计算,它包括数表程序化和线图程序化 建立数据文件 将数据建立成一个独立的数据文件,并单独存储,使它与应用程序分开,需要时,通过应用程序来打开、调用和关闭数据文件,并进行相关处理 建立数据库 将工程数据存放在数据库中,根据需要通过应用程序来打开、调用和关闭数据库文件,并进行相关处理,2.1 数表的计算机处理技术,对于数据量小的数表,可用计算机算法语言对一维、二维或多维数组进行赋值的方法分别对一维、二维或多维数组进行程序化处理。 对于数据量大的数表,可存入数据文件或数据库中。 对于列表函数,还可进行公式化处理。,2.1.1 数表的数组化,1、一维数组 2、二维数组 直接查找与插值法 3、多维数组,2.1.2 数表的文件化,对于数据量大的数表或数图很多,需要将数表进行文件化处理。,2.1 数表程序化,在计算机辅助设计过程中,数表程序化是指将数表中的数据以数组、数据文件、拟合公式和插值公式的形式给出,并利用应用程序来处理、调用和检索查询 在工程设计手册中,标准与规范多是以数表的形式给出,例如下面表格就是工程设计手册中V带传动设计中带轮包角系数表,通过带轮包角即可查到包角系数,带轮包角系数表,数组程序化方法,用数组的形式程序化数表 插值 数表拟合公式化,1.用数组的形式程序化数表,设计手册中的数表可以用数组的形式将其程序化。对于一维数表,其数据在程序化时可用一维数组来标识,例如对下面带轮包角系数表,用数组的形式进行程序化,其程序代码见下页:,带轮包角系数表,用数组的形式程序化数表,C语言程序代码如下: float fastserach(a,ai,ki) int i,n=10; float a, ai12,ki12; kin+1=0; ain+1=a; for (i=1;in+1;i+) if ( a = aii ) ,说明:n 为记录数;ain+1、kin+1为增设的欲检索关键字和对应的空记录,2.插值,数表函数:在工程设计手册数表中的数据之间多数存在一定的函数关系,将其称为数表函数,它们有些是精确公式,有些是经验公式。为了便于设计人员查询,在手册中多将其以数表的形式表示 插值方法:所谓插值方法,即在插值点附近选取几个合适的节点,过这些选取的节点构造一个函数y=p(x)作为列表函数f(x)的近似表达式,然后计算p(x)的值以求得f(x)的值,常用插值方法,线性插值 抛物线插值 拉格朗日一元n次插值,1)线性插值,线性插值是利用通过两节点(x1,y1)和(x2,y2)的直线方程p(x)来代替原来的列表函数f(x)。设插值点为(x,y),其线性插值公式为:,线性插值存在一定的误差,当两点间隔较小、精度要求不高时,可以采用此种方法。,线性插值原理图,2)抛物线插值,抛物线插值是利用通过三个节点(x1,y1)、(x2,y2) 和(x3,y3)的抛物线方程p(x)来代替原来的数表函数f(x),其抛物线插值公式为:,抛物线插值比线性插值精度高,抛物线插值原理图,程序举例:,float parabola (n,x,xi,yi) int n; float x,xi,yi; int i,j,k; float y,m; k=0; for (i=0;i=n-1;i+) if (x-xii)*(x-xii+1)=0) k=i;break; if (k=i) k=i; else if (fabs(x-xi0)fabs(x-xin) k=0; else k=n-1; if (k=n-1) | (k != 0) ,y=0; for (i=k;i=k+2;i+) m=1.0; for (j=k;j=k+2;j+) if (j!=i) m=m*(x-xij)/(xii-xij); y=y+m*yii; return(y); m=1.0; for (j=k;j=k+2;j+) if (j!=i) m=m*(x-xij)/(xii-xij); y=y+m*yii; return(y); ,接上页,说明:n 为插值结点数减1;xi,yi为为插值结点和对应的函数值,3)拉格朗日一元n次插值,设有n+1个互不相等的一元函数节点(xi,yi),(i=0,1,2,n),xi为插值节点,yi为对应的函数值,即插值结果,现存在一个阶次不超过n次的代数多项式p(x)为,它满足插值条件,则称p(x)为在n+1个互不相等节点(xi,yi)上的拉格朗日n次插值公式。,拉格朗日插值公式具体表达式为,程序举例:,float lagrange(n,x,xi,yi) int n; float x,xi,yi; int i,j; float y,m; y=0; for (i=0;in;i+) m=1; for (j=0;jn;j+) if ( j != i ) m=m*(x-xj)/(xi-xj); y=y+m*yi; return(y); ,说明:n 为插值节点数减1;xi,yi为为插值节点和对应的函数值,4)二维数表插值,工程设计手册中,许多数据是以二维数表的形式存在,也可以用插值的方法来求得。首先给出互不相等的二元函数插值节点值xi(i=1,2,n),yj(j=1,2,m),其对应的函数值zij (i=1,2,n;j=1,2,m),用二元三点插值多项式可以求出插值自变量(x,y)所对应的函数值z,即插值结果,其表达式如下:,程序举例:,float lagrange2(n,m,x,y,z,xz,yz) int n,m; float x,y,z,xz,yz; float zz,ml; int i,j,k,l,p,q; p=-1; q=-1; zz=0; for (i=0;i=n-1;i+) if (xz-xi)*(xz-xi+1)=0) p=i;break; if (p=i) p=i; else if (fabs(xz-x0)fabs(xz-xn) p=0; else p=n-1;,for (j=0;j=m-1;j+) if (yz-yj)*(yz-j+1)=0) q=j;break; if ( q=j ) q=j; else if (fabs(yz-y0)fabs(yz-ym) q=0; else q=m-1; if ( p=n-1 ) | ( p!=0 ) i+) ,接上页,for (j=q;j=q+2;j+) ml=zi*m+j; for (l=q;l=q+2;l+) if (l!=j) ml=ml*(yz-yl)/(yj-yl); for (k=p;k=p+2;k+) if (k!=i) ml=ml*(xz-xk)/(xi-xk); zz=zz+ml; return(zz); ,接上页,3.数表拟合公式化,对于数据量需求较大的计算程序需要利用数学公式,即拟合公式来表述数表中的数据,其中最常用的是最小二乘法拟合公式,最小二乘法,最小二乘法就是将离散数据(数表中的数据)近似地表示为一连续函数pn(x),通过找出一条平滑的最佳拟合曲线来代替离散的数表数据,其具体算法如下 设最小二乘多项式为pn(x),令,或,同时有互不相等的一元函数节点(xi,yi),(i=1,2,m),xi为自变量,yi为对应的函数值,则在每一节点处的偏差为,所有节点偏差的平方和为,最小二乘法多项式拟合公式就是使节点偏差的平方和ss为最小,其推导过程如下,令ss的偏导数为零,可以得到下列方程组,求解联立方程组,即可解出 a0,a1,a2, an,2.2 线图计算机处理技术,在设计手册中,有些函数关系是以线图的形式表示的,它的特点是直观、感性,可以观察出函数和数据的变化趋势。线图的形式包括直线、折线和曲线。在传统的设计过程中,以手工查找对应数据获得工程数据,通常有一定的误差。在计算机辅助设计中,由于在计算机中直接存储和处理线图的程序相当复杂,所以通常采用下面三种方法来处理线图。 获取线图的原始公式,将其编入程序 将线图转换成数表,然后利用前面介绍的数表程序化的方法进行程序化处理 用曲线拟合的方法求出线图的近似公式,再将近似公式编入程序,工程设计手册中附有许多线图,为查询方便,也可以将其转为数表。所谓线图数表化处理就是将线图离散化,转换成数表的格式。下图为小带轮的包角系数曲线图,为将该曲线离散为数表,可以在曲线上取若干个节点,并将节点的坐标值列成数表,如下所示,即完成线图数表化的处理,然后利用前面介绍的数表程序化的方法进行程序化处理,包角系数曲线图,包角系数表,线图数表化,2.3 数据文件,对于数据量较小的数表,可以利用数组的形式将其程序化,但数表的容量较大时,常需建立数据文件,并将数据文件与应用程序分开。数据文件可以存储在外存设备上,如软盘、硬盘、光盘等,只有当需要的时候,利用应用程序通过操作语句将数据文件打开并调用。,数据文件,顺序文件 :顺序文件中的各个纪录是按照其输入的先后顺序存放的,其存取文件需从头至尾按顺序读写,故效率不高 随机文件 :随机文件是指在写入一个数据时,还给此数据登记一个编号(纪录号),以后可按照此纪录号进行查找,所以随机文件的存取速度比顺序文件的要高,C语言常用数据文件操作语句,创建和打开数据文件 在C语言的标准输入输出函数库中定义了一个名为fopen()的函数,用于实现数据文件的创建或打开,其调用格式如下: FILE *fp; fp=fopen(“name,”,“type”) 其中,FILE *fp为用FILE来定义文件类型的指针变量;name为用户想要打开的已有数据文件的文件名或需要创建的新数据文件的名字;type为对该文件进行的操作方式,即是从数据文件中读取数据还是向数据文件中写入数据。,关闭数据文件 对所调用的数据文件进行完读写操作后应及时关闭以释放内存并防止数据丢失,关闭数据文件函数的调用格式为: fclose(文件指针) 有关读文件的操作 数据文件被打开后,就可以对它进行读取数据的操作。 字符读函数fgetc 该函数的作用是从指定的文件中读取一个字符,此文件必须是以读或读写的方式打开。其调用格式为: ch=fgetc(fp) 其中,ch为字符型变量,存放从数据文件读取的字符;fp为指向该文件的文件指针,数据块读函数fread 该函数的作用是指从指定的数据文件中读取一个数据块,其调用格式为: fread(buffer,size,count,fp); buffer为一个指针,用于读入数据的存放起始地址;size为读取的字节数;count表示要读多少个大小为size字节的数据块;fp指向文件的指针。,格式化读函数fscanf() 该函数的作用是指从文件指针指向的文件中,按格式字符串读取相应数据,然后赋给输入列表中的对应变量地址中,其调用格式为: fscanf(文件指针,格式字符串,输入列表) 字符串读函数fgets() 该函数的作
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号