DFP算法
sid吧
全部回复
仅看楼主
level 1
nirvanawei 楼主
#include "iostream.h"#
include "math.h"void comput_grad(double (*pf)(double *x), int n, double *point, double *grad); //计算梯度double line_search1(double (*pf)(double *x), int n, double *start, double *direction); //0.618法线搜索double line_search(double (*pf)(double *x), int n, double *start, double *direction); //解析法线搜索double DFP(double (*pf)(double *x), int n, double *min_point); //无约束变尺度法//梯度计算模块//参数:指向目标函数的指针,变量个数,求梯度的点,结果void comput_grad(double (*pf)(double *x), int n, double *point, double *grad){ double h=1E-3; int i; double *temp; temp = new double[n]; for(i=1;i<=n;i++) { temp[i-1]=point[i-1]; } for(i=1;i<=n;i++) { temp[i-1]+=0.5*h; grad[i-1]=4*pf(temp)/(3*h); temp[i-1]-=h; grad[i-1]-=4*pf(temp)/(3*h); temp[i-1]+=(3*h/2); grad[i-1]-=(pf(temp)/(6*h)); temp[i-1]-=(2*h); grad[i-1]+=(pf(temp)/(6*h)); temp[i-1]=point[i-1]; } delete[] temp;}//一维搜索模块//参数:指向目标函数的指针,变量个数,出发点,搜索方向//返回:最优步长double line_search( double (*pf)(double *x), int n, double *start, double *direction){ int i; double step=0.001; double a=0,value_a,diver_a; double b,value_b,diver_b; double t,value_t,diver_t; double s,z,w; double *grad,*temp_point; grad=new double[n]; temp_point=new double[n]; comput_grad(pf,n,start,grad); diver_a=0; for(i=1;i<=n;i++) diver_a=diver_a+grad[i-1]*direction[i-1]; do { b=a+step; for(i=1;i<=n;i++) temp_point[i-1]=start[i-1]+b*direction[i-1]; comput_grad(pf,n,temp_point,grad); diver_b=0; for(i=1;i<=n;i++) diver_b=diver_b+grad[i-1]*direction[i-1]; if( fabs(diver_b)<1E-10 ) { delete[] grad; delete[] temp_point; return(b); } if( diver_b<-1E-15 ) { a=b; diver_a=diver_b; step=2*step; } }while( diver_b<=1E-15 ); for(i=1;i<=n;i++) temp_point[i-1]=start[i-1]+a*direction[i-1]; value_a=(*pf)(temp_point); for(i=1;i<=n;i++) temp_point[i-1]=start[i-1]+b*direction[i-1];
2008年06月23日 04点06分 1
level 1
nirvanawei 楼主
value_b=(*pf)(temp_point); do { s=3*(value_b-value_a)/(b-a); z=s-diver_a-diver_b; w=sqrt( fabs(z*z-diver_a*diver_b) ); //////////////////!!!!!!!!!!!!!!!!!!!!!! t=a+(w-z-diver_a)*(b-a)/(diver_b-diver_a+2*w); value_b=(*pf)(temp_point); for(i=1;i<=n;i++) temp_point[i-1]=start[i-1]+t*direction[i-1]; value_t=(*pf)(temp_point); comput_grad(pf,n,temp_point,grad); diver_t=0; for(i=1;i<=n;i++) diver_t=diver_t+grad[i-1]*direction[i-1]; if(diver_t>1E-6) { b=t; value_b=value_t; diver_b=diver_t; } else if(diver_t<-1E-6) { a=t; value_a=value_t; diver_a=diver_t; } else break; }while( (fabs(diver_t)>=1E-6) && (fabs(b-a)>1E-6) ); delete[] grad; delete[] temp_point; return(t);}//无约束变尺度法DFP函数声明////参数:pf指向目标函数的指针,n变量个数,min_point接受初始点、存放结果//返回:极小点处函数值//double DFP( double (*pf)(double *x), int n, double *min_point ){ int i,j; int k=0; double e=1E-5; double g_norm; double *g0=new double[n]; //梯度 double *g1=new double[n]; double *dg=new double[n]; double *p=new double[n]; //搜索方向 =-g double t; //一维搜索步长 double *x0=new double[n]; double *x1=new double[n]; double *dx=new double[n]; double **H=new double*[n]; for (i=0; i
2008年06月23日 04点06分 2
level 1
nirvanawei 楼主
delete[] dx; for (i=0; i
2008年06月23日 04点06分 3
level 1
nirvanawei 楼主
for(j=0;j
e); for(i=0;i
= pf(xa) ); // ??? k=0; do { k++; l=2*l; b=c+l; for(i=0;i
=e ); lamda=(a+b)/2; delete[] xa; delete[] xb; delete[] xc; delete[] xl; delete[] xu; return lamda ;}
2008年06月23日 04点06分 4
level 6
这些是什么?
2008年06月24日 09点06分 5
level 1
nirvanawei 楼主
没文化
2008年06月25日 13点06分 6
level 7
同5L!
2008年06月26日 13点06分 7
level 5
........7L你少来了 你 你解释下那是什么东西~!
2008年07月07日 03点07分 8
level 1
nirvanawei 楼主
DFP算法 有称拟牛顿算法通过C/C++语言来实现该算法 从而对无约束非线性二次规划求解最优值谢谢
2008年07月07日 13点07分 9
level 7
哦 没明白!
2008年07月07日 13点07分 10
level 0
xiexie7lou
2009年12月15日 13点12分 11
level 1
别逼我把相对论发出来
2009年12月20日 10点12分 12
level 5
什么玩意
2009年12月21日 12点12分 13
level 0
这玩意不是计算机系的谁懂啊?!
估计
lz
刚学完这东西
所以拿出来得瑟得瑟
                         ——轩辕小雨
2010年01月18日 07点01分 14
level 0
梯度那个函数……唉 感觉多余 不是那么通用的东西 还不如初始化输入
2010年03月03日 11点03分 15
level 0
什么什么?看不懂,不过有点像源代码。
2010年04月16日 12点04分 16
1