合肥工业大学《机械优化设计》课程实践报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

合肥工业大学

《机械优化设计》课程实践

研究报告

班级:

学号:

姓名:

授课教师:

日期:2016年 11 月 7 日

目录

作业要求 (2)

一、λ=0.618的证明、一维搜索程序作业 (3)

1、0.618法的基本思想 (3)

2、关于0.618法中参数λ=0.618的证明 (4)

3、一维搜索程序作业 (5)

二、单位矩阵程序作业 (8)

三、注释最佳再现给定运动规律连杆机构优化设计 (10)

问题模型子程序 (10)

四、连杆机构问题+其他工程优化问题 (12)

1、连杆机构问题 (12)

2、其他工程问题: (15)

五、课程实践心得体会 (18)

作业要求

1、λ=0.618的证明、一维搜索程序作业;

2、单位矩阵程序作业;

3、注释最佳再现给定运动规律连杆机构优化设计问题模型子程序;

4、连杆机构问题 + 自行选择小型机械设计问题或其他工程优化问题;

(1)分析优化对象,根据设计问题的要求,选择设计变量,确立

约束条件,建立目标函数,建立优化设计的数学模型并编制问题程序;

(2)选择适当的优化方法,简述方法原理,进行优化计算; (3)进行结果分析,并加以说明。 5、写出课程实践心得体会,附列程序文本。

一、λ=0.618的证明、一维搜索程序作业

1、0.618法的基本思想

“0.618法”,又称为黄金分割法,是常用的一种一维搜索试探方法,适用于[,]a b 区间上的任何单调函数求极小值问题。

0.618法是建立在区间消去法原理基础上的试探方法,即在搜索区间[,]a b 内适当插入两点1a 、1b ,且11a b ,如下图所示。通过比较函数值1()f a 与1()f b 的大小,应用函数的单调性,可得出以下两种情况:

1) 若11()()f a f b <,则取1[,]a b 为缩短后的区间。 2) 若11()()f a f b >,则取1[,]a b 为缩短后的区间。

然后在保留下来的区间上进行同样的处置,如此迭代下去,使搜索区间无限缩小,从而得到极小点的数值近似解。

2、关于0.618法中参数λ=0.618的证明

0.618法要求插入点1α,2α的位置相对于区间[,]a b 两端点具有对称性,即

12()

()

b b a a b a αλαλ=--=+-

假设[,][0,1]a b =,根据以上公式,得出分割后的区间如下图所示:

进行再次分割时,0.618法要求在保留下来的区间内再插入一点,所形成的区间新三段与原来区间的三段具有相同的比例分布。

假设保留下来的区间为2[,]a α,区间长度为λ。为了保持相同的比例分布,

根据以上公式计算,新插入点3α应在(1)λλ-位置上,1α在原区间的1λ-位置相当于在保留区间的2λ位置。所谓0.618法,就是使整段长与较长段的长度比值等于较长段与较短段长度的比值,即:

11λ

λλ

=

- 通过计算解得0.618λ≈。

若保留下来的区间为1[,]b α,根据插入点的对称性,也能推得同样的λ值。

3、一维搜索程序作业

0.618法的搜索过程如下:

1) 给出初始搜索区间及收敛精度,将λ代入0.618。

2) 按坐标点计算公式计算1α和2α,并计算其对应的函数值。

3) 根据区间消去法原理缩短搜索区间。

4) 检查区间是否缩短到足够小和函数值是否收敛到足够近,如果条件不满

足,则返回第二步。

5) 如果条件满足,取最后两实验点的平均值作为极小点的数值近似解。

程序框图如下:

根据以上思路,下面借助C++,运用0.618法求解正弦函数的极小值。初始区间为

程序代码如下:

// 0.618.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"

#include

#include

#include

#define PI 3.1415926

using namespace std;

float main()

{

float a=0,b=2*PI,t; //t为计算精度

float a1,a2,y1,y2,A,min; //A为极小点,min为所对应的极小值

float r=0.618;

int p=0; //p为迭代次数

cout<<"请输入计算精度,如0.1:";

cin>>t;

a1=b-r*(b-a);

a2=a+r*(b-a);

y1=sin(a1);

y2=sin(a2);

while(abs((b-a)/b)>=t || abs((y2-y1)/y2)>=t)

{

if(y1>=y2)

{

a=a1;

a1=a2;

y1=y2;

a2=a+r*(b-a);

y2=sin(a2);

}

else

{

b=a2;

a2=a1;

y2=y1;

a1=b-r*(b-a);

y1=sin(a1);

}

p++;

}

A=(a+b)/2;

min=sin(A);

cout<<"\n迭代次数为:"<< p<

cout<<"在【0,2π】区间内正弦函数的最小值为:"<

system("pause");

return 0;

}

相关文档
最新文档