机械优化设计——复合形方法及源程序

合集下载

机械优化设计实验报告

机械优化设计实验报告

《机械优化设计》实验报告目录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

机械优化设计3
式中 β-收缩系数,一般取 0.7
若 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 )

优化设计复合形法

优化设计复合形法
f (X1) 4 2 12 12 5 f (X2) 4 4 12 12 3 f (X3) 43 32 12 9
所以,坏点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

复合形法减速器的优化设计.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 致谢 ......................................................................... 错误!未定义书签。

机械优化设计-复合型法

机械优化设计-复合型法
double a[]={0,0},b[]={10,20},f,x[2],xcom[2][100];
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

3)从统计的观点来看,一般情况下,最坏点XH和中心点XC 的连线方向为目标函数的下降方向。
三、复合形法的搜索方法
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)算法原理复合形法来源于无约束优化问题的单纯形法,通过构造复合形来求得最优解,新的复合形通过替换旧的复合形中的坏点(目标函数最大或次大的点)得到,替换方式仍是单纯性法中的反应、压缩、扩展这几个基本方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
goto L2;
}
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)); /*存放设计变量的上限*/
相关文档
最新文档