合肥工业大学《机械优化设计》课程实践报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; }