合工大机械优化设计课程实践报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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阶单位矩阵,结果如下

相关文档
最新文档