优化设计实验报告

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

机械优化设计

姓名:欧阳龙

学号:2007500817

班级: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 α+-=-=

其中

在迭代中建立变尺度矩阵()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)

{

double *x1;

int i;

x1=(double *)malloc(n*sizeof(double));

for(i=0;i

相关文档
最新文档