机械优化设计实验报告浙江理工大学

  • 格式:docx
  • 大小:206.76 KB
  • 文档页数:19

下载文档原格式

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

机械优化设计实验

报告

班级:XXXX

姓名:XX

学号:XXXXXXXXXXX

一、外推法

1、实验原理

常用的一维优化方法都是通过逐步缩小极值点所在的搜索区间来求最优解的。一般情况下,我们并不知道一元函数f(X)极大值点所处的大概位置,所以也就不知道极值点所在的具体区域。由于搜索区间范围的确定及大小直接影响着优化方法的收敛速度及计算精度。因此,一维优化的第一步应首先确定一个初始搜索区间,并且在该区间内函数有唯一的极小值存在。该区间越小越好,并且仅存在唯一极小值点。

所确定的单股区间应具有如下性质:如果在[α1,α3]区间内任取一点α2,,α1<α2<α3或α3<α2<α1,则必有f(α1)>f(α2)

2、实验工具

C-Free3.5软件

3、程序调试

#include

#include

#define f(x) 3*x*x-8*x+9 //定义函数

int main()

{

double a0,a1,a2,a3,f1,f2,f3,h;

printf(“a0=”,a0); //单谷区间起始点

scanf(“%lf”,&a0);

printf(“h=”,h); //起始的步长

scanf(“%lf”,&h);

a1=a0;

a2=a1+h;

f1=f(a0);

f2=f(a2);

if(f1>f2) //判断函数值的大小,确定下降方向

{

a3=a2+h;

f3=f(a3);

}

else

{

h=-h;

a3=a1;

f3=f1;

a1=a2;

f1=f2;

a2=a3;

f2=f3;

a3=a2+h;

f3=f(a3);

}

while(f3<=f2) //当不满足上述比较时,说明下降方向反向,继续进行判断

{

h=2*h;

a1=a2;

f1=f2;

a2=a3;

f2=f3;

a3=a2+h;

f3=f(a3);

}

printf(“a1=%lf,a3=%lf\n”,a1,a3);

printf(“[a1,a3]=[%lf,%lf]\n”,a1,a3); //输出区间}

4、调试结果

5、总结与讨论

1)当写成void main时会出现如下警告

改成int main警告消失。

二、黄金分割法

1、实验原理

在外推法确定了单股区间[α1,α3]的基础上去其中对称两点α2,α4,且满足

α2=α3−λ(α3−α1)

α4=α1+λ(α3−α1)

式中,λ位0~1的缩小系数。

计算点α2,α4的函数值,记f2=f(α2),f4=f(α4),并比较他们的大小,可能存在如下三种情况:

(1)f2

(2)f2>f4:此时必有极小值点α∈[α2,α3],应舍去区间[α1,α2],保留的区间长度为λl,缩小后的新区间为[α2,α3];

(3)f2=f4:此时必有极小值点α∈[α2,α4],应舍去区间[α1,α2]或[α4,α3]。

经过比较取舍后,缩小后所得的新区建长度均为λl,将区间端点重新命名为[α1,α3],就可以进行新一轮的比较,如此循环。

2、实验工具

C-Free 3.5软件

3、程序调试

#include

#include

#define f(x) 3*x*x-8*x+9

#define v 0.618 //黄金分割点

int main()

{

float a0,a1,a2,a3,a4,f0,f1,f2,f3,f4,b; //b收敛精度

puts("单谷区间a1=");

scanf("%f",&a1);

puts("单谷区间a3=");

scanf("%f",&a3);

puts("收敛精度b=");

scanf("%.4f",b);

a2=a3-v*(a3-a1);

f2=f(a2);

a4=a1+v*(a3-a1);

f4=f(a4);

do //do-while循环,知道满足条件退出循环

{

if(f2>f4) //判断函数值大小,缩小比较区间

{

a1=a2;

a2=a4;

f2=f4;

a4=a1+v*(a3-a1);

f4=f(a4);

}

else

{

a3=a4;

a4=a2;

f4=f2;

a2=a3-v*(a3-a1);

f2=f(a2);

}

}

while(abs(a3-a1)>b);