前一段时间学习了无约束最优化方法,今天用Matlab实现了求解无约束最优化问题的FR共轭梯度法。关于共轭梯度法的理论介绍,请参考我的另一篇文章无约束最优化方法学习笔记。

文件testConjungateGradient.m用于测试共轭梯度法函数。测试文件需要定义函数f和自变量x,给定迭代初值x0和允许误差ϵ。函数设置了show_detail变量用于控制是否显示每一步的迭代信息。

% test conjungate gradient method

% by TomHeaven, hanlin_tan@nudt.edu.cn, 2015.08.25

%% define function and variable

syms x1 x2;

%f = xs^2+2*ys^2-2*xs*ys + 2*ys + 2;

f = (x1-1)^4 + (x1 - x2)^2;

%f = (1-x1)^2 + 2*(x2 - x1^2)^2;

x = {x1, x2};

% initial value

x0 = [0 0];

% tolerance

epsilon = 1e-1;

%% call conjungate gradient method

show_detail = true;

[bestf, bestx, count] = conjungate_gradient(f, x, x0, epsilon, show_detail);

% print result

fprintf('bestx = %s, bestf = %f, count = %d\n', num2str(bestx), bestf, count);

文件conjungate_gradient.m是共轭梯度法的实现函数。变量nf表示函数f的梯度∇f(梯度的希腊字母是nabla,故用nf)。

function [fv, bestx, iter_num] = conjungate_gradient(f, x, x0, epsilon, show_detail)

%% conjungate gradient method

% by TomHeaven, hanlin_tan@nudt.edu.cn, 2015.08.25

% Input:

% f - syms function

% x - row cell arrow for input syms variables

% $x_0$ - init point

% epsilon - tolerance

% show_detail - a boolean value for wether to print details

% Output:

% fv - minimum f value

% bestx - mimimum point

% iter_num - iteration count

%% init

syms lambdas % suffix s indicates this is a symbol variable

% n is the dimension

n = length(x);

% compute differential of function f stored in cell nf

nf = cell(1, n); % using row cells, column cells will result in error

for i = 1 : n

nf{i} = diff(f, x{i});

end

% $\nabla f(x_0)$

nfv = subs(nf, x, x0);

% init $\nabla f(x_k)$

nfv_pre = nfv;

% init count, k and xv for x value.

count = 0;

k = 0;

xv = x0;

% initial search direction

d = - nfv;

% show initial info

if show_detail

fprintf('Initial:\n');

fprintf('f = %s, x0 = %s, epsilon = %f\n\n', char(f), num2str(x0), epsilon);

end

%% loop

while (norm(nfv) > epsilon)

%% one-dimensional search

% define $x_{k+1} = x_{k} + \lambda d$

xv = xv+lambdas*d;

% define $\phi$ and do 1-dim search

phi = subs(f, x, xv);

nphi = diff(phi); % $\nabla \phi$

lambda = solve(nphi);

% get rid of complex and minus solution

lambda = double(lambda);

if length(lambda) > 1

lambda = lambda(abs(imag(lambda)) < 1e-5);

lambda = lambda(lambda > 0);

lambda = lambda(1);

end

% if $\lambda$ is too small, stop iteration

if lambda < 1e-5

break;

end

%% update

% update $x_{k+1} = x_{k} + \lambda d$

xv = subs(xv, lambdas, lambda);

% convert sym to double

xv = double(xv);

% compute the differential

nfv = subs(nf, x, xv);

% update counters

count = count + 1;

k = k + 1;

% compute alpha based on FR formula

alpha = sumsqr(nfv) / sumsqr(nfv_pre);

% show iteration info

if show_detail

fprintf('Iteration: %d\n', count);

fprintf('x(%d) = %s, lambda = %f\n', count, num2str(xv), lambda);

fprintf('nf(x) = %s, norm(nf) = %f\n', num2str(double(nfv)), norm(double(nfv)));

fprintf('d = %s, alpha = %f\n', num2str(double(d)), double(alpha));

fprintf('\n');

end

% update conjungate direction

d = -nfv + alpha * d;

% save the previous $$\nabla f(x_k)$$

nfv_pre = nfv;

% reset the conjungate direction and k if k >= n

if k >= n

k = 0;

d = - nfv;

end

end % while

%% output

fv = double(subs(f, x, xv));

bestx = double(xv);

iter_num = count;

end

运行testConjungateGradient后输出结果如下:

>> testConjungateGradient

Initial:

f = (x1 - x2)^2 + (x1 - 1)^4, x0 = 0 0, epsilon = 0.100000

Iteration: 1

x(1) = 0.41025 0, lambda = 0.102561

nf(x) = 1.08e-16 -0.82049, norm(nf) = 0.820491

d = 4 0, alpha = 0.042075

Iteration: 2

x(2) = 0.52994 0.58355, lambda = 0.711218

nf(x) = -0.52265 0.10721, norm(nf) = 0.533528

d = 0.1683 0.82049, alpha = 0.422831

Iteration: 3

x(3) = 0.63914 0.56115, lambda = 0.208923

nf(x) = -0.031994 -0.15597, norm(nf) = 0.159223

d = 0.52265 -0.10721, alpha = 0.089062

Iteration: 4

x(4) = 0.76439 0.79465, lambda = 1.594673

nf(x) = -0.11285 0.060533, norm(nf) = 0.128062

d = 0.078542 0.14643, alpha = 0.646892

Iteration: 5

x(5) = 0.79174 0.77998, lambda = 0.242379

nf(x) = -0.012614 -0.023517, norm(nf) = 0.026686

d = 0.11285 -0.060533, alpha = 0.043425

bestx = 0.79174 0.77998, bestf = 0.002019, count = 5

修改允许误差为

epsilon=1e-8;

则可以得到更加精确的结果:

Iteration: 6

x(6) = 0.9026 0.9122, lambda = 6.329707

nf(x) = -0.022884 0.019188, norm(nf) = 0.029864

d = 0.017515 0.020888, alpha = 1.252319

Iteration: 7

x(7) = 0.90828 0.90744, lambda = 0.247992

nf(x) = -0.0014077 -0.0016788, norm(nf) = 0.002191

d = 0.022884 -0.019188, alpha = 0.005382

Iteration: 8

x(8) = 0.97476 0.97586, lambda = 43.429293

nf(x) = -0.0022668 0.0022025, norm(nf) = 0.003161

d = 0.0015309 0.0015756, alpha = 2.080989

Iteration: 9

x(9) = 0.97533 0.97531, lambda = 0.249812

nf(x) = -2.9597e-05 -3.0461e-05, norm(nf) = 0.000042

d = 0.0022668 -0.0022025, alpha = 0.000181

Iteration: 10

x(10) = 0.99709 0.99712, lambda = 725.188481

nf(x) = -5.2106e-05 5.2008e-05, norm(nf) = 0.000074

d = 3.0006e-05 3.0063e-05, alpha = 3.004594

Iteration: 11

x(11) = 0.9971 0.9971, lambda = 0.249997

nf(x) = -4.8571e-08 -4.8663e-08, norm(nf) = 0.000000

d = 5.2106e-05 -5.2008e-05, alpha = 0.000001

Iteration: 12

x(12) = 0.99992 0.99992, lambda = 57856.826721

nf(x) = -9.3751e-08 9.3748e-08, norm(nf) = 0.000000

d = 4.8616e-08 4.8617e-08, alpha = 3.718503

Iteration: 13

x(13) = 0.99992 0.99992, lambda = 0.250000

nf(x) = -1.1858e-12 -1.1855e-12, norm(nf) = 0.000000

d = 9.3751e-08 -9.3748e-08, alpha = 0.000000

bestx = 0.99992 0.99992, bestf = 0.000000, count = 13

这与问题的最优解(1,1)T已经非常接近了。

算法实现没有经过大量测试,实际使用可能会有BUG。这里只是用于说明基本实现原理,有兴趣的读者可以在此基础上改进。

求解无约束最优化问题的共轭梯度法matlab程序,Matlab实现FR共轭梯度法相关推荐

  1. 机器学习之求解无约束最优化问题方法(手推公式版)

    文章目录 前言 1. 基础知识 1.1 方向导数 1.2 梯度 1.3 方向导数与梯度的关系 1.4 泰勒展开公式 1.5 Jacobian矩阵与Hessian矩阵 1.6 正定矩阵 2. 梯度下降法 ...

  2. 利用 MATLAB 编程实现共轭梯度法求解无约束最优化问题

    本文章包含以下内容 1.FR 共轭梯度法的算法流程图: 2.MATLAB 编写 FR 共轭梯度法求解无约束优化问题的函数,要求采用 黄金分割法精确一维搜索,用数值微分法计算梯度(函数式 M 文件,精度 ...

  3. 利用 MATLAB 编程实现最速下降法求解无约束最优化问题

    本文章包含以下内容 1.画出最速下降法的算法流程图: 2.MATLAB 编写用数值微分法的梯度计算函数(函数式 M 文件): 3.MATLAB 编写最速下降法求解无约束优化问题的函数,要求采用黄金分割 ...

  4. 牛顿法求解无约束最优化问题

    记泰勒公式 舍去高阶项 在导数为0时候取得极值,令,以上式子可以变形为 继续整理可以得到 通过观察上式,我们可以发现,当给出一个初始点a的时候,我们可以通过泰勒公式用a点的一阶导数与二阶导数还有a的值 ...

  5. 计算智能课程设计(遗传算法求解无约束单目标优化问题)

    写在前面 前天写完了基于传递闭包的模糊聚类,今天准备写"遗传算法求解无约束单目标优化问题".昨天和npy玩了一下午,去齐白石艺术学院看了画展,一起在最高处看了夕阳,并在落日前接吻. ...

  6. 无约束最优化问题的一般结构与规划方法

    无约束问题与最优解 最优性条件 一维线性搜索 精确线性搜索 直接搜索法 非精确一维搜索法 下降算法的收敛性与收敛速度 无约束规划 最速下降法 Newton法 Newton-最速下降混合算法 阻尼New ...

  7. 标号法matlab程序,matlab程序大全

    上例 Matlab 程序如下: %使用表8.4 给出的小波基 ld=[0 0.0... matlab经典代码大全_计算机软件及应用_IT/计算机_专业资料.哈哈哈 MATLAB 显示正炫余炫图:plo ...

  8. 影像重采样matlab程序,matlab重采样代码

    本设计通过编 写 matlab 程序,借助对声音音色和音调的双重复合改变,实现输出声音的改变.共振 峰频 率的改变是基 于重采样 实现的,从重 采样原理 知道,这也同...... 本设计通过编 写 m ...

  9. matlab粒子群算法求解无约束最小值,pso matlab粒子群算法和遗传 是解决约束优化问题,无 和多目标 的优 259万源代码下载- www.pudn.com...

    文件名称: pso下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 51 KB 上传时间: 2016-06-01 下载次数: 0 提 供 者: 孙志勇 详细说 ...

  10. 约束优化的matlab程序,Matlab多约束最优化问题请高手求助,我编的程序

    问题补充,这是我自己编的, 我刚学matlab没有多长时间,请大家帮忙看下程序有什么不对的地方! x1==csvread('x1.txt');    %x1  是300*10的矩阵 [x1,y,z,v ...

最新文章

  1. SQL查询语句 select 详解
  2. React UI 库:React Suite 3.7.8 版本更新
  3. OpenGL tunnel隧道的实例
  4. AUTOSAR协议解析篇(一)-J1939协议解析
  5. 中文python笔记_python 中文编码笔记
  6. Python之数据分析(Numpy的使用、多维数组、数据类型)
  7. 数据结构--------单链表+面试题
  8. 计算机相关专业EI及SCI国际会议及期刊汇总
  9. 医疗图像配准-点云配准总结
  10. linux 操作mysql 命令_linux下mysql操作命令大全
  11. Unity中,图片 替换 光标 —— 疑问解答
  12. Android 中使用AlarmManager设置闹钟详解
  13. 【定积分】基本知识点+考点
  14. 学计算机专业开学要买笔记本电脑吗,大一开学需要买电脑吗 大学开学电脑买什么好...
  15. unity3d 地面印花_Unity3D 中的贴花效果 – 苍白的茧
  16. js 获取开始时间和结束时间相隔小时及分钟(时间戳操作)
  17. SSM框架学习文档以及SSM整合(附Github地址=含SSM学习时的实例代码)
  18. 详述 MIMIC 数据库 26张数据表(二)之 五种字典表
  19. Yoshua Bengio 、吴恩达等预见2022年人工智能趋势
  20. 康宁玻璃ct值计算公式_CT值的计算公式?

热门文章

  1. 关于微信H5自动播放视频-canvas实现逐帧动画效果加音频
  2. php算法-输出100以内能被3整除的整数
  3. VPP TCP定时器
  4. 202202 喜马拉雅 下载 下架产品为mp3 m4a格式
  5. 数独超难题目_世界最难数独游戏 世界上最难数独题目
  6. 下载离线地图数据并搭建离线地图开发环境(一套代码支持谷歌、百度、高德等所有地图源)
  7. 【操作系统】实时调度
  8. 计算机操作系统试题及答案(带解析),计算机操作系统练习题及答案
  9. 基于C++和EasyX 实现的《双人贪吃蛇》小游戏,你不找个小伙伴陪你一起玩吗?
  10. python 获取英文人名翻译