| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> FR共轭梯度法 -> 正文阅读 |
|
[人工智能]FR共轭梯度法 |
Fletcher-Reeves共轭梯度法,简称FR法。 共轭梯度法的基本思想是把共轭性与最速下降方法相结合,利用已知点处的梯度构造一组共轭方向,并沿这组方向进行搜素,求出目标函数的极小点。根据共轭方向基本性质,这种方法具有二次终止性。 对于二次凸函数的共轭梯度法: min?f(x)?=?1/2?xTAx?+?bTx?+?c, 其中x∈?Rn,A是对称正定矩阵,c是常数。 具体求解方法如下: 首先,任意给定一个初始点x(1),计算出目标函数f(x)在这点的梯度,若||g1||?=?0,则停止计算;否则,令 d(1)?=?-▽f(x(1))?=?-g1。 沿方向d(1)搜索,得到点x(2)。计算在x(2)处的梯度,若||g2||?≠?0,则利用-g2和d(1)构造第2个搜索方向d(2),在沿d(2)搜索。 一般地,若已知点x(k)和搜索方向d(k),则从x(k)出发,沿d(k)进行搜索,得到 x(k+1)?=?x(k)?+?λkd(k)?, 其中步长λk满足 f(x(k)?+?λkd(k))?=?min?f(x(k)+λd(k))。 此时可求出λk的显示表达 ? 计算f(x)在x(k+1)处的梯度。若||gk+1||?=?0,则停止计算;否则,用-gk+1和d(k)构造下一个搜索方向d(k+1),并使d(k+1)和d(k)关于A共轭。按此设想,令 d(k+1)?=?-gk+1?+?βkd(k), 上式两端左乘d(k)TA,并令 d(k)TAd(k+1)?=?-d(k)TAgk+1?+?βkd(k)TAd(k)?=?0, 由此得到 βk?=?d(k)TAgk+1?/?d(k)TAd(k)。 再从x(k+1)出发,沿方向d(k+1)搜索。 在FR法中,初始搜索方向必须取最速下降方向,这一点决不可忽视。因子βk可以简化为:βk?=?||gk+1||2?/?||gk||2。 实现算法如下: ? 主函数 clear clc close all %% F=@(x) 3/2*x(1)^2+1/2*x(2)^2-x(1)*x(2)-2*x(1); gradF=@(x) [3*x(1)-x(2)-2; -x(1)+x(2)]; x0=[-2 4]';%初始点 TolGrad=1e-5; %容忍误差 MaxIter=5e5;%最大迭代次数 [x,f1,k,diedai,var,ff]=ConjGrad(F,gradF,x0,TolGrad,MaxIter); x f1 k figure(1) plot(1:k,diedai,'linewidth',2) xlabel 迭代次数 ylabel 误差 title 目标函数迭代曲线 set(gcf,'color','w') %% 验证结果有效性 暴力求解极小值 xx=linspace(-10,10,500); yy=linspace(-10,10,500); [x,y]=meshgrid(xx,yy); z=3/2*x.^2+1/2*y.^2-x.*y-2*x; figure(2) surf(x,y,z) min(min(z)) set(gcf,'color','w') 子函数 function [x,f1,iter,diedai,var,ff]=ConjGrad(F,gradF,x0,TolGrad,MaxIter) %功能:用FR共轭梯度法求解无约束问题minf(x) %输入:F原函数,grad F函数梯度,x0是初始点,TolGrad....容忍误差,MaxIter....最大迭代次数 %输出:x,f1,iter分别是取得极小值的x,近似最优点和迭代次数,diedai迭代信息 iter = 0; f0 ??= F(x0); c ???= gradF(x0); Converged = norm(c) < TolGrad; alpha = 1e-6*norm(c); while iter<MaxIter && ~Converged ???iter = iter + 1; ???d = -c; ???f = @(alpha) F(x0+alpha*d); ???alphaUpper = bracket( f, 0, 0.1*alpha ); ???[alpha,f1] = fminbnd( f, 0, alphaUpper ); ???x = x0 + alpha*d; ???var(iter,1:2) = x; ???ff (iter) = f1; ???c = gradF(x); ???diedai(iter) = norm(c); ???Converged = (norm(c) < TolGrad); ???x0 = x; end end 结果:
x = ????1.0000 ????1.0000 f1 = ???-1.0000 k = ?????7 ans? ???-0.9997 ? 查看迭代曲线误差,在第三步的时候,结果就基本收敛,收敛速度较快,通过求解列举法,求出了该函数的极小值,与我们的FR算法对比,可以发现结果一样,验证了FR算法的有效性, |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 10:20:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |