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