资源描述
<p><span id="_baidu_bookmark_start_0" style="display: none; line-height: 0px;"></span>高等流体力学
班 级: 机设15学硕班
学 号: 201
姓 名: 张湘楠
授课老师: 毕新胜
日 期: 2016年7月 1日
一、研究报告内容:
1、λ=0、618得证明、一维搜索程序作业;
2、单位矩阵程序作业;
3、连杆机构问题 + 自行选择小型机械设计问题或其她工程优化问题;
(1)分析优化对象,根据设计问题得要求,选择设计变量,确立约束条件,建立目标函数,建立优化设计得数学模型并编制问题程序;
(2)选择适当得优化方法,简述方法原理,进行优化计算;
(3)进行结果分析,并加以说明.
4、写出课程实践心得体会,附列程序文本。
5、为响应学校2014年度教学工作会议得改革要求,探索新得课程考核评价方法,特探索性设立一开放式考核项目,占总成绩得5%.
试用您自己认为合适得方式(书面)表达您在本门课程学习方面得努力、进步与收获。(考评将重点关注您得独创性、简洁性与可验证性)。
二、研究报告要求
1、报告命名规则:学号-姓名-《机械优化设计》课程实践报告、doc
2、报告提交邮址:(收到回复,可视为提交成功)。
追 求:问题得工程性,格式得完美性,报告得完整性。
不 追 求:问题得复杂性,方法得惟一性.
评判准则:独一就是好,先交为好;切勿拷贝。
目录:
λ=0、618得证明、一维搜索程序作业
① 关于得证明……………………………………………………4
② 一维搜索得作业
采用matlab进行编程…………………………………………… 5
采用C语言进行编程……………………………………………… 7
单位矩阵程序作业
① 采用matlab得编程………………………………………………… 9
② 采用c语言进行编程………………………………………………… 9
机械优化工程实例
① 连杆机构…………………………………………………………………11
② 自选机构…………………………………………………………………16
课程实践心得…………………………………………………………………… 20
附列程序文本…………………………………………………………………… 21
进步,努力,建议………………………………………………………………25
一、λ=0、618得证明、一维搜索程序作业
①关于得证明
黄金分割法要求插入点,得位置相对于区间两端具有对称性,即
其中为待定常数。
此外,黄金分割法还要求在保留下来得区间内再插入一点所形成得区间新三段,与原来得区间三段具有相同得比例分布。
黄金分割法还要求在保留下来得区间内再插一点所形成得区间新三段,与原来得区间三段有相同得比例分布.
b
α1
α2
1
1-λ
λ
图一
设原区间得长度为1,如图一所示,保留下来得区间长度为,区间缩短率为。为了保持相同得分别比例。插入新点应在位置上,在原区间得1位置应相当于在保留区间得位置.
故有:
a
α2
2
α3
α1
λ
λ(1-λ)
λ2
图二
解得
ﻬ编写0、618得程序,并计算下列问题
程序框图
(1)采用MATLAB进行编程
%%
%fun、m:黄金分割法求极值点
%输入数据
% a –搜索区间下限
% b –搜索区间上限
% e – 精度
%输出数据:
% x – 极小值点
%其她常量:
% c1,c2,c3 – 区间
% r –黄金分割比例0、618
%%
%定义函数
function x=fun(a,b,e)
r=0、618;
c1=b-r*(b-a);c2=a+r*(b—a);
y1=f(c1);y2=f(c2);
while (abs((b-a)/b)>e)&&(abs((y2-y1)/y2)>e)
if y1〉=y2
a=c1;c1=c2;y1=y2;
c2=a+r*(b-a);y2=f(c2);
else
b=c2;c2=c1;y2=y1;
c1=b-r*(b-a);y1=f(c1);
end
end
x=0、5*(a+b);
end
对f函数得确立
10 function y=f(x)
y=(x-2)^2+3;
end
11 function y=f(x)
y=cosx
end
如果要计算y=(x—2)^2+3;得黄金分割法,则需要将图所示得f脚本中得函数写成如①所示
如果要计算y=cosx;黄金分割法,则需要将图所示得f脚本中得函数写成如②所示
fun函数表示对matlab得主程序语言。
函数NO、2运算结果:
函数NO、1运算结果:
(2)采用C语言进行编程
#include</p><stdio、h>#define K 0、618
double f(double); /*****函数值计算函数声明*****/
void main(void)
{
ﻩdouble a,b,size;ﻩ
double a1,a2;
int I;
ﻩprintf(“请输入区间两端点(端点值应大于0):”);
scanf(“%lf,%lf”,&a,&b); /*****输入端点值*****/
printf(“请输入精度:”);
ﻩscanf(“%lf”,&size); /*****输入精度*****/
ﻩprintf(“区间为(%lf,%lf),精度为%lf\n",a,b,size);
printf(“序号\t a1\t\t a2\t\t f(a1)\t\t f(a2)\n”);
ﻩfor(i=0;i〈64;i++)
ﻩ printf(“-“);
printf(“\n”);
i=0;
while((b—a)〉size) /*****用精度控制循环次数*****/
{
ﻩi++;
ﻩa1=b-K*(b—a); /*****按0、618法插入两点*****/
ﻩa2=a+K*(b-a);
printf(“%2d:\t%f\ta%f\t%f\t%f\n",I,a1,a2,f(a1),f(a2));
/*****输出每次计算后a1,a2,f(a1),f(a2)得值*****/
ﻩif(f(a1)〉=f(a2))
ﻩa=a1;
ﻩ else
b=a2;
ﻩ}
printf(“所求极小值点为:x=%lf\t极小值f(x)=%f\n”,a,f(b));
}
double f(double x) /*****函数值计算函数*****/
{
double f;
f=(x—2)*(x-2)+3;
return(f);
}
对于y=cosx,须在程序中加一个#include(math、h)头程序,以示我要调用函数语句。再将倒数第三行函数改为y=cos(x),再次编译运算即可。
运行如图所示
我们可以瞧出,大约在x=2处取到极值。与理论相符。
运行如图所示
我们可以瞧出,大约在π处取到极值。与理论相符。
二、用简单得语句写一个单位矩阵
①采用matlab构造:
Matlab构造得矩阵最就是简便,因为本身就有一个单位矩阵得函数.
由于matlab就是基于C语言而设立得一个数学运用软件,所以她得集成度非常高,而且具有很好得开放性,于就是我们得知eye函数,将其构造。
Eg:
若要构造一个3维得单位矩阵,则输入eye(3)
若要构造一个n为得单位矩阵,这输入eye(n)
②用C语言构造
程序如图所示:
#include<stdio、h>
int main() {
int I,j,n;
while(scanf(“%d”,&n) == 1) {
for(I = 0; I < n; ++i) {
for(j = 0; j < n; ++j)
printf(“%d “,I == j);
printf(“\n”);
}
}
return 0;
}
三、机械优化设计工程实例
① 连杆机构问题
(1)连杆机构问题描述
图 1 机构简图
设计一曲柄连杆摇杆机构,要求曲柄从时,摇杆得转角最佳再现已知得运动规律:且=1,=5,为极位角,其传动角允许在范围内变化。
(2)数学模型得建立
设计变量:这里有两个独立参数与.因此设计变量为
目标函数:将输入角分成30等分,并用近似公式计算,可得目标函数得表达式
约束条件:
GX(1)=-X(1)0
GX(2)=-X(2) 0
ﻩGX(3)=-(X(1)+X(2))+6、00
ﻩGX(4)=—(X(2)+4、0)+X(1) 0
ﻩGX(5)=—(4、0+X(1))+X(2) 0
ﻩGX(6)=—(1、4142*X(1)*X(2)-X(1)**2-X(2)**2)—16、00
GX(7)=-(X(1)**2+X(2)**2+1、4142*X(1)*X(2))+36、00
(3)程序编制
C ======================
SUBROUTINE FFX(N,X,FX)
C ======================
DIMENSION X(N)
ﻩMON /ONE/I1,I2,I3,I4,NFX,I6
NFX=NFX+1
ﻩP0=ACOS(((1、0+X(1))**2—X(2)**2+25、0)/(10、0*(1、0+X(1))))
Q0=ACOS(((1、0+X(1))**2-X(2)**2-25、0)/(10、0*X(2)))
ﻩT=90、0*3、1415926/(180、0*30、0)
ﻩFX=0、0
ﻩDO 10 K=0,30
ﻩPI=P0+K*T
QE=Q0+2、0*(PI—P0)**2/(3、0*3、1415926)
D=SQRT(26、0-10、0*COS(PI))
ﻩAL=ACOS((D*D+X(2)*X(2)—X(1)*X(1))/(2、0*D*X(2)))
ﻩBT=ACOS((D*D+24、0)/(10、0*D))
IF(PI、GE、0、0 、AND、 PI、LT、3、1415926) THEN
QI=3、1415926—AL—BT
ELSE
QI=3、1415926—AL+BT
END IF
IF(K、NE、0 、OR、 K、NE、30)THEN
FX=FX+(QI-QE)**2*T
ELSE
FX=FX+(QI-QE)**2*T/2、0
END IF
12 CONTINUE
ﻩRETURN
ﻩEND
C =========================
SUBROUTINE GGX(N,KG,X,GX)
Cﻩ=========================
ﻩDIMENSION X(N),GX(KG)
ﻩGX(1)=-X(1)
GX(2)=-X(2)
ﻩGX(3)=-(X(1)+X(2))+6、0
GX(4)=-(X(2)+4、0)+X(1)
GX(5)=-(4、0+X(1))+X(2)
GX(6)=—(1、4142*X(1)*X(2)—X(1)**2-X(2)**2)-16、0
GX(7)=-(X(1)**2+X(2)**2+1、4142*X(1)*X(2))+36、0
ﻩRETURN
END
Cﻩ=========================
ﻩSUBROUTINE HHX(N,KH,X,HX)
C =========================
ﻩDIMENSION X(N),HX(KH)
ﻩX(1)=X(1)
RETURN
ﻩEND
输入数据如下:
2,7,0
4、3,3、2
2、,0、2,0、01,0、00001,0、00001
0,1,0
3、5,2、8,5、5,4、5
(4) 可执行程序得生成
13 将程序文本保存成文件t001、txt,存放在OPT_EXAM\FORTRAN\0-fortran目录下。
14 使用DOS操作界面,OPT_EXAM\FORTRAN\0-fortran目录下,输入命令
asumt、for+t001、txt t001、for 回车。生成t001、for文件。
15 for1 t001; 回车;
④for2 回车;
⑤link t001; 回车,即生成可执行程序t001、exe。
⑥从t001、dat文件中加载数据,运行t001、exe。
t001<t001、dat〉t001、rtf 1="" 2="1则表示要求齿宽最小。" 3="" 4="" 5="" 6="" 7="" 8="" 10="" 17="" 94="" 960="" .="" :="" y="" n="" g="7" x="" 01="" 02="" fx:="" hx:="" pen="、3983411E—03" r="" 00="" t0="、1000000E-01" -04="=============" iteration="" pute="=============" irc="" rc="18" -01="" 03="" en="、9042178E-03" c="14" 01e-05="" 1e-11="" imum="" pe="447" nfx="482" ngr="0" p="" -="" gram="" x1="4、135127,X2=2、315381时,目标函数取得最小值," p1="10kW,小齿轮转速n1" i="3、" z1="30," 1.="" f="">0
(2)小齿轮齿数得限制:小齿轮齿数应不大于产生根切得最小齿数17 ,得约束条件:
(3)齿宽系数得限制:由于min ≤ ≤max ,约束条件为:
(4)齿面接触强度得限制,根据公式并查表得约束条件:
(5)齿根弯曲强度得限制,根据公式查表得约束条件:
4 建立数学优化模型
高速级齿轮传动多目标优化设计得数学模型为:(ω1 取0、6,ω2取0、4)
Fun(x)=min[ω1 +ω2 ]
=
5 编写程序并运行结果
目标函数M文件:
function f=zhwm(x)
f=0、6*2、1*x(1)*x(2)+0、4*x(1)*x(2)*x(3);
约束函数M文件:
function [c ceq]=zhwy(x)
c(1)=1、04*10^7—2、916*10^5*(x(1)*x(2))^3*x(3);
c(2)=1、04*10^7-8、95*10^6*(x(1)*x(2))^3*x(3);
c(3)=1、51*10^6—303、57*x(1)^3*x(2)^2*x(3);
c(4)=1、42*10^6—2445、92*x(1)^3*x(2)^2*x(3);
ceq=[];
优化函数M文件:
x0=[2 32 1];
lb=[1、5 17 0、7];
ub=[2 inf 1、15];
u=[];
[x,fval]=fmincon(zhwm,x0,[],[],[],[],lb,ub,zhwy)
约束函数
目标函数
经过Matlab优化并圆整后得齿轮参数如下:
设计参数
模数
m/mm
齿数
齿宽系数
中心距
/mm
普通设计
2、5
30
1
157、5
MATLAB优化
1、7911
27、4377
1、1499
84、5254
圆整后参数
1、75
30
1
117、6
经过计算,最小体积为87、15.
四、课程学习心得
从懒懒散散得寒假到匆匆忙忙得考试周,仿佛只就是在弹指一挥间。然而我们就在这段时间内,又学了几门课程,而这些课程中,最有趣,最好玩得当然就就是《机械优化设计了》
《机械优化设计》就是一门理论性非常强得一门课,刚开始得时候不得要领,但就是在王卫荣老师得带领下,逐渐登堂入室,渐渐有所了解。
首先,这门课所依托得最强武器便就是数学。数学即就是方法,思维,与逻辑。其次所依托得便就是算法程序语言。归根结底得还就是数学,因为数学赋予了算法以逻辑得力量,分析得过程,以及所能解决得一切问题。还好我得数学基础还算可以,逻辑思维还算通顺,再加上老师所给予得方法,学习这门课程,一路上虽跌跌撞撞,但也有所收获。
所谓收获,从方法论得角度上讲,即时通过一个通用模型,解决一系列得问题,这就是数学建模给我们得要求吗,同时也就是《优化》这门课所赋予得核心思想。大二得时候,特别想搞建模,可就是由于种种原因,其中最重要得原因就就是懒惰,与之失之交臂。《优化》这门课则弥补了我得部分遗憾.因为没有建模得要求高,于就是上手比较容易,同时又与我们自己得机械方面得课程紧密地结合在一起,过程轻车熟路。于就是《优化》真就是一门寓学于乐得科目,只恨课程太多时间太少,不然真要好好地研究一番。
说道大作业,那可就是真得难,第一问与第二问还好一点,第三问就不行了.说来惭愧,连杆机构问题就是借鉴了上届学长得做法才学会得.因为太难了,所以就没有用fortran语言做这些问题,全部换成了matlab。真要感谢《优化设计》这门课程,如果不就是这门课程得话,即使MATLAB已经学过了,我估计也不会回过头来复习,就是《优化设计》让我重新拾起matlab,并且我可以说,凡就是在优化大作业中使用过得算法,程序,我已经忘不掉了。
因为fortran语言就是一种相对陌生得语言,所以使用fortran变成得话有些力不从心,而我又就是一个刨根究底得人,对于0、618得算法与单位矩阵得生成,我都就是用得两种算法,这样保证思维得发散性.Matlab真得就是一款很强大得软体,她讲机会用到得所有常见数学模型全部都涵括了,所以,我们,亲切地称它为,万能数学工具。
当学习变成一种乐趣得时候,每当我们想做这种游戏得时候,时间,精力,甚至思路,仿佛全部有了,这就就是积极所带来得意义.学习《优化设计》,传达出这样得信号:重要得不就是考试得结果,而就是解决问题得过程.所以,我觉得《优化设计》这门课得评价方式,在我进入大学以来,就是第一次遇到,大作业,小作业得比值,竟然超过了考试成绩得比值。换句话说,老师认为,即使考试能考得很好,但就是大作业,小作业不行,说明这只就是一个会考试得工具,对于解决实际问题得能力还就是有所欠缺。对!这样得评价很接地气.
《优化设计》这门课已经结课了,考试已经结束了。把大作业交上去,仿佛这门课与我们就没有什么瓜葛了一样。不,绝对不就是。解决问题得能力才刚刚开始。
五、附列程序文本
黄金分割法求极值点得matlab程序
%%
%fun、m:黄金分割法求极值点
%输入数据
% a –搜索区间下限
% b –搜索区间上限
% e – 精度
%输出数据:
% x – 极小值点
%其她常量:
% c1,c2,c3 – 区间
% r –黄金分割比例0、618
%%
%定义函数
function x=fun(a,b,e)
r=0、618;
c1=b-r*(b—a);c2=a+r*(b-a);
y1=f(c1);y2=f(c2);
while (abs((b—a)/b)>e)&&(abs((y2—y1)/y2)>e)
if y1〉=y2
a=c1;c1=c2;y1=y2;
c2=a+r*(b-a);y2=f(c2);
else
b=c2;c2=c1;y2=y1;
c1=b—r*(b—a);y1=f(c1);
end
end
x=0、5*(a+b);
end
对f函数得确立
①function y=f(x)
y=(x—2)^2+3;
end
②function y=f(x)
y=cosx
end
黄金分割法求极值点得C语言程序
#include 〈stdio、h〉
#define K 0、618
double f(double); /*****函数值计算函数声明*****/
void main(void)
{
ﻩdouble a,b,size;
double a1,a2;
ﻩint i;
ﻩprintf("请输入区间两端点(端点值应大于0):");
scanf("%lf,%lf",&a,&b); /*****输入端点值*****/
ﻩprintf("请输入精度:");
ﻩscanf(”%lf",&size); /*****输入精度*****/
printf("区间为(%lf,%lf),精度为%lf\n”,a,b,size);
ﻩprintf("序号\t a1\t\t a2\t\t f(a1)\t\t f(a2)\n");
for(i=0;i〈64;i++)
ﻩﻩprintf("-”);
ﻩprintf("\n”);
ﻩi=0;
while((b-a)>size) /*****用精度控制循环次数*****/
ﻩ{
ﻩﻩi++;
ﻩa1=b-K*(b-a); /*****按0、618法插入两点*****/
a2=a+K*(b-a);
printf(”%2d:\t%f\ta%f\t%f\t%f\n”,i,a1,a2,f(a1),f(a2));
ﻩﻩ /*****输出每次计算后a1,a2,f(a1),f(a2)得值*****/
if(f(a1)>=f(a2))
ﻩﻩa=a1;
ﻩ else
ﻩ b=a2;
ﻩ}
ﻩprintf("所求极小值点为:x=%lf\t极小值f(x)=%f\n",a,f(b));
}
double f(double x) /*****函数值计算函数*****/
{
double f;
ﻩf=(x—2)*(x-2)+3;
return(f);
}
对于y=cosx,须在程序中加一个#include(math、h)头程序,以示我要调用函数语句.再将倒数第三行函数改为y=cos(x),再次编译运算即可。
单位矩阵得matlab程序
eye(x)
单位矩阵得C语言程序
#include<stdio、h>int main() {
int I,j,n;
while(scanf(“%d",&n) == 1) {
for(I = 0; I < n; ++i) {
for(j = 0; j < n; ++j)
printf(“%d “,I == j);
printf(“\n”);
}
}
return 0;
连杆机构得fortran语言
Cﻩ======================
ﻩSUBROUTINE FFX(N,X,FX)
C ======================
ﻩDIMENSION X(N)
ﻩMON /ONE/I1,I2,I3,I4,NFX,I6
NFX=NFX+1
P0=ACOS(((1、0+X(1))**2-X(2)**2+25、0)/(10、0*(1、0+X(1))))
Q0=ACOS(((1、0+X(1))**2-X(2)**2-25、0)/(10、0*X(2)))
T=90、0*3、1415926/(180、0*30、0)
FX=0、0
ﻩDO 10 K=0,30
PI=P0+K*T
QE=Q0+2、0*(PI—P0)**2/(3、0*3、1415926)
D=SQRT(26、0—10、0*COS(PI))
ﻩAL=ACOS((D*D+X(2)*X(2)-X(1)*X(1))/(2、0*D*X(2)))
ﻩBT=ACOS((D*D+24、0)/(10、0*D))
IF(PI、GE、0、0 、AND、 PI、LT、3、1415926) THEN
QI=3、1415926—AL-BT
ELSE
QI=3、1415926-AL+BT
END IF
IF(K、NE、0 、OR、 K、NE、30)THEN
FX=FX+(QI-QE)**2*T
ELSE
FX=FX+(QI—QE)**2*T/2、0
END IF
10 CONTINUE
ﻩRETURN
END
Cﻩ=========================
SUBROUTINE GGX(N,KG,X,GX)
C =========================
DIMENSION X(N),GX(KG)
GX(1)=—X(1)
GX(2)=-X(2)
ﻩGX(3)=—(X(1)+X(2))+6、0
GX(4)=-(X(2)+4、0)+X(1)
GX(5)=-(4、0+X(1))+X(2)
ﻩGX(6)=-(1、4142*X(1)*X(2)-X(1)**2—X(2)**2)-16、0
ﻩGX(7)=—(X(1)**2+X(2)**2+1、4142*X(1)*X(2))+36、0
RETURN
END
Cﻩ=========================
SUBROUTINE HHX(N,KH,X,HX)
C =========================
ﻩDIMENSION X(N),HX(KH)
X(1)=X(1)
ﻩRETURN
END
自选机构得matlab语言
目标函数M文件:
function f=zhwm(x)
f=0、6*2、1*x(1)*x(2)+0、4*x(1)*x(2)*x(3);
约束函数M文件:
function [c ceq]=zhwy(x)
c(1)=1、04*10^7-2、916*10^5*(x(1)*x(2))^3*x(3);
c(2)=1、04*10^7-8、95*10^6*(x(1)*x(2))^3*x(3);
c(3)=1、51*10^6-303、57*x(1)^3*x(2)^2*x(3);
c(4)=1、42*10^6-2445、92*x(1)^3*x(2)^2*x(3);
ceq=[];
优化函数M文件:
x0=[2 32 1];
lb=[1、5 17 0、7];
ub=[2 inf 1、15];
u=[];
[x,fval]=fmincon(zhwm,x0,[],[],[],[],lb,ub,zhwy)
六、进步,努力,建议
首先我感觉最大得进步,就就是数学思维得提高。
比如.我以前解决问题得时候,总就是想要用最精确得解,于就是总就是每一步都跟着公式来,殊不知,很多公式都就是化简过得。所以适当得省略一些量,对于计算还就是建模都就是非常有帮助得
还有,介绍牛顿法得弊端得时候,忽然想到以前总喜欢投机得方法解题,也许我们口中得“笨方法”才就是解题得最优化得方法,有其就是引入计算机以后。
其次,就是工具得应用日渐纯熟。
有其就是MATLAB得应用,我几乎每个问题都就是用MATLAB解决得,因为我觉得MATLAB上手比较容易,其她得软体可以慢慢学,而如果想在短时间内解决一些问题得话,MATLAB无疑就是最好得选择。
当然,我也学会多种工具得使用。比如C语言,我就尝试用她们解决了两个问题,只就是由于我水平还不够高,用法还不够纯熟,所以并没有把她们做为我主要得解决工具,但就是,C语言得自主性远远超过MATLAB,所以我相信,在不久得将来,我就能将C语言运用纯熟。
最后就是关于课堂得建议。
第一:绝对赞同老师板书得教学方式
第二:绝对崇拜老师严谨得教学作风
第三:希望老师能够布置一点给学弟学妹得编程题(呜呜呜~~~我们做不到了),先就是一题,有答案有解析,最好还有截图,然后给一条简单得同类型得题目,有答案没解析,仿照前题练练手,再出一道,无答案无解析,然后给她们独立思考得空间,我想,再做大作业得时候,就不会像我们这样手忙脚乱了.
关于评价,可以搞一个分组制度,即3~5人组成自己得Team member,然后举组之力搞一个命题出来,然后进行评价.分组制度由老师来解决,尽量使能力均匀,这样得话更容易考究区分度。命题得评价结果由老师评判,而小组成员在内部得作用由小组成员自己评价,分出档次1,2,3,4,5(假如五个人得话</stdio、h></t001、dat〉t001、rtf></stdio、h>
展开阅读全文