BFGS算法C程序Word格式.docx
- 文档编号:13174122
- 上传时间:2022-10-07
- 格式:DOCX
- 页数:8
- 大小:11.34KB
BFGS算法C程序Word格式.docx
《BFGS算法C程序Word格式.docx》由会员分享,可在线阅读,更多相关《BFGS算法C程序Word格式.docx(8页珍藏版)》请在冰豆网上搜索。
//************************************************************************
#include<
stdio.h>
#include<
stdlib.h>
math.h>
conio.h>
#definett0.01 //-------------------一维搜索初始步长---------------------------
#defineff1.0e-6 //-------------------差分法求梯度时的步长-----------------------
#defineac1.0e-6 //-------------------终止迭代梯度模收敛精度---------------------
#definead1.0e-6 //-------------------一维搜索收敛精度---------------------------
#defineax1.0e-6 //-------------------终止迭代点距收敛精度-----------------------
#definen2 //-------------------设计变量的维数-----------------------------
doubleia;
/*FILE*fp;
//=================================输入目标函数表达式
========================================
doublefny(double*x)
{
doublex1=x[0],x2=x[1];
doublef;
f=1.5*x1*x1+0.5*x2*x2-x1*x2-2*x1;
returnf;
}
//=====================================================================
=====================
//==================================迭代更新最优点
===========================================
double*iterate(double*x,doublea,double*s)
double*x1;
inti;
x1=(double*)malloc(n*sizeof(double));
for(i=0;
i<
n;
i++)
x1[i]=x[i]+a*s[i];
returnx1;
//===================================计算更新后节点函数值
====================================
doublefunc(double*x,doublea,double*s)
doublef;
x1=iterate(x,a,s);
f=fny(x1);
//===================================确定初始单谷区间的退进法
================================
voidfinding(doublea[3],doublef[3],double*xk,double*s)
doublet=tt;
doublea1,f1;
a[0]=0;
f[0]=func(xk,a[0],s);
for(i=0;
;
i++) //循环次数i,受break执行的影响
a[1]=a[0]+t;
f[1]=func(xk,a[1],s);
if(f[1]<
f[0])break;
if(fabs(f[1]-f[0])>
=ad)
t=-t;
a[0]=a[1];
f[0]=f[1];
else
if(ia==1)return;
//breakt=t/2;
ia=1;
a[2]=a[1]+t;
f[2]=func(xk,a[2],s);
if(f[2]>
f[1])break;
t=2*t;
a[1]=a[2];
f[1]=f[2];
if(a[0]>
a[2])
a1=a[0];
f1=f[0];
a[0]=a[2];
f[0]=f[2];
a[2]=a1;
f[2]=f1;
return;
=================
//=======================================一维搜索
doublelagrange(double*xk,double*ft,double*s)
inti;
doublea[3],f[3];
doubleb,c,d,aa;
finding(a,f,xk,s);
if(ia==1){aa=a[1];
*ft=f[1];
break;
}
d=(pow(a[0],2)-pow(a[2],2))*(a[0]-a[1])-(pow(a[0],2)-pow(a[1],2))*(a[0]-a[2]);
if(fabs(d)==0)break;
c=((f[0]-f[2])*(a[0]-a[1])-(f[0]-f[1])*(a[0]-a[2]))/d;
if(fabs(c)==0)break;
b=((f[0]-f[1])-c*(pow(a[0],2)-pow(a[1],2)))/(a[0]-a[1]);
aa=-b/(2*c);
*ft=func(xk,aa,s);
if(fabs(aa-a[1])<
=ad){if(*ft>
f[1])aa=a[1];
break;
}if(aa>
a[1])
if(*ft>
f[1]){a[2]=aa;
f[2]=*ft;
elseif(*ft<
f[1]){a[0]=a[1];
a[1]=aa;
f[1]=*ft;
}elseif(*ft==f[1])
{a[2]=aa;
a[0]=a[1];
a[1]=(a[0]+a[2])/2;
f[1]){a[0]=aa;
f[0]=*ft;
f[1]){a[2]=a[1];
f[2]=f[1];
{a[0]=aa;
a[2]=a[1];
f[1]){*ft=f[1];
aa=a[1];
}returnaa;
==================
//====================================计算向量梯度
double*gradient(double*xk)
double*g,f1,f2,q;
g=(double*)malloc(n*sizeof(double));
f1=fny(xk);
{q=ff;
xk[i]=xk[i]+q;
f2=fny(xk);
g[i]=(f2-f1)/q;
xk[i]=xk[i]-q;
returng;
===================
//=======================================BFGS算法主程序
=======================================================
double*bfgs(double*xk)
doubleu[n],v[n],h[n][n],dx[n],dg[n],s[n];
doubleaa,ib;
double*ft,*xk1,*g1,*g2,*xx,*x0=xk;
doublefi,fxk1;
inti,j,k,step=1;
ft=(double*)malloc(sizeof(double));
xk1=(double*)malloc(n*sizeof(double));
//=====================================数据初始化
==============================================
i++) //---
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- BFGS 算法 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)