机械优化设计黄金分割法 外推法
最优化课程设计--黄金分割法及其算法实现(3

机械优化设计报告姓名:刘洋学号:S12080203054院系:机械工程学院专业:机械设计及理论2012年 12月 4日摘要最优化理论和方法日益受到重视,已经渗透到生产、管理、商业、军事、决策等各个领域,而最优化模型与方法广泛应用于工业、农业、交通运输、商业、国防、建筑、同学、政府机关等各个部门及各个领域。
伴随着计算机技术的高速发展,最优化理论与方法的迅速进步为解决实际最优化问题的软件也在飞速发展。
其中,MATLAB软件已经成为最优化领域应用最广的软件之一。
有了MATLAB 这个强大的计算平台,既可以利用MATLAB优化工具箱(OptimizationToolbox)中的函数,又可以通过算法变成实现相应的最优化计算。
关键词:优化、黄金分割法、最速下降法、MATLAB、算法AbstractOptimization theory and methods and more attention, have penetrated into the production, management, business, military, decision-making and other fields, and optimization models and methods widely used in industry, agriculture, transportation, commerce, defense, construction, students, government various departments and agencies and other fields. With the rapid development of computer technology,optimization theory and methods for the rapid progress of the optimization problem to solve practical software is also developing rapidly. Which, MATLAB software has become the most optimization software is one of the most widely used. With this powerful computing platform MATLAB, either using MATLAB optimization toolbox (OptimizationToolbox) in the function, but also can achieve the appropriate algorithm to optimize into the calculation.Key words: Optimization、Golden section method、steepest descent method、MATLAB、algorithm目录摘要 (2)第一章绪论 (5)第二章黄金分割法的基本思想与原理 (6)2.1 黄金分割法的基本思路 (6)2.2 算法流程图 (7)2.3 用matlab编写源程序 (7)2.4 黄金分割法应用举例 (8)第三章最速下降法的基本思想与原理 (9)3.1 最速下降法的基本思路 (9)3.2 算法流程图 (11)3.3 用matlab编写源程序 (11)3.4 最速下降法应用举例 (13)第四章惩罚函数法的基本思想与原理 (13)4.1 惩罚函数法的基本思路 (13)4.2 算法流程图 (14)4.3 用matlab编写源程序 (14)4.4 最速下降法应用举例 (16)第五章总结 (17)参考文献 (18)第1章绪论在人类活动中,要办好一件事(指规划、设计等),都期望得到最满意、最好的结果或效果。
机械优化设计实验报告

一、实验目的本次实验旨在通过计算机编程,加深对机械优化设计方法的理解,掌握常用的优化算法,并能够利用计算机解决实际问题。
二、实验内容1. 黄金分割法(1)实验原理黄金分割法是一种常用的优化算法,适用于一元函数的极值求解。
其基本原理是:在给定初始区间内,通过迭代计算,逐步缩小搜索区间,直到满足收敛条件。
(2)实验步骤① 设计实验程序,实现黄金分割法的基本算法。
② 编写函数,用于计算一元函数的值。
③ 设置初始区间和收敛精度。
④ 迭代计算,更新搜索区间。
⑤ 判断是否满足收敛条件,若满足则输出结果,否则继续迭代。
(3)实验结果通过编程实现黄金分割法,求解函数f(x) = x^3 - 6x^2 + 9x + 1在区间[0, 10]内的极小值。
实验结果显示,该函数在区间[0, 10]内的极小值为1,且收敛精度达到0.001。
2. 牛顿法(1)实验原理牛顿法是一种求解非线性方程组的优化算法,其基本原理是:利用函数的导数信息,逐步逼近函数的极值点。
(2)实验步骤① 设计实验程序,实现牛顿法的基本算法。
② 编写函数,用于计算一元函数及其导数。
③ 设置初始值和收敛精度。
④ 迭代计算,更新函数的近似值。
⑤ 判断是否满足收敛条件,若满足则输出结果,否则继续迭代。
(3)实验结果通过编程实现牛顿法,求解函数f(x) = x^3 - 6x^2 + 9x + 1在区间[0, 10]内的极小值。
实验结果显示,该函数在区间[0, 10]内的极小值为1,且收敛精度达到0.001。
3. 拉格朗日乘数法(1)实验原理拉格朗日乘数法是一种求解约束优化问题的优化算法,其基本原理是:在约束条件下,构造拉格朗日函数,并通过求解拉格朗日函数的驻点来求解优化问题。
(2)实验步骤① 设计实验程序,实现拉格朗日乘数法的基本算法。
② 编写函数,用于计算目标函数、约束函数及其导数。
③ 设置初始值和收敛精度。
④ 迭代计算,更新拉格朗日乘数和约束变量的近似值。
机械优化设计

机械优化设计黄金分割法黄金分割法在实际计算中,最常用的一维搜索试探方法是黄金分割法,又称作0.618法。
黄金分割法适用于【a,b】区间上的任何单谷函数求极小值问题。
对函数除要求“单谷”外不作其他要求,甚至可以不连续。
因此,这种方法的适用面相当广。
黄金分割法也是建立在区间消去原理基础上的试探方法,即在搜索区间【a,b】内适当地插入α1、α2,并计算其函数值。
α1、α2将区间分成3段。
应用函数的单谷性质,通过函数值大小的比较,删去其中一段,使搜索区间得以缩短。
然后再在保留下来的区间上作同样的处置,如此迭代下去,使搜索区间无限缩小,从而得到极小点的数值近似解。
黄金分割法要求插入点α1、α2位置相对于区间【a,b】两端点具有对称性,即α1=b-λ(b-a)α2=a+λ(b-a)其中,λ假设保留区间【a, α2】,插入α3,使得aα3=λ(1-λ),aα1=λ2则 1-λ=λ2λ=0.618可见黄金分割法能使相邻两次搜索区间都具有相同的缩短率0.618,所以黄金分割法又称为0.618法。
黄金分割法的搜索过程:1、给出初始搜索区间【a,b】及收敛精度ε(ε=0.001),将λ赋予值0.618.2、按坐标点计算α1、α2的值,并计算相应的函数值f(α1),f(α2).3、根据区间消去法原理缩短搜索区间。
为了能用原来的坐标计算公式,须进行区间名称的代换,并在保留区间中计算一个新的试验点及其函数值.4、检查区间是否缩到足够小何函数值收敛到足够近,如果条件不满足则返回到步骤2.5、如果条件满足,则取最后两实验点的平均值作为极小点的数值近似解.黄金分割法的程序框图如下:题目:给定函数f(a)=a2+2a,当给定搜索区间-3≤a≤5时,实用黄金分割法求极小值点a和相应的函数值。
C语言编程如下:#include<stdio.h>#include<math.h>#define K 0.618int main(){double f(double n);double a,b,a1,a2,y1,y2,c=0.001;int m=1;a=-3;b=5;a1=b-K*(b-a);a2=a+K*(b-a);y1=f(a1);y2=f(a2);do{if(y1>=y2){a=a1;a1=a2;y1=y2;a2=a+K*(b-a);y2=f(a2);}else{b=a2;a2=a1;y2=y1;a1=b-K*(b-a);y1=f(a1);}m++;}while(fabs((b-a)/b)>=c||fabs((y2-y1)/y2)>=c);a=(a+b)/2;printf("极小值点a=%8.5lf\n",a);printf("函数值y=%8.5lf\n",f(a));printf("迭代次数为%d\n",m);return 0;}double f(double n){double y;y=n*n+2*n;return y;}运行结果如下:。
机械优化设计知识点

多元函数()F x 在x *处梯度()0F x *∇=是极值存在的必要条件。
在无约束优化问题中,根据设计变量的多少,优化求优的搜索过程分为一维搜索和多维搜索,一维搜索方法有:。
多维搜索方法有坐标轮换法 。
等。
设计空间中的一个点就是一种设计方案.0.618黄金分割法是一种等比缩短区间的直接搜索方法。
有两个设计变量,目标函数与设计变量之间的关系是二维空间中的一个曲面。
最速下降法搜索方向以负梯度方向又称梯度法。
无约束优化方法中,属于直接法有:应用外推法来确定搜索区间时,最后得到的三点,即为搜索区间的始点、中间点和终点,它们的函数值形成高—低—高趋势。
梯度法和牛顿法可看作是变尺度法的一种特例。
随机方向法所用的步长一般按加速步长法来确定,此法是指依次迭代的步长按一定的比例递增的方法。
改变复合形形状的搜索方法有:工程优化设计问题的数学本质是求解多变量非线性函数的极限值。
求解无约束优化问题最有效的算法之一变尺度法。
在单峰搜索区间[a,b]内,任取两个试算点a 1,a 2,若两点的函数值F(a 1)> F(a 2),则缩小后的区间[a,b]。
海赛矩阵()()⎥⎦⎤⎢⎣⎡--=21120X H 其逆矩阵()()[]10-X H =? 对于多元函数的无约束优化问题,判断其最优点可以根据目标函数的梯度判定。
小/中/大型优化问题的定义。
梯度方向是函数具有最大变化率的方向。
凸规划的任何局部极小解一定是全局最优解。
机械优化设计中根据设计要求事先给定的独立参数是设计常量。
等值线或等值面更适合表达优化问题的数值迭代搜索求解过程。
若矩阵A的各阶顺序主子式均大于零,则该矩阵为正定矩阵.机械最优化设计问题多属于约束非线性优化问题。
机械优化设计外推法,黄金分割法,二次插值法

for(;a1>a3;) {t=a3; a3=a1; a1=t; t=y1; y3=y1;
if(f(x1)>f(x2)) *a=x1; else *b=x2; *n=*n+1; s=hj(a,b,e,n); } return s; } void main() { double s,a,b,e,m; int n=0; printf("输入 a,b 值和精度 e 值\n"); scanf("%lf %lf %lf",&a,&b,&e); s=hj(&a,&b,e,&n); m=(a+b)/2; printf("a=%lf,b=%lf,s=%lf,m=%lf,n=%d\n",a,b,s,m,n); }
} } while(sqrt(pow((x[2][1]-x[0][1]),2)+ pow((x[2][2]-x[0][2]),2))>=1e-6); xx[1]=x[2][1]; xx[2]=x[2][2]; fi=fun2(xx[1],xx[2]); printf("the best answer is : \nx1*= %f\nx2*=%f\nf*=%f\n",xx[1],xx[2],fi);
for(i=1;i<=2;i++) { if(i==1) {d[i][1]=1;
机械优化设计-黄金分割法

总结:
• 一维搜索第一步:找初始单谷区间; 1.进退法
第二步:使区间缩小。 2.黄金分割法
二、一维搜索方法分类
根据插入点位置的确定方法,可以把一维搜索法 分成两大类: ⑴试探法:即按照某种规律来确定区间内插入点 的位置,如黄金分割法,斐波那契法等。
斐波那契数列:1、1、2、3、5、8、13、21 、34、55、89、144...... ⑵插值法(函数逼近法):通过构造插值函数来 逼近原函数,用插值函数的极小点作为区间的插 入点,如二次插值法,三次插值法等。
y1=subs(f,a1); y2=subs(f,a2); if y1>y2 a=a1; a1=a2; y1=y2; a2=a+0.618*(b-a); disp(['判定: f1>=f2']); else b=a2; a2=a1; y2=y1; a1=a+0.382*(b-a); disp(['判定: f1<f2']); end
b=input('输入初始单谷区间右端点='); e=input('搜索精度(数值越小所求极小值精度越高) e='); k=0; format long; a1=a+0.382*(b-a); a2=a+0.618*(b-a); fprintf('第0次缩短区间\n'); fprintf('a1='); disp(a1); fprintf('a2='); disp(a2); while b-a>e
k=k+1; disp(['第',num2str(k),'次缩短区间']); fprintf('a1='); disp(a1); fprintf('a2='); disp(a2); end format long; xmin=(a+b)/2; fmin=subs(f,xmin); fprintf('迭代次数k='); disp(k); disp('极小值为'); disp('fmin ='); disp(fmin); fprintf('极小点为'); t=a:e/100:b; T=subs(f,t); plot(t,T);
机械优化设计方法简介

机械优化设计方法简介一.引言“设计”作为人们综合运用科学技术原理和知识并有目的地创造产品的一项技术,已经发展为现代社会工业文明的重要支柱。
今天,设计水平已是一个国家的工业创新能力和市场竞争能力的重要标志。
许多的设计实践经验告诉我们,设计质量的高低,是决定产品的一系列技术和经济指标的重要因素。
因此,在产品生产技术的第一道工序—设计上,考虑越周全和越符合客观,则效果就会越好。
在产品设计中,追求设计结果的最优化,一直是我们工作努力的目标。
现代设计理论、方法和技术中的优化设计,为工程设计人员提供了一种易于实施且可使设计结果达到最优化的重要方法和技术,以便在解决一些复杂问题时,能从众多设计的方案中找出尽可能完善的或是最好的方案。
这对于提高产品性能、改进产品质量、提高设计效率,都是具有重要意义的。
二.优化设计的概念优化设计是将工程设计问题转化为最优化问题,利用数学规划的方法,借助于计算机(高速度、高精度和大存储量)的处理,从满足设计要求的一切可行方案中,按照预定的目标自动寻找最优设计的一种设计方法。
机械优化设计最优化(Optimization)通常是指解决设计问题时,使其结果达到某种意义上的无可争议的完善化。
最优化“OPT”在科学和技术领域内如同使用最大“MAX”和最小“MIN”一样具有普遍性。
把机械设计和现代设计理论及方法相结合,借助电子计算机,自动寻找实现预期目标的最优设计方案和最佳设计参数。
三.优化设计的一般实施步骤(1)根据设计要求和目的定义优化设计问题;(2)建立优化设计问题的数学模型;(3)选用合适的优化计算方法;(4)确定必要的数据和设计初始点;(5)编写包括数学模型和优化算法的计算机程序,通过计算机的求解计算获取最优结构参数;(6)对结果数据和设计方案进行合理性和适用性分析。
其中,最关键的是两个方面的工作:首先将优化设计问题抽象和表述为计算机可以接受与处理的优化设计数学模型,通常简称它为优化建模;然后选用优化计算方法及其程序在计算机上求出这个模型的的最优解,通常简称它为优化计算。
机械优化设计方法

f x0
f
x (0) 1
x1,
x20
x2
f
x10 , x20
lim
d
0
lim x1 0 x2 0
f
x (0) 1
x1,
x20
x2
f
x10 , x20 x2
x1
x1
f
稳定约束条件 x e 可以写成
1
F B2 h2 2 2E T 2 D2
TDh
8 B2 h2
人字架的总质量
1
mD, h 2 AL 2TD B2 h2 2
这个优化问题是以D和h为设计变量的二 维问题,且只有两个约束条件,可以用 解析法求解。
架的高h和钢管平均直径D,使钢管总质量m为最小。
图2-2 人字架的受力
人字架的优化设计问题归结为:
x D H T 使结构质量
mx min
但应满足强度约束条件 x y 稳定约束条件 x e
1
钢管所受的压力
F1
FL h
F(B2 h
h2 ) 2
f x0 T
f x0
,
,...
x1
x2
xn
cos1
沿d方向的方向向量
d
cos
2
...
cos
n
即
f d
x0
f
x 0 T
d
f x 0 T
cosf ,d
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
大学机械优化设计部分程序1.外推法2.黄金分割法3.二次插值法4.坐标轮换法5.随机方向法6.四杆机构优化设计1.外推法源程序:#include<stdio.h>#include<math.h>#define R 0.01double fun(double x){ double m;m=x*x-10*x+36;return m;}void main(){double h0=R,y1,y2,y3,x1,x2,x3,h; x1=0;h=h0;x2=h;y1=fun(x1);y2=fun(x2);if(y2>y1){h=-h;x3=x1;y3=y1;x1=x2;y1=y2;x2=x3; y2=y3;}x3=x2+h;y3=fun(x3);while(y3<y2){h*=2.0;x1=x2;y1=y2;x2=x3;y2=y3;x3=x2+h;y3=fun(x3);}printf("fun(%f)=%f,fun(%f)=%f,fun( %f)=%f\n",x1,y1,x2,y2,x3,y3);}运行过程及结果:fun(2.560000)=16.953600,fun(5.120000)=11.014400,fun(10.240000)=38.4576002.黄金分割法源程序:#include<stdio.h>#include<math.h>#define f(x) x*x*x*x-5*x*x*x+4*x*x-6*x+60double hj(double *a,double *b,double e,int *n){double x1,x2,s;if(fabs((*b-*a)/(*b))<=e)s=f((*b+*a)/2);else{x1=*b-0.618*(*b-*a);x2=*a+0.618*(*b-*a);if(f(x1)>f(x2))*a=x1;else*b=x2;*n=*n+1;s=hj(a,b,e,n);}return s;}void main() {double s,a,b,e,m;int n=0;printf("输入a,b值和精度e值\n"); scanf("%lf %lf %lf",&a,&b,&e);s=hj(&a,&b,e,&n);m=(a+b)/2;printf("a=%lf,b=%lf,s=%lf,m=%lf,n=%d\ n",a,b,s,m,n);}运行过程及结果:输入a,b值和精度e值-350.0001a=3.279466,b=3.279793,s=22.659008,m =3.279629,n=213.二次插值法源程序:#include<stdio.h>#include<math.h>int main(void){double a1,a2,a3,ap,y1,y2,y3,yp,c1,c2,m; double j[3];int i,h=1;void finding(double a[3]);finding(j);a1=j[0];a2=j[1];a3=j[2];m=0.001;double f(double x);y1=f(a1);y2=f(a2);y3=f(a3);for(i=1;1>=1;i++){c1=(y3-y1)/(a3-a1);c2=((y2-y1)/(a2-a1)-c1)/(a2-a3);ap=0.5*(a1+a3-c1/c2);yp=f(ap);if(fabs((y2-yp)/y2)<m)break;else if((ap-a2)*h>0) {if(y2>=yp){a1=a2;y1=y2;a2=ap;y2=yp;}else{a3=ap;y3=yp;} }else if(y2>=yp){a3=a2;y3=y2;a2=ap;y2=yp;} else{a1=ap;y1=yp;} }double x,y;if(y2<=yp){x=a2;y=y2;}else{x=ap;y=yp;}printf("a*=%f\n",x); printf("y*=%f\n",y);return 0;}double f(double x){double y;y=x*x-10*x+36;return y;}void finding(double a[3]) {int h,i;double y[3];a[0]=0;h=1;a[1]=h;y[0]=f(a[0]);y[1]=f(a[1]);if(y[1]>y[0]){h=-h;a[2]=a[0];y[2]=y[0];do{a[0]=a[1];a[1]=a[2];y[0]=y[1];y[1]=y[2];a[2]=a[1]+h;y[2]=f(a[2]);h=2*h;}while(y[2]<y[1]);}else{for(i=1;i>=1;i++){a[2]=a[1]+h;y[2]=f(a[2]);if(y[2]>=y[1])break;h=2*h;a[0]=a[1];y[0]=y[1];a[1]=a[2];y[1]=y[2];}}return;}运行过程及结果:a*=5.000000y*=11.0000004.坐标轮换法源程序:#include <stdio.h>#include <math.h>#include <conio.h>float fun1(float x,float a,float b) {float y;y=x+a*b;return y;}float fun2(float x,float y){float z;z=4*(x-5)*(x-5)+(y-6)*(y-6); return z;}main(){floatd[100][3],x[100][3],xx[3],ax[100][3]; float a1,a2,a3,h,t,y1,y2,y3,e,a,b,l,fi; int i,k;printf("输入初始点坐标\n");scanf("%f%f",&x[0][1],&x[0][2]); e=0.000001;l=0.618;x[2][1]=x[0][1];x[2][2]=x[0][2];k=0;k--;do{x[0][1]=x[2][1];x[0][2]=x[2][2];k++;for(i=1;i<=2;i++) {if(i==1){d[i][1]=1;d[i][2]=0;}else{d[i][1]=0;d[i][2]=1;}h=0.1;a1=0;a2=h;x[i][1]=fun1(x[i-1][1],d[i][1],a1); x[i][2]=fun1(x[i-1][2],d[i][2],a1); y1=fun2(x[i][1],x[i][2]);x[i][1]=fun1(x[i-1][1],d[i][1],a2); x[i][2]=fun1(x[i-1][2],d[i][2],a2); y2=fun2(x[i][1],x[i][2]);if(y2>y1){h=-h;a3=a1;y3=y1;a1=a2;a2=a3;y1=y2;y2=y3;}a3=a2+h;x[i][1]=fun1(x[i-1][1],d[i][1],a3); x[i][2]=fun1(x[i-1][2],d[i][2],a3); y3=fun2(x[i][1],x[i][2]);do{a1=a2;y1=y2;a2=a3;y2=y3;a3=a2+h;x[i][1]=fun1(x[i-1][1],d[i][1],a3); x[i][2]=fun1(x[i-1][2],d[i][2],a3); y3=fun2(x[i][1],x[i][2]);}while(y3<y2);for(;a1>a3;){t=a3;a3=a1;a1=t;t=y1;y3=y1;y1=t;}a=a1;b=a3;a1=b-l*(b-a);a2=a+l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a1);x[i][2]=fun1(x[i-1][2],d[i][2],a1);y1=fun2(x[i][1],x[i][2]);x[i][1]=fun1(x[i-1][1],d[i][1],a2);x[i][2]=fun1(x[i-1][2],d[i][2],a2);y2=fun2(x[i][1],x[i][2]);if(b<1e-3){for(;fabs(b-a)>e;){if(y1>=y2){a=a1;a1=a2;y1=y2;a2=a+l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a2);x[i][2]=fun1(x[i-1][2],d[i][2],a2);y2=fun2(x[i][1],x[i][2]);}else{b=a2;a2=a1;y2=y1;a1=b-l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a1);x[i][2]=fun1(x[i-1][2],d[i][2],a1);y1=fun2(x[i][1],x[i][2]);}}}else{for(;fabs((b-a)/b)>=e||fabs((y2-y1)/y 2)>=e;){if(y1>=y2){a=a1;a1=a2;y1=y2;a2=a+l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a2);x[i][2]=fun1(x[i-1][2],d[i][2],a2);y2=fun2(x[i][1],x[i][2]);}else{b=a2;a2=a1;y2=y1;a1=b-l*(b-a);x[i][1]=fun1(x[i-1][1],d[i][1],a1);x[i][2]=fun1(x[i-1][2],d[i][2],a1);y1=fun2(x[i][1],x[i][2]);}}}ax[k][i]=0.5*(a+b);x[i][1]=fun1(x[i-1][1],d[i][1],ax[k][i]);x[i][2]=fun1(x[i-1][2],d[i][2],ax[k][i]);}}while(sqrt(pow((x[2][1]-x[0][1]),2)+pow( (x[2][2]-x[0][2]),2))>=1e-6);xx[1]=x[2][1];xx[2]=x[2][2];fi=fun2(xx[1],xx[2]);printf("最优解为\nx1*=%f\nx2*=%f\nf*=%f\nk=%d\n",xx[1],xx[2],fi,k);}运行过程及结果:输入初始点坐标89最优解为x1*=5.000000x2*=6.000000f*=0.000000k=25.随机方向法源程序:#include<math.h>#include<stdio.h>#include<stdlib.h> float f(float x,float y){float z;z=(x-2)*(x-2)+(y-1)*(y-1);return z;}float g1(float x,float y){float z;z=x*x-y;return z;}float g2(float x,float y){float z;z=x+y-2;return z;}void main(){int i,j;floatk=8,c=0.000001,a0=-3,b0=3,a1=-3,b1= 3;floatx[10],x0[10],xl[10],e[10],r[10],d[10],h,fl,f0 ,fx;while(g1(x0[0],x0[1])>0||g2(x0[0],x0[1])> 0){x0[0]=a0+(rand()/32767.00)*(b0-a0);x0[1]=a1+(rand()/32767.00)*(b1-a1);}fl=f(x0[0],x0[1]);f0=f(x0[0],x0[1]);while(1){h=0.01;j=1;r[0]=-1+(rand()/32767.00)*(1-(-1));r[1]=-1+(rand()/32767.00)*(1-(-1));e[0]=r[0]/sqrt(r[0]*r[0]+r[1]*r[1]); e[1]=r[1]/sqrt(r[0]*r[0]+r[1]*r[1]);x[0]=x0[0]+h*e[0];x[1]=x0[1]+h*e[1];if(g1(x[0],x[1])<=0&&g2(x[0],x[1])<=0) {fx=f(x[0],x[1]);if(fx<fl){fl=fx;for(i=0;i<2;i++){d[i]=e[i];xl[i]=x[i];}}}while(j<=k){j++;r[0]=-1+(rand()/32767.00)*(1-(-1));r[1]=-1+(rand()/32767.00)*(1-(-1));e[0]=r[0]/sqrt(r[0]*r[0]+r[1]*r[1]);e[1]=r[1]/sqrt(r[0]*r[0]+r[1]*r[1]);x[0]=x0[0]+h*e[0];x[1]=x0[1]+h*e[1];if(g1(x[0],x[1])<=0&&g2(x[0],x[1])<=0){fx=f(x[0],x[1]);if(fx<fl){fl=fx;for(i=0;i<2;i++){d[i]=e[i];xl[i]=x[i];}}}}x[0]=xl[0];x[1]=xl[1];while(1){h=1.3*h;x[0]=x[0]+h*d[0];x[1]=x[1]+h*d[1];if(g1(x[0],x[1])>0||g2(x[0],x[1])>0)break;fx=f(x[0],x[1]);if(fx<fl) fl=fx;else break;}do{x[0]=x[0]-h*d[0];x[1]=x[1]-h*d[1];h=0.7*h;if(h<c)break;x[0]=x[0]+h*d[0];x[1]=x[1]+h*d[1];if(g1(x[0],x[1])>0||g2(x[0],x[1])>0)continue;fx=f(x[0],x[1]);}while(fx>=fl);if(fabs((f0-fx)/f0)>=c){x0[0]=x[0];x0[1]=x[1];fl=fx;f0=fx;}elsebreak;}printf("输出最优解为\nx1*=%f,x2*=%f, y*=%f\n",x[0],x[1],fx);}运行过程及结果:输出最优解为x1*=0.995421,x2*=1.004521,y*=1.0092 006.四杆机构优化设计源程序:#include<math.h>#include<stdio.h>#include<stdlib.h>#define Pai 3.1415926int g(float l1,float l2){if((-l1<=0)&&(-l2<=0)&&(6-l1-l2<=0)&&(1-l2-4<=0)&&(l2-l1-4<=0)&&(l1*l1+l2*l2-1.414*l1*l2-16<=0)&&(36-l1*l1-l2*l2-1.414*l1*l2<=0))return (1);elsereturn (0);}float fun(float x0[2]){floatf,a[31],b[31],r[31],p[31],q[31],w[31],x1[2];int i;p[0]=acos(((1+x0[0])*(1+x0[0])-x0[1] *x0[1]+25)/(10+10*x0[0]));q[0]=acos(((1+x0[0])*(1+x0[0])-x0[1] *x0[1]-25)/(10*x0[1]));f=0;for(i=1;i<=30;i++){p[i]=p[0]+(Pai/60)*i;r[i]=sqrt(26-10*cos(p[i]));a[i]=acos((r[i]*r[i]+x0[1]*x0[1]-x0[0]* x0[0])/(2*r[i]*x0[1]));b[i]=acos((r[i]*r[i]+24)/(10*r[i]));q[i]=Pai-a[i]-b[i];w[i]=q[0]+(2*(p[i]-p[0])*(p[i]-p[0]))/( 3*Pai);f=f+(Pai/60)*(q[i]-w[i])*(q[i]-w[i])*(p[ i]-p[i-1]);}return f;}void main(){floata,q,f,fl,f0,l[2],z[2],d0[100],d1[100],x[2],xi[ 2],fx,m0,m1,e;int i,j,n,k;printf("输入精度");scanf("%f",&e);do{z[0]=0+5*(rand()/32767.00);z[1]=0+5*(rand()/32767.00);}while(g(z[0],z[1])==0);for(i=0;i<=99;i++){d0[i]=-1+2*(rand()/32767.00);}for(j=0;j<=99;j++){d1[j]=-1+2*(rand()/32767.00);}f0=fun(z);fl=fun(z);ss:a=0.01;for(i=0,j=0;i<=99&&j<=99;i++,j++) {n=1/sqrt((d0[i])*(d0[i])+d1[j]*d1[j]);d0[i]=n*d0[i];d1[j]=n*d1[j];x[0]=z[0]+a*d0[i];x[1]=z[1]+a*d1[j];if(g(x[0],x[1])==1){f=fun(x);if(f<fl){fl=f;m0=d0[i];m1=d1[j];l[0]=x[0];l[1]=x[1];}}}x[0]=l[0];x[1]=l[1];do{a=1.3*a;x[0]=x[0]+a*m0;x[1]=x[1]+a*m1;if(g(z[0],z[1])==0) break;f=fun(x);if(f<fl)fl=f;else break;} while(g(z[0],z[1])==1); do{x[0]=x[0]-a*m0;x[1]=x[1]-a*m1;a=0.7*a;if(a<0.00001)break; x[0]=x[0]+a*m0;x[1]=x[1]+a*m1;if(g(z[0],z[1])==1)f=fun(x); }while(f>=fl);if(fabs((f0-f)/f0)<e){xi[0]=x[0];xi[1]=x[1];fx=f;printf("最优解为\nx1*=%f\nx2*=%f\nfx=%f\n",xi[0],xi[1],fx);}else{f0=f;fl=f;z[0]=x[0];z[1]=x[1];goto ss;}}运行过程及结果:输入精度0.001最优解为x1*=4.161386x2*=2.311257fx=0.000021。