DFP算法C++..docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
DFP算法C.

//DFP算法2011/5/25 #includeiostream #includemath.h #includeiomanip using namespace std; int const n=2;//正定二次函数的自变量个数 double fun(double x[n],double f_xs[n+n+1+(n-1)*n/2]);//输入变量为函数自变量初值 void Q_fun(double f_xs[n+n+1+(n-1)*n/2],double Q[n][n+1]);//Q[n][n]是二次函数的正定矩阵,但Q的第n+1列存储一次项的系数 void D_fun(double x[n],double Q[n][n+1],double g0[n]);//自变量初值,正定二次函数的各项系数,返回梯度的初值 int H(double g0[n],double c);//判别准则:返回结束,返回继续迭代 void abc(double x[n],double p[n],double f_xs[n+n+1+(n-1)*n/2],double t[3]);//t[3]中返回的是a,b,c的系数值.开始计算minf(Xk+tPk)时的步长t的值,由于这是n元二次函数所以minf(t)是关于t0的二次函数,先求二次方程a,b,c系数,用一阶导为零。 double t_c(double t[3]);//二次函数一阶导为零计算t的值,t0 void main() { double f_xs[n+n+1+(n-1)*n/2]={4,1,-40,-12,136,0};//正定二次函数的各项系数,第一个为:X1^2系数,第二个为:X2^2系数,第三个为:X1系数,第四个为:X2系数,第五个为:常数项,第六个为:X1X2系数; //n元的系数存放类推 double x[n]={8,9};//函数自变量初值 double f0;//函数值 double g0[n];//梯度的值 double Q[n][n+1];//求梯度处值设置的中间变量,包含两部分:正定二次函数对应的实对称矩阵,还有一次项系数 double c=0.01;//H准则限值 double t[3];//返回求minf()时t的二次函数的a,b,c的系数值 double t_bc;//步长 double p[n];//保存下降方向 double H0[n][n];//保存模拟Hesse矩阵的逆 double y[n];//y(k)=g0(k+1)-g0(k) double s[n];//s(k)=X(k+1)-X(k) double s_temp[n][n]={0};//计算保存矩阵 double s_temp2[n][n]={0}; double s_temp3[n][n]={0}; double s_tl[n]={0}; double temp;//临时值 int i,j,k,flag=0,tap=0;//迭代次数 Q_fun(f_xs,Q);//计算正定二次函数对应的实对称矩阵 f0=fun(x,f_xs);//求函数初值 D_fun(x,Q,g0);//返回梯度的初值 do { for(i=0;in;i++)//给H0[n][n]的处值赋单位矩阵 { for(j=0;jn;j++) { if(i==j) H0[i][j]=1; else H0[i][j]=0; } } for(i=0;in;i++) p[i]=(-1)*g0[i]; k=0;//step 2; do { abc(x,p,f_xs,t);//开始计算minf(Xk+tPk)时的步长t的值, t_bc=t_c(t);//求一阶导来计算t for(i=0;in;i++) { x[i]=x[i]+t_bc*p[i]; s[i]=t_bc*p[i];//保存计算之值X(k+1)-X(k) } for(i=0;in;i++) y[i]=g0[i];//保存之类的 f0=fun(x,f_xs); D_fun(x,Q,g0);//step 3; for(i=0;in;i++) y[i]=g0[i]-y[i];//保存计算g0(k+1)-g0(k) if(H(g0,c)==0)//即不满足小于c { if(k!=n) { //y //s have done! temp=0;//初值 for(i=0;in;

文档评论(0)

kaiss + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档