优化设计实验报告(...)(1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
机械优化设计
实
验
报
告
姓名:***
学号:********** 班级:07机设一班
一、黄金分割法
1、 数学模型
2()2f x x x =+,56x -≤≤
2、 黄金分割法简介
黄金分割法适用于单谷函数求极小值问题,且函数可以不连续。黄金分割法是建立在区间消去法原理基础上的试探方法,即在搜索区间[],a b 内适当插入两点1α、2α,并计算其函数值。1α、2α将区间分成三段。应用函数的单谷性质,通过函数值大小的比较,删去其中一段,使搜索区间得以缩短。然后再在保留下来的区间上作同样的处置,如此迭代下去,使搜索区间无限缩小,从而得到极小点的数值近似解。黄金分割法能使相邻两次都具有相同的缩短率0.618,故黄金分割法又称作0.618法。
3、黄金分割法程序清单
#include
#include
/*目标函数*/
float ff(float x)
{
float y;
y=x*x+2*x;
return(y);
}
main()
{
float a,b,ab,Epsilon;
float y1,y2,Alpha1,Alpha2;
float Lambda=0.618;
printf("please input the arear and Epsilon\n");
scanf("%f,%f,%f",&a,&b,&Epsilon);
Alpha1=b-Lambda*(b-a),Alpha2=a+Lambda*(b-a);
printf("%f,%f\n",Alpha1,Alpha2);
y1=ff(Alpha1);y2=ff(Alpha2);
printf("y1=%f,y2=%f\n",y1,y2);
do
{if(y1>=y2)
{a=Alpha1;
Alpha1=Alpha2;
y1=y2;
Alpha2=a+Lambda*(b-a);
y2=Alpha2*Alpha2+2*Alpha2;
}
else{
b=Alpha2;
Alpha2=Alpha1;
y2=y1;
Alpha1=b-Lambda*(b-a);
y1=Alpha1*Alpha1+2*Alpha1;
}
printf("a=%f,b=%f,y1=%f,y2=%f\n",a,b,y1,y2);
}while(!(abs((b-a)/b) ab=0.5*(a+b); y1=ff(ab); printf("the result is :%f",y1); getch(); } 4、运行结果: 一、 变尺度法 1、 数学模型 2112 22121248),(x x x x x x x F --+= 2、 变尺度法简介 基本思想: (1) 用简单矩阵代替二阶导数矩阵的逆矩阵12()k f X -⎡⎤∇⎣⎦ (2) 用坐标变换简化目标函数 具体如下: 当用牛顿法寻求极小点时,其牛顿迭代公式为 11(0,1,2)k k k k k x x G g k α+-=-= 其中 2() ()k k k k g f x G f x ≡∇≡∇ 在迭代中建立变尺度矩阵()k k H H x ≡来替换1k G -,即构造一个矩阵序列{}k H 来逼近 海赛逆矩阵序列{}1k G -。每迭代一次,尺度就改变一次,这正是“变尺度”的含义。这样, 上式变为 11(0,1,2)k k k k k x x G g k α+-=-= 其中k α是从k x 出发,沿方向 k k k d H g =-作一维搜索而得到 的最佳步长。当k H I =(单位矩阵)时,它就变成最速下降法。这就是变尺度法的基本思想。 变尺度法程序清单: /*计算 f(x1,x2)=x1^2+8*x2^2-4*x1-2*x1*x2 的无约束极值,初始点x0=[1,1]。 tt ---- 一维搜索初始步长 ff ---- 差分法求梯度时的步长 ac ---- 终止迭代收敛精度 ad ---- 一维搜索收敛精度 n ----- 设计变量的维数 xk[n] -- 迭代初始点 */ #include #include #include #include #define tt 0.01 #define ff 1.0e-6 #define ac 1.0e-6 #define ad 1.0e-6 #define n 8 double ia; double fny(double *x) { double x1=x[0],x2=x[1]; double f; f=x1*x1+8*x2*x2-4*x1-2*x1*x2; return f; } double * iterate(double *x,double a,double *s)