没有合适的资源?快使用搜索试试~ 我知道了~
拟牛顿法(变尺度法)DFP算法的cc++源码
5星 · 超过95%的资源 需积分: 50 82 下载量 172 浏览量
2010-07-13
09:53:06
上传
评论 4
收藏 13KB TXT 举报
温馨提示
试读
15页
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;
#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);
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);
剩余14页未读,继续阅读
资源评论
- xu_xuthus2014-03-17不能直接运行,看得有点晕,给个能运的demo就好了
- u0108413522014-06-26不怎么样,不能直接运行,而且都没有注释,不好看懂
- m0_378694532018-05-30先赞一个。
- chenchangzhiccz2013-10-30直白的讲,写的有点高深,没太看懂
- changwenj2014-02-25东西很好,就是有点难,多点标注就好了
zoubi
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功