潘隆武-B09310524-机制09-5-鲍威尔法共7页word资料

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

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

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

一、 实验目的

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

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

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

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

二、 实验要求

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

2. 编制鲍威尔法程序。

三.实验内容

计算实例:用鲍威尔法求函数22

121212(,)10(5)()

f x x x x x x =+-+-的极小值

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

图a

步骤二:通过编制鲍威尔法C 语言程序求函数极小值 ①.鲍威尔法基本原理简述

任选一初始点X 0,再选两个线性无关的向量。从X 0出发,顺次

沿e 1、e 2作一维搜索得01X 、02X ,两点连线得一新方向d 1,用d 1

代替

e 1形成两个线性无关向量e 2、d 1,作为下一轮搜索方向。再从02X 出发,沿d 1作一维搜索得点01X ,作为下一轮迭代的初始点。从X 1出发,顺

次沿e 2、d 1作一维搜索,得到点11X 、12X ,两点的连线得一新方向d 2。

1

X、12X两点是从不同点X0、11X出发,分别沿d1方向进行一维搜索而0

得到的极小点。再从1

X出发,沿d2作一维搜索得点X2,即是二维问

2

题的极小点X*。

②、程序的流程图

③.

目标函数子程序*/

定义目标函数*/

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

返回目标函数的计算值*/

void jtf(double x0[],double h0,double s[],int n,double a[],double b[])

{int i;

型存储单元,并将首地址存储到指针变量

h=h0;

/*计算x[0]处的函数值*/

/*根据步长h正向搜索*/

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

f2=objf(x[1]);

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

{

for(i=0;i

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

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

/*步长乘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 n,double xx[]) /*黄金分割法子程序*/

{int i;

double f1,f2,*x[2],ff,q,w;

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

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

for(i=0;i

{*(x[0]+i)=a[i]+0.618*(b[i]-a[i]); /*计算右试点x[0]*/

*(x[1]+i)=a[i]+0.382*(b[i]-a[i]); /*计算左试点x[1]*/

f1=objf(x[0]); /*计算初始右试点的函数值*/

f2=objf(x[1]); /*计算初始左试点的函数值*/

do

{if(f1>f2) /*根据的f1、f2大小关系判断消去区间*/

{for(i=0;i

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

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

f1=f2;

for(i=0;i

*(x[1]+i)=a[i]+0.382*(b[i]-a[i]);

f2=objf(x[1]);

else /*消去右区间*/

{ for(i=0;i

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

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

f2=f1;

for(i=0;i

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

f1=objf(x[0]);

q=0;

for(i=0;i

q=q+(b[i]-a[i])*(b[i]-a[i]);

w=sqrt(q);

}while(w>eps); /*如果误差不满足收敛精度eps,进行循环迭代,直到满足收敛精度eps为止*/

for(i=0;i

xx[i]=0.5*(a[i]+b[i]); /*输出极小点,即最小区间的中点作为极小值点的数值xx[i]*/

ff=objf(xx); /*计算极小值点的函数值*/

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

free(x[i]); /*释放x[i]所占的存储单元的空间*/

return(ff); /*返回运行黄金分割法子程序的最终结果,即函数的极小值*/

double oneoptim(double x0[],double s[],double h0,double epsg,int n,double x[]) /*一维搜索子程序*/

{double *a,*b,ff;

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

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

jtf(x0,h0,s,n,a,b); /*调用进退法程序jtf( )确定搜索区间[a,b]*/

ff=gold(a,b,epsg,n,x); /*调用黄金分割法程序gold( )确定每一个点的函数值*/

free(a); /*释放a[i]所占的存储单元的空间*/

free(b); /*释放b[i]所占的存储单元的空间*/

return (ff); /*返回一维搜索子程序oneoptim()的最终结果,即函数的极小值*/

double powell(double p[],double h0,double eps,double epsg,int n,double x[]) /*鲍威尔法子程序Powell()*/

{int i,j,m;

double *xx[4],*ss,*s;

double f,f0,f1,f2,f3,fx,dlt,df,sdx,q,d;

ss=(double *)malloc(n*(n+1)*sizeof(double)); /*分配n*(n+1)个的double型存储单元,并将首地址存储到指针变量ss中*/

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

for(i=0;i

{for(j=0;j<=n;j++) /*确定搜索方向*/

*(ss+i*(n+1)+j)=0;

相关文档
最新文档