机械优化设计——复合形方法及源程序
机械优化设计实验报告
《机械优化设计》实验报告目录1.进退法确定初始区间 (3)1.1 进退法基本思路 (3)1.2 进退法程序框图 (3)1.3 题目 (3)1.4 源程序代码及运行结果 (3)2.黄金分割法 (4)2.2黄金分割法流程图 (4)2.3 题目 (5)2.4 源程序代码及结果 (5)3.牛顿型法 (5)3.1牛顿型法基本思路 (6)3.2 阻尼牛顿法的流程图 (6)3.3 题目 (6)3.4 源程序代码及结果 (6)4.鲍威尔法 (7)4.1 鲍威尔法基本思路 (7)4.2 鲍威尔法流程图 (7)4.3 题目 (8)4.4 源程序代码及结果 (8)5. 复合形法 (15)5.1 复合行法基本思想 (15)5.3 源程序代码及结果 (15)6. 外点惩罚函数法 (23)6.1解题思路: (23)6.2 流程框图 (23)6.3 题目 (24)6.4 源程序代码及结果 (24)7.机械设计实际问题分析 (30)7.2计算过程如下 (30)7.3 源程序编写 (31)8.报告总结 (33)1.进退法确定初始区间1.1 进退法基本思路:按照一定的规则试算若干个点,比较其函数值的大小,直至找到函数值按“高-低-高”变化的单峰区间。
1.2 进退法程序框图1.3 题目:用进退法求解函数()2710=-+的搜索区间f x x x1.4 源程序代码及运行结果#include <stdio.h>#include <math.h>main(){float h,h0,y1,y2,y3,a1=0,a2,a3,fa2,fa3;scanf("h0=%f,y1=%f",&h0,&y1);h=h0;a2=h;y2=a2*a2-7*a2+10;if (y2>y1){h=-h;a3=a1;y3=y1;loop:a1=a2;y1=y2;a2=a3;y2=y3;}a3=a2+2*h;y3=a3*a3-7*a3+10;if (y3<y2){goto loop;}elseprintf("a1=%f,a2=%f,a3=%f,y1=%f,y2=%f,y3=%f\n",a1,a2,a3,y1,y2,y3);} 搜索区间为0 62.黄金分割法2.1黄金分割法基本思路:通过不断的缩短单峰区间的长度来搜索极小点的一种有效方法。
机械优化设计3
若 f xk f xH ,收缩成功,用 xk 取代 xH 构成新的复合形。
4、压缩
若上述方法均无效,还可采用将复合形各顶点向最好点 拢,压缩后各顶点计算公式为:
xL 靠
x j x L 0.5 x L x j
j 1, 2, , k ; j L
约束允差下,按允差中心δ /2作线性内插,得到将 xt 2 调整到 约束面上的步长。
0.5 gk xt1 s 0 gk xt 2 gk xt1
本次迭代步长取为 五、收敛条件 1、设计点
k M t s
x k 及约束允差满足
f x k T d k 2
g x k 与 d k 夹角大于 90 ,则 若 x k 在一个约束面上,
g x k d k 0
T
g x k 与 d k 夹角大于 90 ,则 若 x k 在J个约束面上,
2、下降条件:
g j x d k 0 j 1, 2,, J
xk 1 xk k d k
关键的三要素:
0 初始点 x 、可行搜索方向 d k 、合适步长 ak 。
适用范围:仅含不等式约束的问题。 特点:1会出现多个局部最优解 2目标函数有定义 3在可行域内进行
二、间接解法(惩罚函数法,增广乘子法) 基本思路:
将约束条件中的约束函数进行特别处理后,与目标函数 结合起来构成新的目标函数序列,从而变成一系列的无约束 优化问题。
j 1, 2, , m f xR f xH
R C
2、扩张
若求得反射点
xR 为可行点,且目标函数值下降较多( f x f x )
优化设计复合形法
所以,坏点X H X 2 ;好点X L X 3 去掉坏点的其余各顶点的几何中心 X C
五、复合形法习题
K
2 3
X C
Xj
j 1
K 1
1 3 31
22..05( j 2)
三、复合形法的计算步骤
6. α>δ 若是,则α=0.5α ,重新计算反射点X(R) 若否,用次坏点取代最坏点进行上述寻优
过程; 7. 检查终止准则: 满足,迭代终止得到最优解, 否则以新构成的复合形,继续进行搜索;
四、复合形法的特点
1、不必保持规则的图形,比较灵活; 2、复合形法适用于仅含不等式约束的问题。 3、对目标函数和约束函数无特殊要求,适 应性强; 4、寻优过程始终在可行域内,结果可靠;
再重新构造新的复合形。
8、复合形法搜索的其他方法
(1)扩张 如果求得的反射点为可行点,且目标函数下 降较多,比如F(X(R))<F(X(L))则沿此反射方向 继续移动,可能找到更好的新点X(E),X(E)) 就 称为扩张点。
X E X R X R X C
γ为扩张系数,一般取γ=1
(1)扩张
1)映射点优于坏点 F(X(R))< F(X(H))
在此情况,用X(R)代替X(H),构成新 的复合形。
7、如何构造新的复合形?
2)映射点次于坏点 F(X(R))>F(X(H))
这种情况由于映射点过远引起的,减半映射 系数,若有F(X(R))< F(X(H)),这又转化为第一种 情况。
若经过多次的映射系数减半,直至映射系
XS
1 q
复合形法作业
优化理论与最优控制作业——复合形法小组成员于童 1122227010杜娟 1122227005健华 1122227150王楠 1122227034海珍 1122227039复合形法流程图一.复合形法的基本原理复合形法的基本思路是在n维空间的可行域中选取K个设计点(通常取n+1<k<2n)作为初始复合形(多面体)的顶点。
然后比较复合形各顶点目标函数的大小,其中目标函数值最大的点作为坏点,以坏点之外其余各点的中心为映射中心,寻找坏点的映射点,一般说来此映射点的目标函数值总是小于坏点的,也就是说映射点优于坏点。
这时,以映射点替换坏点与原复合形除坏点之外其余各点构成K个顶点的新的复合形。
如此反复迭代计算,在可行域中不断以目标函数值低的新点代替目标函数值最大的坏点从而构成新复合形,使复合形不断向最优点移动和收缩,直至收缩到复合形的各顶点与其形心非常接近、满足迭代精度要求时为止。
最后输出复合形各顶点中的目标函数值最小的顶点作为近似最优点。
补充:关于复合形法定点数目的选取数目多少的选取,要视具体情况而定,一般说来,为了防止迭代过程中产生降维,顶点数目取多一些较好。
因为只要在k个顶点中有n+1个顶点所构成的n个矢量线性无关,搜索就不会在降维的空间里进行。
所以k值大些,降维的可能性就小些。
但是从另一方面看,顶点数目多,显然会降低计算速度。
为此,对于优化问题维数n<6时通常取k=2n;对于n>5的优化问题,一般应适当减少顶点数目,而取k=(1.25——1.5)n(取整)。
当然,顶点的最少数目不得低于n+1. 二.复合形法的优缺点复合形法不需要计算目标函数的导数,也不进行一维搜索,因此对目标函数和约束函数都没有特殊的要求,适用围较广。
复合形法的收敛速度较慢,特别当目标函数的维数较高和约束条件的数目增多时,这一缺点尤为突出。
另外,复合形法不能用于求解具有等式约束的优化问题。
三.问题求解下面分别用复合形法和matlab工具箱分别进行求解并比较计算结果22221112min f ()100()(1)2.048 2.048. 2.048 2.048X x x x x subject to x =-+--≤≤⎧⎨-≤≤⎩1-1函数的三维立体图1-2.复合形法求解寻优趋势图1-3.求解结果对照表方法 复合形法 Matlab 工具箱x1 1.0004 1 x2 1.0002 1 f 1.8048e-07-200-150-100-505022121212min f ()10cos(2)10cos(2)205.12 5.12. 5.12 5.12X x x x x x subject to x ππ=+--+-≤≤⎧⎨-≤≤⎩2-1函数的三维立体图2-2.复合形法求解寻优趋势图2-3.求解结果对照表方法 复合形法 Matlab 工具箱 x1 0.9950 -0.1431* e-05 x2 0 -0.1431* e-05 f0.99508.1197e-10-40-35-30-25-20-15-10-501212max f ()0.5(10.001())44.44X x x x subject to x =-++-≤≤⎧⎨-≤≤⎩2-1函数的三维立体图3-2.复合形法求解寻优趋势图3-3.求解结果对照表方法 复合形法 Matlab 工具箱x1 -2.9561 1.5345 x2 1.0558 1.5345 f0.99031.98600.40.50.60.70.80.91四.结果分析对于求解此类问题,做出目标函数的大致图形(当然只限于三维以)有利于我们判断函数的极值点位置以及估计函数值,同时也可以用来检验计算结果的正确性。
复合形法减速器的优化设计.doc
1 前言 (2)1.1复合形法减速器优化设计的意义 (2)1.1.1 机械优化设计与减速器设计现状 (2)1.1.2优化设计的步骤 (3)1.1.3减速器优化设计的分析 (5)1.1.4减速器的研究意义与发展前景 (6)1.2国内外发展状况 (7)1.2.1、国内减速器技术发展简况 (7)1.2.2、国内减速器技术发展简况 (8)1.3论文的主要内容 (9)2 齿轮啮合参数优化设计的数学模型的建立 (9)2.1设计变量的确定 (9)2.2目标函数的确定 (10)2.3约束条件的建立 (11)3优化设计方法-复合形法调优 (12)3.1复合形法介绍 (12)3.2复合形法计算步骤 (13)3.3单级圆柱齿轮减速器复合形法FORTRAN优化目标函数和约束函数子程序 (14)3.4优化结果 (16)4 减速器的常规设计 (16)4.1减速器的结构与性能介绍 (16)4.2.带传动零件的设计计算 (17)4.3齿轮的设计计算及结构说明 (18)4.4.联轴器的选择 (21)4.5.轴的设计及校核 (21)4.5.1.从动轴结构设计 (21)4.5.2.主动轴的设计 (22)4.5.3.危险截面的强度校核 (23)4.6.键的选择及校核 (25)4.7.轴承的选择及校核 (25)4.8.减速器润滑方式、密封形式 (25)4.8.1.密封 (26)4.8.2.润滑 (26)5优化结果分析 (26)6减速器3D简略设计过程(UG) (26)6.1.减速器机盖设计 (26)6.2减速器机座设计 (28)6.3轴的设计 (28)6.3.1传动轴的设计 (28)6.3.2齿轮轴的设计 (29)6.4齿轮的设计 (30)6.5轴承的设计(以大轴承为例) (32)6.5减速器的装配(其它零部件说明省略) (33)7 总结 (34)8 参考文献 (35)9 致谢 ......................................................................... 错误!未定义书签。
机械优化设计-复合型法
comple(2,3,3,0.00001,x,a,b,xcom,&f);
printf(" \n\n\n输出最优解及目标函数值:\n");
printf("\n x1=%.5f x2=%.5f f(x1,x2)=%.5f\n\n ",x[0],x[1],f);
(一)题目:用复合形法求约束优化问题
; ; 的最优解。
基本思路:在可行域中构造一个具有K个顶点的初始复合形。对该复合形各顶点的目标函数值进行比较,找到目标函数值最大的顶点(即最坏点),然后按一定的法则求出目标函数值有所下降的可行的新点,并用此点代替最坏点,构成新的复合形,复合形的形状每改变一次,就向最优点移动一步,直至逼近最优点。
{
xs=0;
for(l=0;l<ll;l++)
{
if(l!=lΒιβλιοθήκη )xs=xs+xcom[i][l];
}
if(lh>-1)
x0[i]=xs/(ll-1);
else
x0[i]=xs/ll;
}
}
void fxse(int n,int k,double x[],double xcom[][100],double fxk[])
iw=gau(x,g,kg);
if(iw==0)
goto s5;
for(i=0;i<n;i++)
xcom[i][0]=x[i];
for(l=1;l<k;l++)
for(i=0;i<n;i++)
机械优化复合形法 程序设计
课程设计(实验)材料(3)机械优化设计课程设计(实验)报告专业班级:设计题目:复合形程序设计学生姓名:学生学号:任课教师:2013年月日一、设计要求:根据已知条件,用复合形法完成一次迭代,只用反射变换复合形即可。
已知条件:1、目标函数:f(x)=25/(x1*x2*x2*x2)2、约束条件:g(x) 30/(x1*x2*x2*x2)-50<=0G(x) 0.0004*x1*x2-0.001<=0X1>=2 x1<=4 x2<=1 x2>=0.53、初始复合形顶点:X1=[2.2,0.55] X2=[2.4,0.6] X3=[2.6,0.65] X4=[2.8,0,7]二、方法原理:复合形法的基本思路是在n维空间的可行域中选取K个设计点(通常取n+1<=K<=2*n)作为初始复合形的顶点。
然后比较复合形各顶点目标函数的大小,其中目标函数值最大的点作为坏点,以坏点之外其余各点的中心为映射中心,寻找坏点的映射点,一般说来此映射点的目标函数值总是小于坏点的,也就是说映射点优于坏点。
这时,以映射点替换坏点与原复合形除坏点之外其余各点构成K个顶点的新的复合形。
如此反复迭代计算,在可行域中不断以目标函数值低的新点代替目标函数值最大的坏点从而构成新复合形,使复合形不断向最优点移动和收缩,直至收缩到复合形的各顶点与其形心非常接近、满足迭代精度要求时为止。
最后输出复合形各顶点中的目标函数值最小的顶点作为近似最优点。
三、程序清单:# include <stdio.h># include <math.h># define p 1.3# define k 4float fr,fh;float xr[2][1],xc[2][1];int xb_h,xb_xh;float f(float x[2][1]);float x1[2][1] = {{2.2},{0.55}};float x2[2][1] = {{2.4},{0.63}};float x3[2][1] = {{2.6},{0.65}};float x4[2][1] = {{2.8},{0.7 }};float Max_value,Min_value,Max_h_value; float shuzu[4];void hanshu_Maxvalue(void);void hanshu_Max_h_value(void);void zhshuzu(void);void hanshu_Minvalue(void);void chu_h(void);int ke_xr(void);int main(void){ int kexing_flag = 0;zhshuzu();hanshu_Minvalue();hanshu_Maxvalue();hanshu_Max_h_value();chu_h();while(ke_xr()){kexing_flag = 1;switch(xb_xh){case 1: fr = f(xr);fh = f(x1);if(fr < fh){ x1[0][0] = xr[0][0];x1[1][0] = xr[1][0]; }break;case 2: fr = f(xr);fh = f(x2);if(fr < fh){ x2[0][0] = xr[0][0];x2[1][0] = xr[1][0]; }break;case 3: fr = f(xr);fh = f(x3);if(fr < fh){ x3[0][0] = xr[0][0];x3[1][0] = xr[1][0]; } break;case 4: fr = f(xr);fh = f(x4);if(fr < fh){ x4[0][0] = xr[0][0];x4[1][0] = xr[1][0]; }break;} if(kexing_flag == 1)break;} printf("替换后结果为");printf("x1=");printf("[%.1f,%.2f]\n",x1[0][0],x1[1][0]);printf("输出\n");printf("x2=");printf("[%.1f,%.2f]\n",x2[0][0],x2[1][0]);printf("x3=");printf("[%.1f,%.2f]\n",x3[0][0],x3[1][0]);printf("x4=");printf("[%.1f,%.2f]\n",x4[0][0],x4[1][0]);return 0;}float f(float x[2][1]){float hanshuvalue;hanshuvalue = (25 * 1.0) / (x[0][0] * pow(x[1][0],3));return hanshuvalue;}void zhshuzu(void){shuzu[0] = f(x1);shuzu[1] = f(x2);shuzu[2] = f(x3);shuzu[3] = f(x4);}void hanshu_Minvalue(void){int i;Min_value = shuzu[0] ;for(i = 0; i < 4; i++)if(shuzu[i] <= Min_value )Min_value = shuzu[i] ;}void hanshu_Max_h_value(void){int i;Max_h_value = shuzu[0] ;for(i = 0; i<4; i++){if( xb_h == i)continue;elseif(shuzu[i] >= Max_h_value)Max_h_value = shuzu[i];} }void hanshu_Maxvalue(void){int i;Max_value = shuzu[0] ;for(i = 0; i < 4; i++)if(shuzu[i] >= Max_value ){Max_value = shuzu[i] ;xb_h = i;}}void chu_h(void){switch( xb_h){case 0: xc[0][0] = 1.0*(x2[0][0] + x3[0][0] + x4[0][0]) / (k-1);xc[1][0] = 1.0*(x2[1][0] + x3[1][0] + x4[1][0]) / (k-1);xr[0][0] = xc[0][0] + p*(xc[0][0] - x1[0][0]);xr[1][0] = xc[1][0] + p*(xc[1][0] - x1[1][0]); xb_xh = 1;break;case 1: xc[0][0] = 1.0*(x1[0][0] + x3[0][0] + x4[0][0]) / (k-1);xc[1][0] = 1.0*(x1[1][0] + x3[1][0] + x4[1][0]) / (k-1);xr[0][0] = xc[0][0] + p*(xc[0][0] - x2[0][0]);xr[1][0] = xc[1][0] + p*(xc[1][0] - x2[1][0]); xb_xh = 2;break;case 2: xc[0][0] = 1.0*(x1[0][0] + x2[0][0] + x4[0][0]) / (k-1);xc[1][0] = 1.0*(x1[1][0] + x2[1][0] + x4[1][0]) /(k-1);xr[0][0] = xc[0][0] + p*(xc[0][0] - x3[0][0]);xr[1][0] = xc[1][0] + p*(xc[1][0] - x3[1][0]); xb_xh = 3;break;case 3: xc[0][0] = 1.0*(x1[0][0] + x2[0][0] + x3[0][0]) / (k-1);xc[1][0] = 1.0*(x1[1][0] + x2[1][0] + x3[1][0]) / (k-1);xr[0][0] = xc[0][0] + p*(xc[0][0] - x3[0][0]);xr[1][0] = xc[1][0] + p*(xc[1][0] - x3[1][0]); xb_xh = 4;break;}}int ke_xr(void){if((30*1.0 / (xr[0][0]*pow(xr[1][0],3)) - 50) <= 0){ if((0.0004*xr[0][0]*xr[1][0] -0.001) <= 0)if(2 <= xr[0][0] && xr[0][0] <= 4 )if(0.5 <= xr[1][0] && xr[1][0] <= 1)return 1;} else return 0;}四、实验结果(要求附上程序运行结果截图)五、手算过程计算初始复合形各顶点的值f(X1)=68.3 f (X2)=48.2f (X3)=35.0 f (X4)=26.0坏点X(H)=X1 好点X(L)=X4去掉坏点后各点的几何中心X(C) X(C)=[2.6,0.65] 取映射α=1.3映射X(R)=X(C)+α(X(C)-X(H))=[2.82,0.78] 将映射点代入约束条件验证0.0004*2.82*0.78-0.001=-0.0001202<0 满足约束条件X(R)=[2.82,0.78] 是新的复合形顶点最优点为X(R)=[3.12,0.78]。
机械优化实验报告
一、实验目的本次实验旨在加深对机械优化设计方法的基本理论和算法步骤的理解,培养学生独立编制、调试计算机程序的能力,并掌握常用优化方法程序的使用方法。
通过实验,学生能够灵活运用优化设计方法解决工程实际问题。
二、实验内容本次实验主要涉及以下内容:1. 优化方法的基本原理2. 编程实现优化方法3. 优化方法的实际应用三、实验步骤1. 黄金分割法(1)基本原理黄金分割法是一种在给定初始区间内搜索极小点的一维搜索方法。
其基本原理是:在区间内取两个点,根据函数值的比较,将区间分为三段,保留包含极小值的段,再进行相同的操作,逐步缩小搜索区间。
(2)编程实现根据黄金分割法的基本原理,编写相应的C语言程序,实现一维搜索。
```c#include <stdio.h>#include <math.h>double f(double x) {// 定义目标函数return x x - 4 x + 4;}double golden_section_search(double a, double b, double tol) {double r = 0.618;double a1 = a + r (b - a); double a2 = b - r (b - a); double fa1 = f(a1);double fa2 = f(a2);while (fabs(b - a) > tol) { if (fa1 > fa2) {a = a1;a1 = a2;a2 = b - r (b - a); fa1 = fa2;fa2 = f(a2);} else {b = a2;a2 = a1;a1 = a + r (b - a); fa2 = fa1;fa1 = f(a1);}}return (a + b) / 2;}int main() {double x_min = golden_section_search(a, b, tol);printf("Optimal solution: x = %f\n", x_min);return 0;}```(3)结果分析通过运行程序,可以得到最优解 x = 2.000000,目标函数值为 f(x) = 0。
复合形法_cyf
三、复合形法的搜索方法
4)判别反射点XR的位置 a.若XR 为可行点,则比较XR 和XH 两点的目标函数值, 如果f(XR) <f(XH),则用XR取代XH ,构成新的复合形,完成 一次迭代; 如果f(XR) >=f(XH),则将α缩小0.7倍,重新计算新的反射点, 若仍丌行,继续缩小α,直至f(XR) <f(XH)为止。 b.若为非可行点,则将α缩小0.7倍,直至可行为止。然后再重 复可行点的步骤。
xH : f xH max f x j j 1, 2,..., k xG : f xG
j
max f x j 1, 2,..., k , j H
三、复合形法的搜索方法
2)计算除去最坏点XH 外的(k-1)个顶点的中心XC
1 L xc xj k 1 j 1
j 1
K
( j)
) F(X
( L)
)
如果丌满足终止迭代条件,则返回步骤(3)继续迚行
下一次迭代;否则,可将最后复合形的好点X(L)及其函数
值F(X(L))作为最优解输出。
五、复合形法的特点总结
方法特点
(1)复合形法是求解约束非线性最优化问题的一种 直接方法,仅通过选取各顶点幵比较各点处函数值 的大小,就可寻找下一步的探索方向。但复合形各 顶点的选择和替换,丌仅要满足目标函数值下降的 要求,还应当满足所有的约束条件。
1 { K
[F ( X
j 1
K
( j)
) F(X
( L)
)] }
2
1
2
机械优化大作业-MATLAB复合型法
机床主轴机构优化设计机床主轴是机床中重要的零件之一,一般多为支撑空心阶梯轴。
为了便于使用材料力学进行结构分析,常常将阶梯轴简化成以当量直径表示的等截面轴。
如图0.1所示是一个已经简化处理的专用机床双主轴的力学模型。
从机床主轴制造成本较低和加工精度较高的要求出发,需要考虑主轴的自重和外身段挠度这样两个重要因素。
对于专用机床来说,并不追求过高的加工精度。
因此选取零件自身重量轻为设计目标,将主轴的刚度作为约束条件。
一、设计变量和目标函数当主轴的材料选定之后,与主轴重量设计方案有关设计变量主轴的外径D、孔径d、两支承跨度l、和外伸段长度a,如图0.1所示。
由于机床主轴的孔径主要取决于待加工棒料的直径,不能作为设计变量处理。
因此,设计变量为机床主轴重量最轻优化设计目标函数为二、约束条件1.刚度性条件机床的加工质量在很大程度上取决于主轴的刚度,主轴刚度是一个很重要的性能指标。
因此,要求主轴悬臂端挠度不超过给定的变形量y 0 。
根据材料力学可知,主轴悬臂端挠度为)()()(44231232d x E 3x x Fx 64EJ 3a l Fa y -+=+=π式中,)(44d -D 64J π=是空心主轴的惯性矩;E=2.1x105MPa 是主轴的弹性模量;F 是作用主轴外伸端的力。
整理得到主轴刚度的约束条件为0d x E 3x x Fx 64X g 442312301≥-+-=)()()(πy2.设计边界条件三个设计变量的边界约束条件为max min l l l ≤≤max min D D D ≤≤maxmin a a a ≤≤3.具体算例已知某机床主轴悬臂端受到的切削力F=15000N ,主轴内径d=30mm ,悬臂端许用挠度y 0=0.05mm 。
要求主轴两支承跨度mm lmm 650300≤≤,外径mm D mm 14060≤≤,悬臂长度mm a mm 15090≤≤。
建立优化的数学模型)30)((7854.0)(22231++=x x x X fTT a D l x x x X ],,[],,[321==0)30()(7009.91)(..44231231≥-+⨯-=x x x x X g t s01300/)(12≥-=x X g0650/1)(13≥-=x X g0160/)(24≥-=x X g0140/1)(25≥-=x X g0190/)(36≥-=x X g0150/1)(37≥-=x X g4.基于matlab 程序的复合形法实现优化(1)算法原理复合形法来源于无约束优化问题的单纯形法,通过构造复合形来求得最优解,新的复合形通过替换旧的复合形中的坏点(目标函数最大或次大的点)得到,替换方式仍是单纯性法中的反应、压缩、扩展这几个基本方法。
《机械优化设计》教学大纲
《机械优化设计》教学大纲大纲说明课程代码:3335047总学时:48学时(讲课40学时,上机8学时)总学分:3课程类别:专业模块选修课适用专业:机械设计制造及其自动化专业预修要求:高等数学、线性代数、BASIC或其它适于科学计算的高级语言、工程力学、机械设计基础一、课程的性质、目的、任务:机械优化设计是在电子计算机广泛应用的基础上发展起来的一门先进技术.它是根据最优化原理和方法,以电子计算机为计算工具,寻求最优设计参数的一种现代设计方法。
该课程是为高年级设置的专业课,可供机械类或近机类专业的学生学习。
该课程的主要目的和任务在于培养学生:1)了解和基本掌握机械优化设计的基本知识2)扩大视野,并初步具有应用机械优化设计的基本理论和基本方法解决简单工程实际问题的素质。
二、课程教学的基本要求:课堂讲授:课堂讲授主要以导学式教学为主,启发引导学生的学习兴趣,通过实例及典型例题加深学生对课堂内容的理解。
实践性环节基本要求:本课程的实践性环节主要是上机编制和调试程序(8学时)1)目的和要求上机调试并通过教材上已有的或是自行编制的计算程序,达到巩固某些基本的重要算法的目的2)内容编制并调试一维收索方法、无约束优化方法、约束优化方法及机械零件设计优化计算程序,上机练习并输出计算结果。
课程考核要求:期末考试成绩占总成绩的60—70%,平时成绩占30-40%。
三、大纲的使用说明:课程总学时:课堂教学+上机时数 = 40+8大纲正文第一章绪论学时:1学时(讲课1学时)本章讲授要点:1)明确本课程的研究对象、内容、性质、任务;2)明确优化的含义、机械优化设计的内容及目的.重点:了解机械优化设计的一般过程。
难点:机械优化设计的一般步骤。
第二章优化设计概述学时:3学时(讲课3学时)本章讲授要点:通过机械设计优化问题示例,使学生了解机械优化设计的基本概念和基本术语、优化设计的数学模型、优化问题的几何描述、优化设计的基本方法。
重点:掌握可行域与非可行域、等值线(面)的概念及在优化方法中的重要意义。
机械优化设计C语言程序
目录一、黄金分割法二、二次插值法三、最速下降法(阶梯法)四、变尺度法五、鲍威尔法一、黄金分割法#include<stdio。
h>#include<math。
h〉#define r 0。
618#define f(x) x*x+2*xgolden(float,float,float);main(){float a,b,e;printf(”\n请输入区间和收敛精度:a,b,e\n");scanf("%f,%f,%f",&a,&b,&e);golden(a,b,e);}golden(float a,float b,float e){float y1,y2,a1,a2,A,Y;int n=0;a1=b-r*(b—a);a2=a+r*(b—a);y1=f(a1);y2=f(a2);printf(”黄金分割法的搜索过程:");do{printf(”\n %d a=%f,b=%f,a1=%f,a2=%f,y1=%f,y2=%f”,n,a,b,a1,a2,y1,y2);if(y1>=y2){a=a1;a1=a2;y1=y2;a2=a+r*(b—a);y2=f(a2);}else{b=a2;a2=a1;y2=y1;a1=b—r*(b-a);y1=f(a1);}n++;}while(fabs((b—a)/b)>=e||fabs((y2-y1)/y2)>=e);A=(a+b)/2;Y=f(A);printf(”\n %d a=%f,b=%f,a1=%f,a2=%f",n,a,b,a1,a2);printf("\n结果:\n极值点及其函数值:A=%f,Y=%f\n”, A,Y);}二、二次插值法#include"stdio。
h”#include"math.h"#include"conio。
机械优化设计方案三个案例
机械优化设计案例11.题目对一对单级圆柱齿轮减速器,以体积最小为目标进行优化设计。
2■已知条件已知数输入功p=58kw,输入转速n i=1000r/min,齿数比u=5, 齿轮的许用应力[、:]H=550Mpa,许用弯曲应力[:]F=400Mpa。
3■建立优化模型3.1问题分析及设计变量的确定由已知条件得求在满足零件刚度和强度条件下,使减速器体积最小的各项设计参数。
由于齿轮和轴的尺寸(即壳体内的零件) 是决定减速器体积的依据,故可按它们的体积之和最小的原则建立目标函数。
单机圆柱齿轮减速器的齿轮和轴的体积可近似的表示为:2 2 2 2 2 2v =0.25*0 -d z1) 0.25二b(d2 -d z2) -0.25(b -c)(D g2 -d g2)-d0c 0.25二l(d; d;2) 7二d; 8:d;22 2 2 2 2 2 2 2= 0.25叫m z b _d z初+m z u b _d z2b-0.8b(mzu—10m) +2 2 2 22.05bd Z2 -0.05b(mzu -10m -1.6d z2)+d zd + 28d z1 +32d z2】式中符号意义由结构图给出,其计算公式为d1= mz, d2= mz2D g2二u m1z10md g2=1.6d z2,d0=0.25(u m1z10m-1.6d z2)c =0.2b由上式知,齿数比给定之后,体积取决于b、Z1、m、l、d z1和d z2六个参数,则设计变量可取为x 二[X1 X2 X3 X4 X冷]丁=[b 乙m I d z1 d z2〕T3.2目标函数为2 2 2 2 2 2 f (x^ 0.785398(4.75X1X2X385X1X2X3-85X1X30.92X1X^X1X52 2 2 2 2 20.8x1x2x3x^ -1.6x1x3x6x4x5x4x628x532x6)—;min3.3约束条件的建立1)为避免发生根切,应有乙-為山=17,得g i(x) =17 _X2 乞0:? .:■■ b.■:min 二—T max m CO CD 2 )齿宽应满足 d , Fin和Fax为齿宽系数'd的最大值和最小值,一般取;:min =0.9, max=1.4,得g2(x) =0.9 -为(X2X3) _0g3(x) =x1;(X2X3) -1.4 乞03)动力传递的齿轮模数应大于2mm,得g4(x)=2-X3 乞04)为了限制大齿轮的直径不至过大,小齿轮的直径不能大于d1 max 彳得g5(x) 7x3 -3 0 005)齿轮轴直径的范围:dzmin - dz "/x得g6(x)=1 0 0X5 _0g7(x) =X5 -1 5 00g8(x) =1 3 0X6 岂0g9(x)=冷一2 0 0 06)轴的支撑距离1按结构关系,应满足条件:1 - b • 2:伽• 0.5dz2(可取比min =20),得g10 (x)二X1 0.5x6 - X4 - 40 _ 0 7)齿轮的接触应力和弯曲应力应不大于许用值,得g11(x) =1468250. (x2x3 _ % ) -550 - 0q12(x)=7098 2 Q-4 2 一400 —0 12X1X2X3 (0.169 0.6666 10 x^ 0.854 10 X2)g13(x)=70982 2 4 2 -400 空01X1X2X3 (0.2824 0.177 10 x^0.394 10 X2)8)齿轮轴的最大挠度;max 不大于许用值,得g 14(x ) =117.04x ;.(X 2X 3X 4) -0.003x 4 乞 09)齿轮轴的弯曲应力;w 不大于许用值['」w ,得 g i5(x )=厶](2.85"0 生)2 +2.4X101'-5.5 兰0X 5 V X 2X 3 | 61 J 2.85^ 10 沧\2 丄c 12g i6(x )=p 1( -------------- ) +6X10 —5.5 兰 0X 6 t X 2X 34■优化方法的选择由于该问题有6个设计变量,16个约束条件的优化设计问题, 采用传统的优化设计方法比较繁琐,比较复杂,所以选用 Matlab 优化工具箱中的fmincon 函数来求解此非线性优化问题,避免了 较为繁重的计算过程。
优化设计复合形法 C语言程序
EE+=pow((FF[j]-F(Xs)),2); } EE=pow((1/(k+0.0)*EE),0.5); if(EE<=E1) { goto s333; } for(i=0;i<n;i++) { Xc[i]=0; for(j=1;j<k;j++) { Xc[i]+=X[j][i]; } Xc[i]=1/(k-1.0)*Xc[i]; } if(cons(Xc)==1) { af=1.3; ss:for(i=0;i<n;i++) { Xr[i]=Xc[i]+af*(Xc[i]-Xh[i]); } if(cons(Xr)==1) { if(F(Xr)>=F(Xh)) { if(af<=ep) { for(i=0;i<n;i++) { Xh[i]=Xg[i]; } af=1.3;goto ss; } else {af=1/2.0*af;goto ss;}
} for(j=1;j<k;j++) { for(i=0;i<n;i++) { X0[i]=0; for(jj=1;jj<j+1;jj++) { X0[i]+=X[jj][i]; } X0[i]=(1/j)*(X0[i]); } if(cons(X0)==0) { goto sl; } for(i=0;i<n;i++) {XX[i]=X[j][i];} while(cons(XX)==0) { for(i=0;i<n;i++) { X[j][i]=X0[i]+0.5*(X[j][i]-X0[i]); XX[i]=X[j][i]; } } } } main() { double EE,Xc[n],Xh[n],Xg[n],X1[n],Xr[n],Xs[n],w; int l, lp, lp1; bou(); s111:produce(a,b); s222:for(j=0;j<k;j++) {
机械优化设计实验指导书
前 言机械优化设计是一门实践性很强的课程,必须通过实际上机操作运用各种优化方法程序来达到:1、加深对机械优化设计方法的基本理论和算法步骤的理解;2、培养独立编制计算机程序的能力;3、掌握常用优化方法程序的使用;4、培养灵活运用优化方法解决工程设计问题的能力。
因此,本课程在课堂教学过程中安排适当的时间上计算机运算。
本书作为上机实验的指导书,旨在对每次实验目的内容提出具体要求,并加以考核。
实验报告内容每次上机实验后,学生要做一份完整的实验报告,实验报告内容应包括:1、优化方法的基本原理简述;2、自编优化方法源程序。
3、考核题的优化结果及其分析;4、具体工程设计问题的数学模型、优化设计结果及其分析。
实验一 一维搜索方法(黄金分割法或二次插值法)1、 目的:加深对一维搜索方法的确定区间的进退法和缩短区间的黄金分割法或二次插值法基本原理的理解2、 内容:按所给程序框图编制上机程序,上机输入、调试并运行程序,或调试并运行已给程序,用所给考核题进行检验。
3、 考核题(α0=0,h 0=0.1, ε=0.001)(1) 36102+-=t t )t (f min(2) 60645234+-+-=t t t t )t (f min(3) 221)t )(t ()t (f min -+=(4) x e x )x (f min -+=22(5) 求函数4321322123141x x x x x x x x x x )X (f +--=自点T k ),,,(X 3210---=出发,沿方向T ),,,(4321=d 的最优步长因子α× 和在d 方向的极小点X *和极小值f(X *)。
实验二 多维无约束优化方法(鲍威尔法或拟牛顿法)1、目的:加深对所学多维无约束优化方法基本原理的理解,增强编制和调试程序的能力,懂得如何在多维无约束优化方法中调用一维搜索方法程序。
2、内容:按所给程序框图编制上机程序,上机输入、调试并运行程序,或调试并运行已给程序,用所给考核题进行检验。
优化设计复合型法程序
复合形法Const N = 2Const K = 4'Const N1 = 2Const N1 = 5Const E = 0.001Const NM = 500Dim OutName As StringDim H As IntegerDim L As IntegerDim f() As DoubleFunction Fx(x() As Double) As Double'Fx = (x(1) - 2) * (x(1) - 2) + (x(2) - 1) * (x(2) - 1)Fx = x(2) ^ 3 * ((x(1) - 3) ^ 2 - 9) / (27 *Sqr(3))End FunctionFunction Strain(x() As Double) As Integer Dim i As IntegerDim fin As IntegerDim g() As DoubleReDim g(N1) As Doublefin = 1'=========所有约束条件都为大于0的格式:g(x)>0==============='g(1) = x(2) - x(1) * x(1)'g(2) = 2 - x(1) - x(2)g(1) = x(1) / Sqr(3) - x(2)g(2) = x(1) + x(2) / Sqr(3)g(3) = 6 - x(1) - Sqr(3) * x(2)g(4) = x(1)g(5) = x(2)For i = 1 To N1If g(i) < 0# Thenfin = 0Exit ForEnd IfNext iStrain = finEnd FunctionSub Startab(a() As Double, b() As Double)'a(1) = -5#: b(1) = 6#'a(2) = -5#: b(2) = 8#a(1) = -10#: b(1) = 20# a(2) = -5#: b(2) = 8#End SubFunction xfout(x() As Double, m As Integer) As DoubleDim j As IntegerDim f As Doublef = Fx(x)Print #1, "For j = 1 To N - 1Print #1, Format$(x(j), "###0.0000000"); " ";Next jPrint #1, Format$(x(N), "###0.0000000"); "]", m, Format$(f, "###0.0000000")xfout = fEnd FunctionFunction StartFhx(a() As Double, b() As Double, num As Integer) As IntegerDim i As Integer, i1 As Integer, iw As Integer, kk As IntegerDim j As Integer, j1 As Integer, m As Integer, fh1 As IntegerDim sum2() As DoubleReDim sum2(N) As DoubleDim sum3 As Double, delt1 As DoubleDim alf As Double, r As Doublekk = 0fh1 = 1delt1 = 0.01'RandomizeDoFor i = 1 To NRandomizeTpoint(1).X1(i) = a(i) + Rnd * (b(i) - a(i)) Next iiw = Strain(Tpoint(0).X1)kk = kk + 1If (kk > num) ThenDebug.Print "找不到初始可行点,可能初始区间不合适!"fh1 = 2StartFhx = fh1Exit FunctionEnd IfLoop While (iw = 0)For j = 2 To KDoFor i = 1 To NRandomizeTpoint(j).X1(i) = a(i) + Rnd * (b(i) - a(i)) Next iiw = Strain(Tpoint(j).X1)If iw = 0 Thenm = jFor i1 = 1 To Nsum2(i1) = 0Next i1For i1 = 1 To NFor j1 = 1 To msum2(i1) = sum2(i1) + Tpoint(j1).X1(i1) Next j1Next i1For j1 = 1 To NXc.X1(j1) = sum2(j1) / mNext j1alf = 0.5DoFor i = 1 To NTpoint(m).X1(i) = Xc.X1(i) + alf * (Tpoint(m).X1(i) - Xc.X1(i))Next isum3 = 0For i1 = 1 To Nsum3=sum3 + (Tpoint(m).X1(i1) -Xc.X1(i1)) * (Tpoint(m).X1(i1) - Xc.X1(i1)) Next i1sum3 = Sqr(sum3)iw = Strain(Tpoint(m).X1)Loop While (iw = 0 And sum3 > delt1)End IfLoop While (sum3 < delt1)Next jStartFhx = fh1 '返回标志fh1=1End FunctionSub Suan()Dim Max As Double, Min As DoubleDim i As IntegerFor i = 1 To K f(i) = Fx(Tpoint(i).X1)Next iMax = f(1): Min = f(1): H = 1: L = 1For i = 2 To KIf f(i) > Max ThenMax = f(i)H = iElseIf f(i) < Min ThenMin = f(i)L = iEnd IfEnd IfNext iEnd SubSub suan1()Dim Min As DoubleDim i As IntegerDim ih As IntegerMin = f(L) ih = 0For i = 1 To KIf i <> H ThenIf f(i) > Min ThenMin = f(i)ih = iEnd IfEnd IfNext iH = ihEnd SubFunction PanBie() As DoubleDim sum As DoubleDim i As Integersum = 0#For i = 1 To Ksum = sum + (f(i) - f(L)) * (f(i) - f(L))Next iPanBie = Sqr(sum / K)End FunctionFunction NewFhx(a() As Double, b() As Double) As IntegerDim i As Integer, j As Integer, fh1 As Integer, chd As IntegerDim alfa As DoubleDim sum1() As DoubleReDim sum1(N) As Doublefh1 = 1chd = 0Doalfa = 1.3For j = 1 To Nsum1(j) = 0#Next jFor i = 1 To KIf i <> H ThenFor j = 1 To Nsum1(j) = sum1(j) + Tpoint(i).X1(j) Next jEnd IfNextFor j = 1 To NXc.X1(j) = sum1(j) / (K - 1)Next jIf Strain(Xc.X1) = 0 ThenPrint #1, "Xc is wrong "fh1 = 3For i = 1 To Na(i) = Tpoint(L).X1(i)b(i) = Xc.X1(i)Next iNewFhx = fh1Exit FunctionEnd IfFor j = 1 To NXr.X1(j) = Xc.X1(j) + alfa * (Xc.X1(j) - Tpoint(H).X1(j))Next jDo While (Strain(Xr.X1) = 0) Or(Fx(Xr.X1) >= Fx(Tpoint(H).X1))alfa = alfa * 0.5For j = 1 To NXr.X1(j) = Xc.X1(j) + alfa * (Xc.X1(j) - Tpoint(H).X1(j))Next jIf alfa < E ThenIf chd = 0 ThenCall suan1alfa = 1.3 chd = 1Exit DoElseNewFhx = 4Exit FunctionEnd IfEnd IfLoopLoop While (chd = 1)For j = 1 To NTpoint(H).X1(j) = Xr.X1(j)Next jNewFhx = fh1End FunctionPrivate Sub Command1_Click()Dim i As IntegerDim val1 As IntegerDim val2 As IntegerDim dds As IntegerDim nmax As IntegerDim fv As DoubleDim a() As Double, b() As Double ReDim a(N) As Double, b(N) As Double ReDim f(K) As DoubleReDim Tpoint(K) As Coordnmax = NMH = 1: L = 1OutName = "复合形法计算结果.txt" Open OutName For Output As #1Print #1,"************复合形法计算结果****" Call Startab(a, b)Print #1, "本次优化的上下限为:" Print #1, " a=[";For i = 1 To N - 1Print #1, a(i);Next iPrint #1, a(N); "]"Print #1, " b=[";For i = 1 To N - 1Print #1, b(i);Next iPrint #1, b(N); "]"Doval2 = 1dds = 1val1 = StartFhx(a, b, nmax)If val1 = 2 ThenPrint #1, "找不到初始可行点,可能初始区间不合适!"ElsePrint #1, "初始复合形各顶点坐标及函数值:"For i = 1 To Kfv = xfout(Tpoint(i).X1, i)Next iCall SuanPrint #1, " 最好和最差顶点号:"; "L="; L, "H="; HPrint #1, " 复合形顶点值均方差:", Format$(PanBie(), "###0.0000000")Print #1,"---------------------------------------------------" Do While PanBie() > Eval2 = NewFhx(a, b)If (val2 = 3) ThenPrint #1, "该优化问题可行域为非凸集,"; Print #1, "重新给出优化的上下限为:" Print #1, "a=[";For i = 1 To N - 1Print #1, a(i);Next iPrint #1, a(N); "]"Print #1, "b=[";For i = 1 To N - 1Print #1, b(i);Next iPrint #1, b(N); "]"Exit DoEnd IfCall SuanPrint #1, "迭代轮数k="; ddsFor i = 1 To Kfv = xfout(Tpoint(i).X1, i)Next iPrint #1, "最好和最差顶点号:"; "L="; L, "H="; HPrint #1, "复合形顶点值均方差:"; Format$(PanBie(), "###0.0000000")Print #1,"---------------------------------------------------" dds = dds + 1LoopEnd IfLoop While (val2 = 3 And val1 <> 2)If val2 = 4 ThenPrint #1, "对次坏点的影射仍然无法找到下一个";Print #1, "复合形顶点,计算终止。
机械优化设计——复合形方法及源程序
机械优化设计——复合形方法及源程序(一)题目:用复合形法求约束优化问题()()()2221645min -+-=x x x f ;06422211≤--=x x g ;01013≤-=x g 的最优解.基本思路:在可行域中构造一个具有K 个顶点的初始复合形。
对该复合形各顶点的目标函数值进行比较,找到目标函数值最大的顶点(即最坏点),然后按一定的法则求出目标函数值有所下降的可行的新点,并用此点代替最坏点,构成新的复合形,复合形的形状每改变一次,就向最优点移动一步,直至逼近最优点。
(二)复合形法的计算步骤1)选择复合形的顶点数k,一般取n k n 21≤≤+,在可行域内构成具有k 个顶点的初始复合形。
2)计算复合形个顶点的目标函数值,比较其大小,找出最好点x L 、最坏点x H 、及此坏点x G .。
3)计算除去最坏点x H 以外的(k —1)个顶点的中心x C 。
判别x C 是否可行,若x C 为可行点,则转步骤4);若x C 为非可行点,则重新确定设计变量的下限和上限值,即令C L x b x a ==,,然后转步骤1),重新构造初始复合形。
4)按式()H C C R x x x x -+=α计算反射点x R,必要时改变反射系数α的值,直至反射成功,即满足式()()()()H R R j x f x f m j x g <⋯⋯=≤;,2,1,0,。
然后x R以取代x H,构成新的复合形。
5)若收敛条件()()[]ε≤⎪⎭⎪⎬⎫⎩⎨⎧--∑=211211k j L j x f x f k 得到满足,计算终止。
约束最优解为:()()L L x f x f x x ==*,*.(三)复合形法程序框图见下图:(四)/*输入值选择n=2,k=3,本程序可以处理n为2或3,k为3或4的情况*/#include 〈stdio。
h>#include 〈stdlib。
h〉#include 〈time.h>#include 〈math.h>#define E0 1e—5 /*复合形法收敛控制精度*/double **apply(int,int); /*申请矩阵空间*/double f(double *);/*目标函数*/double *g(double *);/*约束函数*/bool judge(double *); /*可行点的判断*/int main(){int n,k;int i,j,k1;int l;double temporary;double restrain; /*收敛条件*/double reflect; /*反射系数*/srand((unsigned)time(NULL));printf("请输入目标函数的维数n:"); /*输入已知数据*/scanf("%d",&n);printf(”请输入复合形的顶点数k:”);scanf(”%d",&k);double **x=apply(k,n);/*存放复合形顶点*/double *y=(double *)calloc(k,sizeof(double)); /*存放目标函数值*/double *p=(double *)calloc(3,sizeof(double)); /*存放约束函数值*/double *a=(double *)calloc(n,sizeof(double)); /*存放设计变量的下限*/double *b=(double *)calloc(n,sizeof(double)); /*存放设计变量的上限*/double *x_c=(double *)calloc(n,sizeof(double));/*存放可行点中心*/double *x_r=(double *)calloc(n,sizeof(double)); /*存放最坏点的反射点*/printf("本程序中的所有输入,两个数之间用空格隔开,然后按enter键时不要长时间的按,否则,可能会出错\n”);printf("请输入选定的第一个可行点x1(包含%d个数):",n);for(i=0;i〈n;i++)scanf("%lf”,*x+i);printf(”请输入初选变量的下限a(包含%d个数):”,n);for(i=0;i<n;i++)scanf("%lf",a+i);printf(”请输入初选变量的上限b(包含%d个数):",n);for(i=0;i〈n;i++)scanf(”%lf",b+i);printf(”输出输入结果为:\nn=%d,k=%d,x1=(",n,k);/*输出已知数据*/for(i=0;i<n—1;i++)printf("%.5lf ”,*(*x+i));printf(”%。
机械优化设计_第六章约束优化方法
X K X H XC X H
f XK f XH
则收缩成功,用收 缩点构成新的复合 形。
机械优化设计 (4)压缩
若采用上述方法均无效,可采取复合形各顶点向最 好点 X L 靠拢,即采用压缩的方法来改变复合形的形状。 压缩后的各顶点的计算公式为:
X j X L 0.5 X L X j ( j 1, 2, , k ; j L)
x, 1 , 2 f x 1G g j x 2 H hk x
j 1 k 1
m
l
新目标函数
加权因子
机械优化设计 2)间接解法的特点
①计算效率和数值计算的稳定性有较大提高; ②可以有效地处理具有约束等式约束的约束优化 问题; ③选择加权因子困难,如果选择不当,不但影响 收敛速度和计算精度,甚至会导致计算失败。
hk X hk x1, x2 , xn 0(k 1,2, l )
求解上式的方法称为约束优化方法
机械优化设计 2、求解方法 根据求解方式不同,约束优化设计问题可分为 直接解法和间接解法。 (1)直接解法:将迭代点限制在可行域内(可行 性),步步降低目标函数值(下降性),直至到达 最优点。如随机方向法、复合形法、可行方向法、 广义简约梯度法。 (2)间接解法:通过变换,将约束优化问题转化 为无约束优化问题求解。如惩罚函数法、增广乘子 法等。
g j X R 0 J 1, 2, , m f XR f XH
机械优化设计 (2)扩张
当求得的反射点为可行点,且目标函数值下降较多, 则沿反射方向继续移动,即采用扩张的方法,可能找到 更好的新点
X E X R X R XC
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
else if(reflect<=1e-10)
{
for(i=0;i<n;i++)
*(*x+i)=*(*(x+1)+i);
goto L3;
}
else
{
reflect*=0.5;
goto L4;
}
}
}
}
double **apply(int row,int col) /*申请矩阵空间*/
(二)复合形法的计算步骤
1)选择复合形的顶点数k,一般取 ,在可行域内构成具有k个顶点的初始复合形。
2)计算复合形个顶点的目标函数值,比较其大小,找出最好点xL、最坏点xH、及此坏点xG..
3)计算除去最坏点xH以外的(k-1)个顶点的中心xC。判别xC是否可行,若xC为可行点,则转步骤4);若xC为非可行点,则重新确定设计变量的下限和上限值,即令 ,然后转步骤1),重新构造初始复合形。
机械优化设计——复合形方法及源程序
(一)题目:用复合形法求约束优化问题
; ; 的最优解。
基本思路:在可行域中构造一个具有K个顶点的初始复合形。对该复合形各顶点的目标函数值进行比较,找到目标函数值最大的顶点(即最坏点),然后按一定的法则求出目标函数值有所下降的可行的新点,并用此点代替最坏点,构成新的复合形,复合形的形状每改变一次,就向最优点移动一步,直至逼近最优点。
4)按式 计算反射点xR,必要时改变反射系数α的值,直至反射成功,即满足式 。然后xR以取代xH,构成新的复合形。
5)若收敛条件 得到满足,计算终止。约束最优解为: 。
(三)复合形法程序框图见下图:
(四)源程序如下:
/*输入值选择n=2,k=3,本程序可以处理n为2或3,k为3或4的情况*/
#include <stdio.h>
printf("请输入目标函数的维数n:"); /*输入已知数据*/
scanf("%d",&n);
printf("请输入复合形的顶点数k:");
scanf("%d",&k);
double **x=apply(k,n); /*存放复合形顶点*/
double *y=(double *)calloc(k,sizeof(double)); /*存放目标函数值*/
for(i=0;i<n;i++)
scanf("%lf",b+i);
printf("输出输入结果为:\nn=%d,k=%d,x1=(",n,k); /*输出已知数据*/
for(i=0;i<n-1;i++)
printf("%.5lf ",*(*x+i));
printf("%.5lf)\na=(",*(*x+n-1));
double *x_c=(double *)calloc(n,sizeof(double)); /*存放可行点中心*/
double *x_r=(double *)calloc(n,sizeof(double)); /*存放最坏点的反射点*/
printf("本程序中的所有输入,两个数之间用空格隔开,然后按enter键时不要长时间的按,否则,可能会出错\n");
double *p=(double *)calloc(3,sizeof(double));
p=g(x);
for(i=0;i<3;i++)
if(*(p+i)>0)
break;
if(i==3)
return true;
else
return false;
}
(五)运行结果如下:
{
int i;
double *x=(double*)calloc(row*col,sizeof(double));
double **y=(double **)calloc(row,sizeof(double *));
if(!x || !y)
{
printf("内存分配失败!");
exit(1);
}
for(i=0;i<row;i++)
for(j=0;j<n;j++)
*(*(x+i)+j)=*(a+j)+(double)(rand()%10000)/10000*(*(b+j)-*(a+j));
l=1;
for(i=1;i<k;i++) /*找出可行点的个数l,并把可行点放在前l个位置上*/
if(judge(*(x+i)))
{
for(j=1;j<k;j++)
bool judge(double *); /*可行点的判断*/
int main()
{
int n,k;
int i,j,k1;
int l;
double temporary;
double restrain; /*收敛条件*/
double reflect; /*反射系数*/
srand((unsigned)time(NULL));
L4:for(i=0;i<n;i++) /*求反射点*/
*(x_r+i)=*(x_c+i)+reflect*(*(x_c+i)-*(*x+i));
if(!judge(x_r))
{
reflect*=0.5;
goto L4;
}
else if(f(x_r)<f(*x))
{
for(i=0;i<n;i++)
*(*x+i)=*(x_r+i);
if(!judge(*(x+j)))
{
for(k1=0;k1<n;k1++)
{
temporary=*(*(x+i)+k1);
*(*(x+i)+k1)=*(*(x+j)+k1);
*(*(x+j)+k1)=temporary;
}
break;
}
l++;
}
for(i=0;i<l-1;i++) /*把前l个可行点按目标函数值从大到小排序*/
*(x_c+i)=0;
for(i=0;i<l;i++)
for(j=0;j<n;j++)
*(x_c+j)+=*(*(x+i)+j);
for(i=0;i<n;i++)
*(x_c+i)/=l;
if(!judge(x_c)) /*判断可行点中心是否可行*/
{
for(i=0;i<n;i++)
{
*(a+i)=*(*(x+l-1)+i);
for(i=0;i<n-1;i++)
printf("%f ",*(a+i));
printf("%.5lf),b=(",*(a+n-1));
for(i=0;i<n-1;i++)
printf("%f ",*(b+i));
printf("%.5lf)\n",*(b+n-1));
L1:for(i=1;i<k;i++) /*随机得到其余(k-1)个可行点*/
L2:for(i=0;i<k-1;i++) /*将可行点按目标函数值从大到小排序*/
for(j=i+1;j<k;j++)
if(f(*(x+i))<f(*(x+j)))
for(k1=0;k1<n;k1++)
{
temporary=*(*(x+i)+k1);
*(*(x+i)+k1)=*(*(x+j)+k1);
{
L3:for(i=0;i<n;i++) /*计算除去最坏点*x外的(k-1)个顶点的中心*/
*(x_c+i)=0;
for(i=1;i<k;i++)
for(j=0;j<n;j++)
*(x_c+j)+=*(*(x+i)+j);
for(i=0;i<n;i++)
*(x_c+i)/=k-1;
reflect=1.3;
*(y+i)=x+i*col;
ouble *x) /*目标函数*/
{
return (*x-5)*(*x-5)+4*(*(x+1)-6)*(*(x+1)-6);
}
double *g(double *x) /*约束函数*/
{
double *p=(double *)calloc(3,sizeof(double));
double *p=(double *)calloc(3,sizeof(double)); /*存放约束函数值*/
double *a=(double *)calloc(n,sizeof(double)); /*存放设计变量的下限*/
double *b=(double *)calloc(n,sizeof(double)); /*存放设计变量的上限*/