机械优化设计黄金分割法 外推法

合集下载

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

最优化课程设计--黄金分割法及其算法实现(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的各阶顺序主子式均大于零,则该矩阵为正定矩阵.机械最优化设计问题多属于约束非线性优化问题。

机械优化设计外推法,黄金分割法,二次插值法

机械优化设计外推法,黄金分割法,二次插值法
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;
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;

机械优化设计-黄金分割法

机械优化设计-黄金分割法
xlabel('x') ylabel('f')
总结:
• 一维搜索第一步:找初始单谷区间; 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

黄金分割法机械优化设计

黄金分割法机械优化设计在现代工程设计领域,机械优化设计是一项非常重要的任务。

通过对机械系统进行分析和优化,可以提高其性能和效率,节约资源并延长使用寿命。

黄金分割法是一种常用的优化设计方法,它基于黄金分割比的原理,通过寻找最佳设计参数来改进机械系统的性能。

本文将介绍黄金分割法机械优化设计的原理、方法和应用。

一、黄金分割法的原理黄金分割法源自于数学中的黄金分割比,即0.618,也称为费波那契数。

它是指将一条线段分割为两部分,使较长部分与整体的长度之比等于较短部分与较长部分之比。

黄金分割法的原理是将这一比例应用于机械设计中,以找到最佳的设计参数。

二、黄金分割法机械优化设计的方法1. 确定优化目标:在机械优化设计中,首先需要明确具体的优化目标。

比如,改善机械系统的运行效率、减少能源消耗或提高产品质量等。

2. 确定设计参数:根据机械系统的特性和优化目标,确定需要进行优化的设计参数。

这些参数可以是机械结构的尺寸、材料的选择或运行参数等。

3. 建立优化模型:根据设计参数,建立机械系统的优化模型。

模型可以是数学模型、仿真模型或实验模型,根据具体情况选择。

4. 寻找最佳设计参数:利用黄金分割法进行参数优化。

通过分割设计参数范围,并根据黄金分割比的原理,逐步缩小搜索范围,最终找到最佳设计参数。

5. 评估和验证:对优化得到的设计参数进行评估和验证。

可以通过数值模拟、物理实验或现场测试等方法,验证优化结果是否满足设计要求。

三、黄金分割法机械优化设计的应用黄金分割法机械优化设计在各行业都有广泛的应用。

以下为几个常见的应用领域:1. 机械结构设计:对于机械结构的设计优化,黄金分割法可以帮助确定最佳的尺寸比例,提高结构的刚性和稳定性。

2. 流体力学设计:在流体力学设计中,黄金分割法可以通过优化设计参数,改善流体的流动性能,提高流体的传输效率和混合效果。

3. 电子电路设计:黄金分割法可以应用于电子电路设计中,通过优化电路元件的参数和布局来提高电路的性能和稳定性。

机械优化设计实例

机械优化设计作业一、优化设计问题的提出预制一无盖水槽,现有一块长为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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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。

相关文档
最新文档