变尺度法的dfp算法matlab程序,拟牛顿法(变尺度法)DFP算法的cc++源码

拟牛顿法(变尺度法)DFP算法的cc++源码

拟牛顿法(变尺度法)DFP算法的c/c++源码

#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

{

a=b;

diver_a=diver_b;

step=2*step;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值