机械优化设计黄金分割法外推法
机械优化设计知识点
多元函数()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)对结果数据和设计方案进行合理性和适用性分析。
其中,最关键的是两个方面的工作:首先将优化设计问题抽象和表述为计算机可以接受与处理的优化设计数学模型,通常简称它为优化建模;然后选用优化计算方法及其程序在计算机上求出这个模型的的最优解,通常简称它为优化计算。
最优化课程设计--黄金分割法及其算法实现(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章绪论在人类活动中,要办好一件事(指规划、设计等),都期望得到最满意、最好的结果或效果。
黄金分割法机械优化设计
黄金分割法机械优化设计在现代工程设计领域,机械优化设计是一项非常重要的任务。
通过对机械系统进行分析和优化,可以提高其性能和效率,节约资源并延长使用寿命。
黄金分割法是一种常用的优化设计方法,它基于黄金分割比的原理,通过寻找最佳设计参数来改进机械系统的性能。
本文将介绍黄金分割法机械优化设计的原理、方法和应用。
一、黄金分割法的原理黄金分割法源自于数学中的黄金分割比,即0.618,也称为费波那契数。
它是指将一条线段分割为两部分,使较长部分与整体的长度之比等于较短部分与较长部分之比。
黄金分割法的原理是将这一比例应用于机械设计中,以找到最佳的设计参数。
二、黄金分割法机械优化设计的方法1. 确定优化目标:在机械优化设计中,首先需要明确具体的优化目标。
比如,改善机械系统的运行效率、减少能源消耗或提高产品质量等。
2. 确定设计参数:根据机械系统的特性和优化目标,确定需要进行优化的设计参数。
这些参数可以是机械结构的尺寸、材料的选择或运行参数等。
3. 建立优化模型:根据设计参数,建立机械系统的优化模型。
模型可以是数学模型、仿真模型或实验模型,根据具体情况选择。
4. 寻找最佳设计参数:利用黄金分割法进行参数优化。
通过分割设计参数范围,并根据黄金分割比的原理,逐步缩小搜索范围,最终找到最佳设计参数。
5. 评估和验证:对优化得到的设计参数进行评估和验证。
可以通过数值模拟、物理实验或现场测试等方法,验证优化结果是否满足设计要求。
三、黄金分割法机械优化设计的应用黄金分割法机械优化设计在各行业都有广泛的应用。
以下为几个常见的应用领域:1. 机械结构设计:对于机械结构的设计优化,黄金分割法可以帮助确定最佳的尺寸比例,提高结构的刚性和稳定性。
2. 流体力学设计:在流体力学设计中,黄金分割法可以通过优化设计参数,改善流体的流动性能,提高流体的传输效率和混合效果。
3. 电子电路设计:黄金分割法可以应用于电子电路设计中,通过优化电路元件的参数和布局来提高电路的性能和稳定性。
机械优化实验报告
一、实验目的本次实验旨在加深对机械优化设计方法的基本理论和算法步骤的理解,培养学生独立编制、调试计算机程序的能力,并掌握常用优化方法程序的使用方法。
通过实验,学生能够灵活运用优化设计方法解决工程实际问题。
二、实验内容本次实验主要涉及以下内容: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。
机械优化设计实例
机械优化设计作业一、优化设计问题的提出预制一无盖水槽,现有一块长为4m,宽为3m的长方形铁板作为原材料,想在这块铁板的四个角处剪去相等的正方形以制成无盖水槽,问如何剪法使水槽的底面积最大?二、建立问题的数学模型为了建成此无盖水槽,可设在这块铁板的四个角处剪去相等的正方形的边长为X,所建造水槽的底面积为S,分析问题有次问题变成在约束条件:X≥04-2X≥03-2X≥0限制下,求目标函数:S(X)=(4-2X)(3-2X)=4-14X+12的最大值。
由此可得此问题的数学模型为:Min S(X)=4约束条件:( =-X ≤0 ( = -(4-2X )≤0( =-(3-2X )≤0 算法为黄金分割法。
四、外推法确定最优解的搜索区间用外推法确定函数S (X )=4 索区间。
设初始点 , =S( )=12; = +h=0+1=1, =S( )=2;比较 和 ,因为 < h=2h=2x1=2, = +h=1+2=3, 比较 和 ,因为 > ,面,故搜索区间可定为[a,b]=[1,3]。
五、算法框图六、算法程序#include <math.h>#include <stdio.h>double obfunc(double x){double ff;ff=4*X*X-14*X+12;return(ff);}void jts(double x0,double h0,double s[],int n,double a[],double b[]) {int i;double x[3],h,f1,f2,f3;h=h0;for(i=0;i<n;i++)x[0]=x0;f1=obfunc(x[0]);for(i=0;i<n;i++) x[1]=x[0]+h*s[i];f2=obfunc(x[1]);if(f2>=f1){h=-h0;for(i=0;i<n;i++)x[2]=x[0];f3=f1;for(i=0;i<n;i++){x[0]=x[1];x[1]=x[2];}f1=f2;f2=f3;}for(;;){h=2.0*h;for(i=0;i<n;i++)x[2]=x[1]+h*s[i];f3=obfunc(x[2]);if(f2<f3)break;else{for(i=0;i<n;i++){x[0]=x[1];x[1]=x[2];}f1=f2;f2=f3;}}if(h<0)for(i=0;i<n;i++){a[i]=x[2];b[i]=x[0];}elsefor(i=0;i<n;i++){a[i]=x[0];b[i]=x[2];}printf("%4d",n);}double gold(double a[],double b[],double eps,int n,double xx) double f1,f2,ff,q,w;double x[3];for(i=0;i<n;i++){x[0]=a[i]+0.618*(b[i]-a[i]);x[1]=a[i]+0.382*(b[i]-a[i]);}f1=obfunc(x[0]); f2=obfunc(x[1]);do{if(f1>f2){for(i=0;i<n;i++){b[i]=x[0];x[0]=x[1];}f1=f2;for(i=0;i<n;i++)x[1]=a[i]+0.382*(b[i]-a[i]);f2=obfunc(x[1]);}else{for(i=0;i<n;i++){a[i]=x[1];x[1]=x[0];}f2=f1;for(i=0;i<n;i++)x[0]=a[i]+0.618*(b[i]-a[i]);f1=obfunc(x[0]);}q=0;for(i=0;i<n;i++)q=q+(b[i]-a[i])*(b[i]-a[i]);w=sqrt(q);}while(w>eps);for(i=0;i<n;i++)xx=0.5*(a[i]+b[i]);ff=obfunc(xx);printf("xx=ff=%5.2f,,,,%5.2f",xx,ff);return(ff);}void main(){int n=1;double a[1],b[1],xx;double s[]={1},x0=0;double eps1=0.001,h0=0.1;jts(x0,h0,s,n,a,b);gold(a,b,eps1,n,xx);七、程序运行结果与分析(1)程序运行结果(截屏)(2)结果分析、对与函数S(X)=(4-2X)(3-2X)=4-14X+12,令(X)=8X-14=0可解的X=1.75,说明程序运行结果正确。
机械优化黄金分割法程序设计
机械优化黄金分割法程序设计机械优化黄金分割法程序设计1.黄金分割法介绍黄金分割法适用于[a,b]区间上的任何单股函数求极小值问题,对函数除要求“单谷”外不做其他要求,甚至可以不连续。
因此,这种方法的适应面非常广。
黄金分割法也是建立在区间消去法原理基础上的试探方法,即在搜索区间[a,b]内适当插入两点a1,a2,并计算其函数值。
a1,a2将区间分成三段,应用函数的单谷性质,通过函数值大小的比较,删去其中一段,是搜索区间得以缩小。
然后再在保留下来的区间上作同样的处理,如此迭代下去,是搜索区间无限缩小,从而得到极小点的数值近似解。
1.1黄金分割法原理一维搜索是解函数极小值的方法之一,其解法思想为沿某一已知方向求目标函数的极小值点。
一维搜索的解法很多,这里主要采用黄金分割法(0.618法)。
该方法用不变的区间缩短率0.618代替斐波那契法每次不同的缩短率,从而可以看成是斐波那契法的近似,实现起来比较容易,也易于人们所接受。
黄金分割法是用于一元函数f(x)在给定初始区间[a,b]内搜索极小点α*的一种方法。
它是优化计算中的经典算法,以算法简单、收敛速度均匀、效果较好而著称,是许多优化算法的基础,但它只适用于一维区间上的凸函数[6],即只在单峰区间内才能进行一维寻优,其收敛效率较低。
其基本原理是:依照“去劣存优”原则、对称原则、以及等比收缩原则来逐步缩小搜索区间[7]。
具体步骤是:在区间[a,b]内取点:a1 ,a2 把[a,b]分为三段。
如果f(a1)>f(a2),令a=a1,a1=a2,a2=a+r*(b-a);如果f(a1)黄金分割法:黄金分割法适用于确定区间上的任何单谷函数求极小值的问题。
对函数除要求“单谷”之外没有任何其他要求。
1. 给出初始搜索区间,及收敛精度将其赋以0.618。
2. 计算a1和a2,并计算起对应的函数值y1,y2。
3. 根据期间消去法原理缩短搜索区间,为了能用原来的坐标点计算公式,需进行区间名称的代换,并在保留区间中计算一个新的试验点及其函数值。
机械优化设计-第02章 优化计算方法
第02章优化计算方法2.1黄金分割法黄金分割法也称0.618法,是通过对黄金分割点函数值的计算和比较,将初始区间逐次进行缩小,直到满足给定的精度要求,即求得一维极小点的近似解。
一、方法概述(一)区间缩小的基本思路已知的单峰区间。
为了缩小区间,在内按一定规则对称地取2个内部点和,并计算和。
可能有三种情况:图(a)经过一次函数比较,区间缩小一次。
在新的区间内,保留一个好点和,下一次只需再按一定规则,在新区间内找另一个与对称的点,计算,与比较。
如此反复。
图(b)淘汰,另,得新区间。
图(c)可归纳入上面任一种情况处理。
(二)取点规则黄金分割法的关键是如何不断找出区间内的2个对称点,保证极小点不会丢掉,且收敛快。
设初始区间长度为l,第一次区间缩短率为,则缩短后的区间长度为。
第二次区间缩短时,在区间中取点,经比较后又得新区间。
由对称性可知,区间的长度为,则本次区间缩短率为令这两次缩短率相等,即,得方程解方程,得合理的根为由此可知,黄金分割法的均匀缩短率为0.618,即每经过一次函数值比较,都是淘汰本次区间的0.382倍。
根据上式,黄金分割法的取点规则是为了使最终区间收敛到给定收敛精度内,区间的缩短次数N必须满足:即二、收敛准则由于实际问题的需要和函数形态的不同,常常需要不同的收敛准则确定最优点。
对于直接法,有以下几种收敛准则:(1)区间绝对精度;(2)区间相对精度;(3)函数值绝对精度;(4)函数值相对精度三、方法特点(一)黄金分割法特点(1)不必要求可微,只要利用函数值大小的比较,即可很快地找到;(2)除了第一次缩小区间要计算两个点及其函数值以外,其余每次只要计算一个点及其函数值;(3)可靠性好。
(二)应用举例实际一个圆柱螺旋压缩弹簧,不考虑共振,要求重量W最轻。
解:建模前,先列出弹簧的有关设计计算公式:式中-------弹簧的设计载荷;-------弹簧的总变形量;-------弹簧指数;K-------曲度系数;n-------工作有效圈数;n2-------不起作用圈数(总圈数与工作有效圈数之差);-------材料密度。
机械优化设计实验报告浙江理工大学
机械优化设计实验报告班级:XXXX姓名:XX学号:XXXXXXXXXXX一、外推法1、实验原理常用的一维优化方法都是通过逐步缩小极值点所在的搜索区间来求最优解的。
一般情况下,我们并不知道一元函数f(X)极大值点所处的大概位置,所以也就不知道极值点所在的具体区域。
由于搜索区间范围的确定及大小直接影响着优化方法的收敛速度及计算精度。
因此,一维优化的第一步应首先确定一个初始搜索区间,并且在该区间内函数有唯一的极小值存在。
该区间越小越好,并且仅存在唯一极小值点。
所确定的单股区间应具有如下性质:如果在[α1,α3]区间内任取一点α2,,α1<α2<α3或α3<α2<α1,则必有f(α1)>f(α2)<f(α3)。
由此可知,单股区间有一个共同特点:函数值的变化规律呈现“大---小---大”或“高---低---高”的趋势,在极小值点的左侧,函数值呈严格下降趋势,在极小值点右侧,函数值呈严格上升趋势,这正是单股区间依据。
2、实验工具C-Free3.5软件3、程序调试#include<stdio.h>#include<math.h>#define f(x) 3*x*x-8*x+9 //定义函数int main(){double a0,a1,a2,a3,f1,f2,f3,h;printf(“a0=”,a0); //单谷区间起始点scanf(“%lf”,&a0);printf(“h=”,h); //起始的步长scanf(“%lf”,&h);a1=a0;a2=a1+h;f1=f(a0);f2=f(a2);if(f1>f2) //判断函数值的大小,确定下降方向{a3=a2+h;f3=f(a3);}else{h=-h;a3=a1;f3=f1;a1=a2;f1=f2;a2=a3;f2=f3;a3=a2+h;f3=f(a3);}while(f3<=f2) //当不满足上述比较时,说明下降方向反向,继续进行判断{h=2*h;a1=a2;f1=f2;a2=a3;f2=f3;a3=a2+h;f3=f(a3);}printf(“a1=%lf,a3=%lf\n”,a1,a3);printf(“[a1,a3]=[%lf,%lf]\n”,a1,a3); //输出区间}4、调试结果5、总结与讨论1)当写成void main时会出现如下警告改成int main警告消失。
机械优化设计黄金分割法
课程设计(实验)材料(2)机械优化设计课程设计(实验)报告专业班级:设计题目: 黄金分割法程序设计学生姓名:学生学号:任课教师:2013年月日一、设计要求:基于一维搜索的试探方法思想,运用黄金分割法编写C语言程序,得到极小点的数值近似解。
已知条件:1、目标函数:f(x)=x*x+2*x2、给定搜索区间:(-3,5)二、方法原理黄金分割法适用于【a,b】区间上的任何单股函数求极小值问题,对函数除要求“单谷”外不做其他要求,甚至可以不连续 .因此 ,这种方法的适应面非常广.黄金分割法也是建立在区间消去法原理基础上的试探方法,即在搜索区间【a,b】内适当插入两点a1,a2,并计算其函数值.a1,a2将区间分成三段,应用函数的单谷性质,通过函数值大小的比较,删去其中一段,是搜索区间得以缩小。
然后再在保留下来的区间上作同样的处理,如此迭代下去,是搜索区间无限缩小,从而得到极小点的数值近似解。
三、程序清单:#include<stdio.h〉#include〈math.h〉double hanshu (double x);void main(){int k;double a,a1,a2,b,y1,y2,c,e,i,j;e=0.618,k=0;printf(”a=");scanf(”%lf",&a);printf("b=");scanf("%lf”,&b);printf(”c=");scanf(”%lf”,&c);a1=b-e*(b-a);y1=hanshu(a1);a2=a+e*(b—a);y2=hanshu(a2);printf("输出次数=%d\n a=%lf,a1=%lf, a2=%lf,b=%lf,y1=%lf, y2=%lf\n”,k,a, a1,a2,b,y1,y2);i=(b-a)/b;j=(y2—y2)/y2;while(fabs(i)〉=c||fabs(j>=c)){k++;if(y1〉=y2){a=a1,a1=a2,y1=y2,a2=a+e*(b-a),y2=hanshu(a2);}else{b=a2,a2=a1,y2=y1,a1=b-e*(b-a),y1=hanshu(a1);}printf(”输出次数=%d\n a=%lf,a1=%lf, a2=%lf, b=%lf,y1=%lf, y2=%lf\n”,k,a,a1,a2,b,y1,y2);i=(b-a)/b;j=(y2—y1)/y2;}printf("k=%lf\n”,0.5*(a+b));}double hanshu (double x){double m;m = x*x+2*x;return m;}实验结果(要求附上程序运行结果截图)五、手算过程如以下表格:。
黄金分割法机械优化设计
机械优化设计黄金分割法班级:学硕一班学号:姓名:黄金分割法黄金分割法也成为0.618法,是一种应用广泛的一维搜索方法。
该方法对函数)(αf 无特殊要求,函数甚至可以是不连续的。
黄金分割法是利用序列消去原理,通过不断缩小单峰区间长度,使搜索区间不断缩小,从而不断逼近目标函数极小点的一种优化方法。
一、基本思想在搜索区间[a,b]内必须按下述规则对称地取1α和2α两点,使)(1a b b --=λα,)(2a b a -+=λα,这两点把区间分为三段,计算插入点的函数值,如图1-1所示。
根据单峰函数的性质,通过比较函数值大小,删去其中一段,使搜索区间缩小。
在新的区间继续上面的过程,使搜索区间不断缩小,当搜索区间无限缩小时,便可得到函数在极小点附近的近似解。
在第一次缩小区间后,新区间只需要再插入一点即可形成区间新三段。
按比例λ缩小,新区间三段与原区间三段具有相同的比例分布,每次缩小所得新区间长度与原区间长度之比成为区间收缩率λ。
图1-1设初始区间长度为L ,为了保证区间收缩率不变,第一次收缩后的长度为L λ,第二次收缩后的长度为)1(λ-L ,而第二次的收缩率应该相等。
)1()1(2λλλλλ-=→-=L L L解次方程并舍去负根,就可得到618.0215=-=λ。
所以,1α和2α两点的取法为:)(618.01a b b --=α,)(618.02a b a -+=α。
所以,对于黄金分割法,适用于设计变量少的优化问题中的一维搜索。
二、黄金分割法的搜索过程1)给出初始搜索区间及收敛精度,将λ赋以0.6182)按坐标点计算公式计算)()(618.0111ααf f a b b =--=,,)()(618.0222ααf f a b a =-+=,;并计算其对应的函数值。
3)根据区间消去法原理缩短搜索区间。
为了能用原来的坐标点计算公式,需进行区间名称的代换,并在保留区间中计算一个新的试验点及其函数值。
如果21f f <,则新区间=],[2αa令12122f f b ===,,ααα,记N0=0;如果21f f >,则新区间=],[1b α令21212f f a ===,,ααα,记N0=1;如图2-1所示。
黄金分割法-机械优化设计程序
#include"stdio.h"#include"stdlib.h"#include"math.h"double objf(double x[]){double ff;ff=x[0]*x[0]+x[1]*x[1]-x[0]*x[1]-10*x[0]-4*x[1]+60;return(ff);}double gold(double a[],double b[],double eps,int n,double xx[]) {int i;double f1,f2,*x[2],ff,q,w;for(i=0;i<2;i++)x[i]=(double*)malloc(n*sizeof(double));for(i=0;i<n;i++){*(x[0]+i)=a[i]+0.618*(b[i]-a[i]);*(x[1]+i)=a[i]+0.382*(b[i]-a[i]);}f1=objf(x[0]);f2=objf(x[1]);do{if(f1>f2){for(i=0;i<n;i++){b[i]=*(x[0]+i);*(x[0]+i)=*(x[1]+i);}f1=f2;for(i=0;i<n;i++)*(x[1]+i)=a[i]+0.382*(b[i]-a[i]);f2=objf(x[1]);}else{for(i=0;i<n;i++){a[i]=*(x[1]+i);*(x[1]+i)=*(x[0]+i);}f2=f1;for(i=0;i<n;i++)*(x[0]+i)=a[i]+0.618*(b[i]-a[i]);f1=objf(x[0]);}q=0;for(i=0;i<n;i++)q=q+(b[i]-a[i])*(b[i]-a[i]);w=sqrt(q);}while(w>eps);for(i=0;i<n;i++)xx[i]=0.5*(a[i]+b[i]);ff=objf(xx);for(i=0;i<2;i++)free(x[i]);return(ff);}void jtf(double x0[],double h0,double s[],int n,double a[],double b[]) {int i;double*x[3],h,f1,f2,f3;for(i=0;i<3;i++)x[i]=(double*)malloc(n*sizeof(double));h=h0;for(i=0;i<n;i++)*(x[0]+i)=x0[i];f1=objf(x[0]);for(i=0;i<n;i++)*(x[1]+i)=*(x[0]+i)+h*s[i];f2=objf(x[1]);if(f2>=f1){h=-h0;for(i=0;i<n;i++)*(x[2]+i)=*(x[0]+i);f3=f1;for(i=0;i<n;i++){*(x[0]+i)=*(x[1]+i);*(x[1]+i)=*(x[2]+i);}f1=f2;f2=f3;}for(;;){h=2*h;for(i=0;i<n;i++)*(x[2]+i)=*(x[1]+i)+h*s[i];f3=objf(x[2]);if(f2<f3) break;else{for(i=0;i<n;i++){*(x[0]+i)=*(x[1]+i);*(x[1]+i)=*(x[2]+i);}f1=f2;f2=f3;}}if(h<0)for(i=0;i<n;i++){a[i]=*(x[2]+i);b[i]=*(x[0]+i);}elsefor(i=0;i<n;i++){a[i]=*(x[0]+i);b[i]=*(x[2]+i);}for(i=0;i<3;i++)free(x[i]);}double oneoptim(double x0[],double s[],double h0,double epsg,int n,double x[]) {double*a,*b,ff;a=(double*)malloc(n*sizeof(double));b=(double*)malloc(n*sizeof(double));jtf(x0,h0,s,n,a,b);ff=gold(a,b,epsg,n,x);free(a);free(b);return (ff);}double powell(double p[],double h0,double eps,double epsg,int n,double x[]) {int i,j,m;double*xx[4],*ss,*s;double f,f0,f1,f2,f3,fx,dlt,df,sdx,q,d;ss=(double*)malloc(n*(n+1)*sizeof(double));s=(double*)malloc(n*sizeof(double));for(i=0;i<n;i++){for(j=0;j<=n;j++)*(ss+i*(n+1)+j)=0;*(ss+i*(n+1)+i)=1;}for(i=0;i<4;i++)xx[i]=(double*)malloc(n*sizeof(double));for(i=0;i<n;i++)*(xx[0]+i)=p[i];for(;;){for(i=0;i<n;i++){*(xx[1]+i)=*(xx[0]+i);x[i]=*(xx[1]+i);}f0=f1=objf(x);dlt=-1;for(j=0;j<n;j++){for(i=0;i<n;i++){*(xx[0]+i)=x[i];*(s+i)=*(ss+i*(n+1)+j);}f=oneoptim(xx[0],s,h0,epsg,n,x);df=f0-f;if(df>dlt){dlt=df;m=j;}}sdx=0;for(i=0;i<n;i++)sdx=sdx+fabs(x[i]-(*(xx[1]+i)));if(sdx<eps){free(ss);free(s);for(i=0;i<4;i++)free(xx[i]);return(f);}for(i=0;i<n;i++)*(xx[2]+i)=x[i];f2=f;for(i=0;i<n;i++){*(xx[3]+i)=2*(*(xx[2]+i)-(*(xx[1]+i)));x[i]=*(xx[3]+i);}fx=objf(x);f3=fx;q=(f1-2*f2+f3)*(f1-f2-dlt)*(f1-f2-dlt);d=0.5*dlt*(f1-f3)*(f1-f3);if((f3<f1)||(q<d)){if(f2<=f3)for(i=0;i<n;i++)*(xx[0]+i)=*(xx[2]+i);elsefor(i=0;i<n;i++)*(xx[0]+i)=*(xx[3]+i);}else{for(i=0;i<n;i++){*(ss+(i+1)*(n+1))=x[i]-(*(xx[1]+i));*(s+i)=*(ss+(i+1)*(n+1));}f=oneoptim(xx[0],s,h0,epsg,n,x);for(i=0;i<n;i++)*(xx[0]+i)=x[i];for(j=m+1;j<=n;j++)for(i=0;i<n;i++)*(ss+i*(n+1)+j-1)=*(ss+i*(n+1)+j);}}}void main(){double p[]={1,2};double ff,x[2];ff=powell(p,0.3,0.001,0.0001,2,x);printf("x[0]=%f,x[1]=%f,ff=%f\n",x[0],x[1],ff); getchar();}。
机械优化设计黄金分割法
机械优化设计黄金分割法已知:F(x)=x4-4x3-6x2-16x+4,求极小值,极小值点,区间,迭代次数, 用进退法确定区间,用黄金分割法求极值。
#include <stdio.h>#include <math.h>#define e 0.001#define tt 0.01float f(double x){float y=pow(x,4)-4*pow(x,3)-6*pow(x,2)-16*x+4;return(y);}finding(float *p1,float*p2) {float x1=0,x2,x3,t,f1,f2,f3,h=tt; int n=0;x2=x1+h;f1=f(x1);f2=f(x2); if(f2>f1) {h=-h;t=x2;x2=x1;x1=t;} do { x3=x2+h;h=2*h;f3=f(x3);n=n+1;}while(f3<f2);if(x1>x3) {t=x1;x1=x3;x3=t;} *p1=x1;*p2=x3;return(n);}gold(float *p){float a,b,x1,x2,f1,f2; int n=0;finding(&a,&b);do{x1=a+0.382*(b-a);x2=a+0.618*(b-a);f1=f(x1);f2=f(x2);n=n+1;if(f1>f2) a=x1;else b=x2;}while((b-a)>e);*p=(x1+x2)/2;return(n); }main(){float a,b,x,min;int n1,n2; n1=finding(&a,&b);n2=gold(&x);min=f(x);printf("\n The area is %f to %f.",a,b); printf("\n The nunmber 1 is %d.",n1);printf("\n The min is %f and the result is %f.",x,min);printf("\n The nunmber 2 is %d.",n2)二插法已知:F(x1,x2)=4*x1-x2的平方-12;求极小值,极小值点,迭代次数,用复合形法求极值。
大学期末考试机械优化设计复习题及其答案
大学期末考试机械优化设计复习题及其答案1化问题的三要素:设计变量,约束条件,目标函数。
2机械优设计数学规划法的核心:一、建立搜索方向,二、计算最佳步长因子3外推法确定搜索区间,函数值形成高-低-高区间4数学规划法的迭代公式是,其核心是建立搜索方向,和计算最佳步长5若n维空间中有两个非零向量d0,d1,满足(d0)TGd1=0,则d0、d1之间存在_共轭关系6,与负梯度成锐角的方向为函数值下降方向,与梯度成直角的方向为函数值不变方向。
外点;内点的判别7那三种方法不要求海赛矩阵:最速下降法共轭梯度法变尺度法8、那种方法不需要要求一阶或二阶导数:坐标轮换法9、拉格朗日乘子法是升维法P3710、惩罚函数法又分为外点惩罚函数法、内点惩罚函数法、混合惩罚函数法三种11,.函数在点处的梯度为,海赛矩阵为12.目标函数是一项设计所追求的指标的数学反映,因此对它最基本的要求是能用来评价设计的优劣,同时必须是设计变量的可计算函数。
13.建立优化设计数学模型的基本原则是确切反映工程实际问题,的基础上力求简洁。
14.约束条件的尺度变换常称规格化,这是为改善数学模型性态常用的一种方法。
15,.随机方向法所用的步长一般按加速步长法来确定,此法是指依次迭代的步长按一定的比例递增的方法。
16.最速下降法以负梯度方向作为搜索方向,因此最速下降法又称为梯度法,其收敛速度较慢。
17二元函数在某点处取得极值的充分条件是必要条件是该点处的海赛矩阵正定18.拉格朗日乘子法的基本思想是通过增加变量将等式约束优化问题变成无约束优化问题,这种方法又被称为升维法。
19,改变复合形形状的搜索方法主要有反射,扩张,收缩,压缩20坐标轮换法的基本思想是把多变量的优化问题转化为单变量的优化问题21.在选择约束条件时应特别注意避免出现相互矛盾的约束,,另外应当尽量减少不必要的约束。
22.目标函数是n维变量的函数,它的函数图像只能在n+1,空间中描述出来,为了在n维空间中反映目标函数的变化情况,常采用目标函数等值面的方法。
机械优化设计黄金分割法实验报告
实验报告课程名称:机械优化设计实验项目:一维搜索(黄金分割)法上机实验专业班级: XXXXX级机械工程及自动化XX班学号: XXXXXXXXXX 姓名: XXXXXX 指导老师: XXXXXX 日期: 201X.12.12机械工程试验教学中心实验1 一维搜索(黄金分割)法实验报告实验日期 201X 年 12 月 11 日报告日期 201X 年 12 月 12 日班级 XXXXX级机自XXXX班姓名 XXXXXX 学号 XXXXXXXXXXXXXXX1、实验目的○1了解黄金分割法的基本原理;○2熟悉matlab程序使用方法;○3学习上机调试、运行所编写的程序。
2、黄金分割法原理该法适用于[a,b]区间上单谷函数极小值问题。
在搜索区间[a,b]内按照0.618比例加入两点α1,α2,并计算其函数值。
α1,α2将区间分成三段,然后利用区间消去法,通过比较函数值大小,删除其中一段,使搜索区间缩短,在保留区间进行同样处理,直到搜索区间缩小到指定精度为止。
3、编制MATLAB优化程序○1编写函数文件,并命名为fx.m保存,程序代码如下:function f=fx(w)%f=w^2-10*w+36;%f=w^4-5*w^3+4*w^2-6*w+60;%f=((w+1)^4)*((w-2)^2);注:上述“%”后面分别为要求解的三个方程,求解该方程式把相应方程式前面的“%”删除,点击保存,并运行下面的hjf.m文件,输入相应的初始步长h0、初始点x0、收敛法则epsilan的值○2编写进退法程序文件,命名为ab1.m保存,程序代码如下:function [a,b]=ab1(h0,x0)h=h0;x1=x0;f1=fx(x1);x2=x1+h;f2=fx(x2);if f2>f1h=-h;x3=x1;f3=f1;x1=x2;f1=f2;x2=x3;f2=f3;endx3=x2+h;f3=fx(x3);while f2>=f3x1=x2;f1=f2;x2=x3;f2=f3;x3=x2+2*h;f3=fx(x3);endif h<0a=x3;b=x1;elsea=x1;b=x3;end○3编写黄金分割法程序文件,命名为hjfgf.m 保存,程序代码如下: function hjfclearh1 = input('h0=?');x1=input('x0=?');epsilan=input('epsilan=?');[a,b]=ab1(h1,x1);x1=a+0.382*(b-a);f1=fx(x1);x2=a+0.618*(b-a);f2=fx(x2);while abs(b-a)>epsilanif f1>f2a=x1;x1=x2;f1=f2;x2=a+0.618*(b-a);f2=fx(x2);elseb=x2;x2=x1;f2=f1;x1=a+0.382*(b-a);f1=fx(x1);endendxm=(a+b)/2;['Optimal result:',blanks(3),'xm=[',...num2str(xm),']',blanks(6),'fm=',num2str(fx(xm))]4、实验结果()3610min )12+-=t t t f结果: *t = 5.0001 =*f 11 (h0=0.3、x0=0、epsilan=0.001)()60645min )2234+-+-=t t t t t f结果: *t = 3.2795 =*f 22.659 (h0=0.3、x0=0、epsilan=0.001)()()()2421min )3-+=t t t f 结果: *t =__-0.99989__ =*f __1.4253e-015__ (h0=0.3、x0=0、epsilan=0.001)。
- 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。