优化设计二维鲍威尔c语言,潘隆武-B0310524-机制09-5-鲍威尔法.doc

鲍威尔共轭方向法实验报告

姓名: 潘隆武 学号: 班级:机制09-5(2+2)

实验目的

加深对鲍威尔法的基本理论和算法步骤的理解。

培养独立编制、调试计算机程序的能力。

掌握常用优化程序的使用方法。

培养灵活运用优化设计方法解决工程实际问题的能力。

实验要求

明确鲍威尔法基本原理及程序框图。

编制鲍威尔法程序。

三.实验内容

计算实例:用鲍威尔法求函数的极小值

步骤一:利用matlab先画出函数的图线,并标出关键点,以备检验程序的运行结果是否正确,如图a。

图a

步骤二:通过编制鲍威尔法C语言程序求函数极小值

①.鲍威尔法基本原理简述

任选一初始点X0,再选两个线性无关的向量。从X0出发,顺次沿e1、e2作一维搜索得、,两点连线得一新方向d1,用d1代替e1形成两个线性无关向量e2、d1,作为下一轮搜索方向。再从出发,沿d1作一维搜索得点,作为下一轮迭代的初始点。从X1出发,顺次沿e2、d1作一维搜索,得到点、,两点的连线得一新方向d2。、两点是从不同点X0、出发,分别沿d1方向进行一维搜索而得到的极小点。再从出发,沿d2作一维搜索得点X2,即是二维问题的极小点X*。

②、程序的流程图

③.编制鲍威尔法程序

#include "stdio.h"

#include "stdlib.h"

#include "math.h"

double objf(double x[]) /*目标函数子程序 */

{double ff; /*定义目标函数*/

ff=pow(10*(x[1]+x[0]-5),2)+pow((x[1]-x[0]),2);

return(ff); /*返回目标函数的计算值*/

}

void jtf(double x0[],double h0,double s[],int n,double a[],double b[]) /*确定搜索区间的进退法(外推法)子程序*/

{int i;

double *x[3],h,f1,f2,f3;

for(i=0;i<3;i++)

x[i]=(double *)malloc(n*sizeof(double)); /*分配n个double型存储单元,并将首地址存储到指针变量x[i]中*/

h=h0; /*把初始步长h0赋给h*/

for(i=0;i

*(x[0]+i)=x0[i];

f1=objf(x[0]); /*计算x[0]处的函数值*/

for(i=0;i

*(x[1]+i)=*(x[0]+i)+h*s[i];

f2=objf(x[1]);

if(f2>=f1) /*若f2>f1,则步长变号,反向搜索*/

{ h=-h0;

for(i=0;i

*(x[2]+i)=*(x[0]+i);

f3=f1;

for(i=0;i

{*(x[0]+i)=*(x[1]+i);

*(x[1]+i)=*(x[2]+i);

}

f1=f2;

f2=f3;

}

for(;;) /*步长乘2继续向前搜索直到函数值再次上升为止*/

{h=2*h;

for(i=0;i

*(x[2]+i)=*(x[1]+i)+h*s[i];

f3=objf(x[2]);

if(f2

else

{ for(i=0;i

{*(x[0]+i)=*(x[1]+i);

*(x[1]+i)=*(x[2]+i);

}

f1=f2;

f2=f3;

}

}

if(h<0) /*搜索结束,根据h的正负把搜索得到的区间左、右端点分别赋给a、b*/

for(i=0;i

{a[i]=*(x[2]+i);

b[i]=*(x[0]+i);

}

else

for(i=0;i

{a[i]=*(x[0]+i);

b[i]=*(x[2]+i);

}

for(i=0;i<3;i++)

free(x[i]); /*释放x[]存储单元的内存*/

}

double gold(double a[],double b[],double eps,int

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值