合工大机械优化设计课程实践报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
合肥工业大学
《机械优化设计》课程实践
研究报告
班级:机械设计制造及其自动化12-3班学号:
姓名:
授课教师:王卫荣
日期: 2015年 11 月 14 日
目录
一、一维搜索程序作业 (3)
1.λ=0.618的证明 (3)
2.编写0.618法程序并计算 (4)
二、单位矩阵程序作业 (6)
三、连杆机构问题和自选工程优化问题 (7)
1.连杆机构问题 (7)
2.自选工程优化问题 (14)
四、课程实践心得体会 (18)
一、一维搜索程序作业
1.λ=0.618的证明
黄金分割法,又称作0.618法,适用于 [a,b] 区间上的任何单谷函数求极小值问题。黄金分割法是建立在区间消去法原理基础上的试探方法,即在搜索区间 [a,
b] 内适当插入两点α
1、α
2
,并计算其函数值。α
1
、α
2
将区间分成三段。应用函
数的单谷性质,通过函数值大小的比较,删去其中一段,使搜索区间得以缩短。然后再在保留下来的区间上做同样的位置,如此迭代下去,使搜索区间无限缩小,从而得到极小点的数值近似值。
黄金分割法要求插入点α
1、α
2
的位置相对于区间 [a,b] 两端点具有对称性,
即
图 1-1 黄金分割法
α
1
= b –λ ( b – a )
α
2
= a + λ( b – a ) (3-1)
其中,λ为待定常数。
下面证明λ = 0.618。
除对称性要求外,黄金分割法还要求保留下来的区间内再插入一点所形成的区间
新三段,与原来区间的三段具有相同的比例分布。设原有区间 [a,b] 长度为1如图
1-1 所示,保留下来的区间 [a,b] 长度为λ,区间缩短率为λ。为了保持相同
的比例分布,新插入点α
3应在λ( 1 –λ) 位置上,α
1
在元区间的1 –λ位
置应相当于在保留区间的λ²位置。故有
1 –λ = λ²
即
λ² + λ– 1 = 0
取方程正数解得
若保留下来的区间为 [α
1
,b] ,根据插入点的对称性,也能推得同样的λ的值。
2.编写0.618法程序并计算
(1)0.618法程序:
#include
#include
float m=0.618;
float fun(float t)
{float y;
y=cos(t);
return y;
}
main()
{ float a,b,eps;
printf("\min=");
scanf("%f",&a); %输入函数下限%
printf("\max=");
scanf("%f",&b); %输入函数上限%
float t1,t2,t,f1,f2,min;
printf("eps=");
scanf("%f",&eps); %输入精度%
while((b-a)/b>=eps)
{ t1=a+(1-m)*(b-a);
t2=a+m*(b-a);
f1=fun(t1);
f2=fun(t2);
if(f1>=f2)
{ a=t1;
t1=t2;
f1=f2;
t2=a+m*(b-a);
f2=fun(t2); }
else
{ b=t2;
t2=t1;
f2=f1;
t1=a+(1-m)*(b-a);
f1=fun(t1);
}
}
t=(a+b)/2;
min=fun(t);
printf("最优点t=%f\n",t); %输出最优点t% printf("最优值f= %f\n",min);} %输出最优值f%
(2)计算:
1.a=0,b=2π,Y= cos(t)
2.a=0,b=10,y=(t-2)*(t-2)+3
二、单位矩阵程序作业
编写生成单位矩阵的程序:
程序文本
#include
void main(void)
{
int a[100][100];
int N,i,j;
printf("请输入所要输出矩阵的阶数(最多100阶):");
scanf("%d",&N);
printf("输出的矩阵阶数为%d\n",N);
printf(" N "); /*****制作表头*****/ for(i=0;i printf("%3d",i+1); printf("\n"); for(i=0;i printf("---"); /*****分割线*****/ printf("\n"); for(i=0;i<100;i++) /*****数组赋值*****/ for(j=0;j<100;j++) { if(i==j) a[i][j]=1; else a[i][j]=0; } for(i=0;i printf("%2d:",i+1); /*****纵列序号*****/ for(j=0;j { printf("%3d",a[i][j]); } printf("\n"); } } 结果显示 从键盘输入9,显示9阶单位矩阵,结果如下