ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:16.69KB ,
资源ID:11187919      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11187919.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(拟牛顿法.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

拟牛顿法.docx

1、拟牛顿法拟牛顿法(变尺度法)DFP算法的c/c+源码#include iostream.h#include math.hvoid 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 *

2、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 doublen; for(i=1;i=n;i+) tempi-1=poi

3、nti-1; for(i=1;i=n;i+) tempi-1+=0.5*h; gradi-1=4*pf(temp)/(3*h); tempi-1-=h; gradi-1-=4*pf(temp)/(3*h); tempi-1+=(3*h/2); gradi-1-=(pf(temp)/(6*h); tempi-1-=(2*h); gradi-1+=(pf(temp)/(6*h); tempi-1=pointi-1; delete temp;/一维搜索模块/参数:指向目标函数的指针,变量个数,出发点,搜索方向/返回:最优步长double line_search( double (*pf)(doubl

4、e *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 doublen; temp_point=new doublen; comput_grad(pf,n,start,grad); diver_a=0; for(i=1;i=n;i+) diver_a

5、=diver_a+gradi-1*directioni-1; do b=a+step; for(i=1;i=n;i+) temp_pointi-1=starti-1+b*directioni-1; comput_grad(pf,n,temp_point,grad); diver_b=0; for(i=1;i=n;i+) diver_b=diver_b+gradi-1*directioni-1; if( fabs(diver_b)1E-10 ) delete grad; delete temp_point; return(b); if( diver_b-1E-15 ) a=b; diver_a=

6、diver_b; step=2*step; while( diver_b=1E-15 ); for(i=1;i=n;i+) temp_pointi-1=starti-1+a*directioni-1; value_a=(*pf)(temp_point); for(i=1;i=n;i+) temp_pointi-1=starti-1+b*directioni-1; 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) );

7、/! 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_pointi-1=starti-1+t*directioni-1; value_t=(*pf)(temp_point); comput_grad(pf,n,temp_point,grad); diver_t=0; for(i=1;i1E-6) b=t; value_b=value_t; diver_b=diver_t; else if(diver_t=1E-6) & (fabs(b-a)1E-6) )

8、; 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 doublen; /梯度 double *g1=new doublen; double *dg=new doublen;

9、 double *p=new doublen; /搜索方向 =-g double t; /一维搜索步长 double *x0=new doublen; double *x1=new doublen; double *dx=new doublen; double *H=new double*n; for (i=0; in; i+) Hi = new doublen; double *tempH=new double*n; for (i=0; in; i+) tempHi = new doublen; double *gH=new doublen; double *Hg=new doublen;

10、double num1; double num2; for(i=0;in;i+) for(j=0;jn;j+) if(i=j) Hij=1.0; / H0=I else Hij=0.0; tempHij=0.0; for(i=0;in;i+) x0i=min_pointi; comput_grad(pf,n,x0,g0); g_norm=0.0; for(i=0;in;i+) g_norm=g_norm+g0i*g0i; g_norm=sqrt(g_norm); if (g_norme) for(i=0;in;i+) min_pointi=x0i; delete g0; delete g1;

11、delete dg; delete p; delete x0; delete x1; delete dx; for (i=0; in; i+) delete Hi; delete H; for (i=0; in; i+) delete tempHi; delete tempH; delete gH; delete Hg; return pf(min_point); for(i=0;in;i+) pi=-g0i; do t=line_search(pf,n,x0,p); for(i=0;in;i+) x1i=x0i+t*pi; comput_grad(pf,n,x1,g1); g_norm=0.

12、0; for(i=0;in;i+) g_norm=g_norm+g1i*g1i; g_norm=sqrt(g_norm); /coutk x00 x01 g_normn; if (g_norme) for(i=0;in;i+) min_pointi=x1i; delete g0; delete g1; delete dg; delete p; delete x0; delete x1; delete dx; for (i=0; in; i+) delete Hi; delete H; for (i=0; in; i+) delete tempHi; delete tempH; delete g

13、H; delete Hg; return pf(min_point); for(i=0;in;i+) dxi=x1i-x0i; dgi=g1i-g0i; /求Hk+1的矩阵运算 /g*H,H*g for(i=0;in;i+) gHi=0.0; Hgi=0.0; for(i=0;in;i+) for(j=0;jn;j+) gHi=gHi+dgj*Hji; /Hgi=Hgi+Hij*dgj; Hgi=gHi; /num1,num2 num1=0.0; num2=0.0; for(i=0;in;i+) num1=num1+dxi*dgi; num2=num2+gHi*dgi; /tempHij fo

14、r(i=0;in;i+) for(j=0;jn;j+) tempHij=0.0; for(i=0;in;i+) for(j=0;jn;j+) tempHij=tempHij+Hij; tempHij=tempHij+dxi*dxj/num1; tempHij=tempHij-Hgi*gHj/num2; for(i=0;in;i+) for(j=0;jn;j+) Hij=tempHij; / /P for(i=0;in;i+) pi=0.0; for(i=0;in;i+) for(j=0;jn;j+) pi=pi-Hij*g1j; for(i=0;ie); for(i=0;in;i+) min_

15、pointi=x1i; delete g0; delete g1; delete dg; delete p; delete x0; delete x1; delete dx; for (i=0; in; i+) delete Hi; delete H; for (i=0; in; i+) delete tempHi; delete tempH; delete gH; delete Hg; return pf(min_point);/double fun(double *x) return 100*( x1-x0*x0 )*( x1-x0*x0 ) + (1-x0)*(1-x0);void ma

16、in() int n=2; double min_point2=-5,10; double min_value=DFP(fun,n,min_point); coutmin_point0 and min_point1 min_value; /0.618法线搜索/参数:指向目标函数的指针,变量个数,出发点,搜索方向/返回:最优步长/double line_search1( double (*pf)(double *x), int n, double *start, double *direction) int i; int k; double l,a,b,c,u,lamda,t,e; double

17、 *xa=new doublen; double *xb=new doublen; double *xc=new doublen; double *xl=new doublen; double *xu=new doublen; /确定初始搜索区间 l=0.001; a=0; k=0; do k+; c=a+l; for(i=0;i= pf(xa) ); / ? k=0; do k+; l=2*l; b=c+l; for(i=0;in;i+) xci=starti+c*directioni; xbi=starti+b*directioni; a=c; c=b; while( pf(xb) = pf(xc) ); a=0; b=0.1; /寻优 t=0.618; e=0.000001; lamda=b-t*(b-a); u=a+t*(b-a); for(i=0;in;i+) xli=starti+lamda*directioni; xui=starti+u*directioni; k=0; do k+; if( pf(xl)=e ); lamda=(a+b)/2; delete xa; delete xb; delete xc; delete xl; delete xu; return lamda ;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1