潘隆武-B09310524-机制09-5-鲍威尔法共7页word资料
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;