机械设计编程基础一、输入输出语句的应用二、逻辑判断语句的应用三、窗口界面的应用2-1人机交互式程序的编制设计资料的程序化常见的设计资料包括:计算公式,经验公式,实验数据,实验曲线,图表以及各种标准和规范等。所以我们可以将设计资料分为:公式,数表,线图。在机械CAD中,需要把设计中所需要的数据,资料,及有关公式和过程进行程序化。1.设计资料程序化2.数据库存储一、设计公式的程序化根据设计资料中的公式进行计算,可以将每个公式编成为一个子程序或者函数,公式中的待定设计参数作为变量。设计资料中有理论公式和经验公式,对于理论公式,我们尽量采用原始公式,使得计算结果更为精确。对于经验公式,有些参数的取值不确定,对于这类参数的取值,建议采用两种方法:1.对于可变性较大的参数,可以作为计算子程序或者函数的输入变量,每次有用户根据具体问题输入参数值。2.对于相对来说比较固定的参数值,可以采用数据库或者别的形式直接放入CAD系统中。此时参数值可以修改,但是不必每次输入。二、数表的程序化方法在机械设计中,又很多参数之间的关系没有办法用简单的数学公式表达。例如:设计带传动中包角系数为了更好的将数表程序化,我们首先应该了解数表的类型。包角708090100。。。150160。。。220K0.560.620.680.73。。。0.920.95。。。1.21.数表的分类:按照数表中的数据间有没有函数关系,数表分为:简单数表和列表函数数表。简单数表记录着研究对象各自独立的常数,表中的数据没有函数关系,只能检索,不能插值。例如齿轮模数等等。列表函数数表中的数据间存在函数关系,Yi=f(Xi),i=1,2,3…。将相应的数据Xi和Yi列成表格表示参数间的关系,这样的函数为列表函数,这样的数表为列表函数数表。对于列表函数数表我们可以用插值法来查取数据。按照数表中的数据相关的变量的个数,我们可以将数表分为一元数表,二元数表,三元数表等。一元数表中的数据是独立的,或者只与一个因素有关,这种数表可以用一个一维数组来表示。二元数表的数据与两个因素有关,可以用二维数组表示。三元数表中的数据与三个因素有关,可以用三维数组表示。如书中例题一:标准胶带型号及断面尺寸只有一个自变量,每个数据都为一元数表,可以用一维数组表示。如书中例题五:轴肩圆角处理论应力集中系数aa此时决定aa有两个自变量,D/d和r/d,所以这是二维查表问题。2.简单数表的查取方法举例:查表渐开线圆柱齿轮的模数基本步骤如下1).定义变量和数组:存放模数的计算值(齿距/Pi),数组存放模数的标准值。2).用循环过程判断计算值在数组中的位置。3).确定标准模数。第一系列1,1.25,1.5,2,2.5,3,4,5,6,8,10,12,16,20,25,32,40,50第二系列1.75,2.25,2.75,(3.25),3.5,4.5,5.5,(6.5),7,9,(11),14,18,22,28,36,453.列表函数数表的查取方法由于列表函数数表个数据之间存在函数关系,因此在查取数据时就存在一个插值问题。插值问题和插值多项式:实际问题中若给定函数y=f(x)是区间[a,b]上的一个列表函数(xi,yi)(i=0,1,2,3...,n),如果x[a,b],且f(x)在区间[a,b]上是连续的,要求用一个简单的,便于计算的解析表达式p(x)在区间[a,b]上近似f(x),使p(xi)=yi,i=0,1,2...,n就称p(x)为f(x)的插值函数,点x0,x1...,xn称为插值节点,包含插值节点的区间[a,b]称为插值区间.我们将称为插值多项式。nnxaxaaxP...)(103.1一元列表函数数表的插值当我们在进行机械设计时,往往用到的一些参数存在某种函数关系y=f(x),然而要想直接找到这种函数关系的解析表达式是比较复杂和困难的,然而我们可以在现有的函数定义区间通过某些方法得到一些离散点的函数值:yi=f(xi),i=1,2,3…。此时我们得到的是一个一维列表函数的数表:此时,我们需要做的就是寻找一个函数p(x),使得在某个小区间内p(x)可以替代f(x)。XX1X2X3X4X5…Xi…XnYY1Y2Y3Y4Y5…Yi…Yn线性插值1)给定x,且xixxi+1,找出相对应的函数值f(xi),f(xi+1)2)过(xi,yi)和(xi+1,yi+1)两点连直线p(x)替代原来的函数f(x),我们可以得到插值函数值y。iiiiiiyxxxxyyy)(11XiXi+1Xf(x)p(x)yiyi+1f(x)y=p(x)1111)()()()(iiiiiiiiyxxxxyxxxxy输入n,x(n),y(n),xxx(1)fori=2~nx=x(i)i=i-1计算y结束越界TrueFalse拉格朗日插值法线性插值法利用了两个节点上的信息,精度不高。如果我们用三个节点,用抛物线来替代直线拟和,结果更为理想。系数K随流量变化曲线在f(x)上面任取三点,过三点做抛物线p2(x),如果要使p2(x)能够替代f(x),必须使得p2(x1)=f(x1),p2(x2)=f(x2),p2(x3)=f(x3)。通过数学推导。我们可以得出抛物线插值方程:如果认为抛物线插值法不够精确,我们增加插值点数,构成较高次方插值多项式。用来替代原来f(x)的n次多项式y=pn(x)有n+1个基本插值多项式:Ak(xi)(k=1,2,3…n+1),则n次插值函数为:111111111111112))(())(())(())(())(())(()(iiiiiiiiiiiiiiiiiiiiiyxxxxxxxxyxxxxxxxxyxxxxxxxxxp1111)()(nkknkjjjkjnyxxxxxPLargrange插值公式在抛物线插值中,关于根据插值点x选取合适的三个点的选取方法归纳如下:1.若|x-xi-1|=|x-xi|,则选取xi-2,xi-1,xi三个点,i=i-12.若|x-xi-1||x-xi|,则选取xi-1,xi,xi+1三个点,i=I3.若x1=x=x2,x靠近区间上限,则选取x1,x2,x3三个点,公式中i=24.若xn-1=x=xn,x靠近区间下限,则选取xn-2,xn-1,xn三个点,公式中i=n-1输入n,x(n),y(n),xxx(1)orxx(n)fori=2~(n-1)x=x(i)i=n-1用公式计算y结束越界i=2x-x(i-1)x(i)-xi=i-1TrueTrueTrueTrueFalseFalseFalse3.2二元函数插值当机械设计资料为二元列表函数需要用插值法来检索数据,我们可以采用一下三种插值方法:1)二元列表函数线性插值法2)二元列表函数抛物线-直线插值法3)二元列表函数抛物线插值法oXYyi-1yi+1yiXi-1Xi+1Xiafesrdcbtwvuk二元列表函数线性插值编程思路开始输入X,Y,Z,m,n,Xk,Yk,ZkXkX(1)YkY(1)Fori=2,nYkY(i)i=i-1越界Forl=2,mXkX(l)l=l-1AAZk=0Forr=i,i+1Forr=i,i+1Fork=i,i+1Fors=l,l+1T=1k=rk=rT=T*(x-xk)/(xr-xk)T=T*(y-yl)/(ys-yl)zk=zk+T*z(r,s)结束TureFalseTureTureTureFalseFalseFalse4、线图的程序化1.找到线图原来的公式2.线图的数表化处理齿数Z121416182226304050齿形系数Y3.583.223.052.912.722.62.522.42.32原则:结点的选取随曲线的形状而异,选取的基本原则是使得各个结点的函数值不至相差很大。1、由此可见,一条曲线可以变换成为一个一维列表函数数表。2、当在同一坐标平面内有多条曲线,假设有N条曲线,就有N个一维数组,把这些数表组合在一起,就构成一张二维数表。5、数表的公式化原因:前面所讲的简单数表和列表函数数表的查取方法中一元或者二元自变量的数据被存储在数组中,需要在程序中直接对数组赋初值。但当数据数量较多的时候,输入比较麻烦,所以我们可以采用数表的公式化处理。分类:1、设计资料中的数表,是根据比较繁杂的算法或者一系列规定的设计公式计算出来后再制成表格的,目的是为了简化工程师的手工计算,对于这种数表,我们应该近可能的找到原始计算公式编制程序。2、数表中给的数据是一组实验得到的数据,或者是一系列数值计算的结果。对于这类数表,可以在数据的基础上建立经验公式或者近似计算公式。对于第一种情况,是比较容易的:例如:计算普通V带的基本额定功率。GB/T13575.1-92。通过V带型号,小带轮基准直径d1,小带轮转速n1的一个二维列表函数数表来查取额定功率。原始公式为:当带的型号,线速度,小带轮直径D1知道后,就可以由上式计算出P0。这个过程称为图表的程序化。1230.0911.101110217200vdfhCLhqPEALAeauuuu--骣骣×÷ç÷ç÷=缱---÷ç÷ç÷ç÷÷桫ç桫对于在数据基础上建立经验公式或近似计算公式,我们一般有两种方法:1、曲线插值法:当数表中的数据足够精确,要求近似公式代表的函数曲线严格的经过数表所给出的各个离散点,就可以用曲线插值方法。例如常用的三次样条曲线、多项式插值。2、曲线拟和方法:根据离散节点数值变化趋势选择函数类型,拟和函数可能不准确的通过离散节点。但是可以通过恰当的选择函数中的待定系数,使误差最小。常用的拟和函数有:多项式拟和,指数拟和,幂函数拟和。0102030405060010203040506070病人住院天数X预后指数Y对数曲线指数曲线最小二乘法多项式拟和在科学实验数据处理中,往往要根据一组给定的实验数据,求出自变量x与因变量y的函数关系,已知m+1组数据(xi,yi),i=0,1,2…,m。如果一个n次多项式S(x),它并不通过点(xi,yi)(i=0,1,2,…,m),只是给定点xi上的误差i=s(xi)-yi(i=0,1,…,m)的平方和最小。这样的方法称为最小二乘法。R称为用S(x)拟和的总偏差。0(0,1,...,)iRima¶==¶根据极值理论,要使R达到最小,必有:20121020miiiiRaaxaxya=¶轾=++-=犏臌¶å20niid=å对n=2的情形进行讨论:用二次函数来拟和原函数f(x):此时总的偏差:根据极限理论:22012()Sxaaxax=++[]22222012111()mmmiiiiiiiiiRSxyaaxaxyd===轾==-=++-犏臌邋?20121020miiiiRaaxaxya=¶轾=++-=犏臌¶å20121120miiiiiRxaaxaxya=¶轾=++-=犏臌¶å220121220miiiiiRxaaxaxya=¶轾=++-=犏臌¶å从而我们可以得到一个线性方程组:201211123012111123420121111(1)mmmiiiiiimmmmiiiiiiiiimmmmiiiiiiiiianaxaxyaxaxaxxyaxaxaxxy===========+++=++=++=邋?邋邋邋邋021111231111234221111mmmiiiiiimmmmiiiiiiiiimmmmiiiiiiiiiamxxyaxxxxyaxxxxy===========轾轾轾犏犏犏犏犏犏犏犏犏犏犏犏犏犏犏=犏犏犏犏犏犏犏犏犏犏犏犏犏犏犏犏臌臌臌邋?邋邋邋邋可以写成矩阵形式,a0,a1,a2作为自变量:对于m次多项式拟和,我们可以得到m+1阶正则方程组:000021100001200001nnnmiiiiiinnnnmiiiiiiiiimnnnnmmmmiiiiiiiiinxxyaxxxaxyaxxxxy===+====+====轾轾犏犏+犏犏犏犏轾犏犏犏犏犏犏犏犏犏=犏