最优化理论与算法------最速下降法(附Matlab实现)

 

 

1 function [xo,fo] = Opt_Steepest(f,grad,x0,TolX,TolFun,dist0,MaxIter) 2 % 用最速下降法求最优化解 3 %输入:f为函数名 grad为梯度函数 4 %x0为解的初值 TolX,TolFun分别为变量和函数的误差阈值 5 %dist0为初始步长 MaxIter为最大迭代次数 6 %输出: xo为取最小值的点 fo为最小的函数值 7 % f0 = f(x(0)) 8 9 %%%%%%判断输入的变量数,设定一些变量为默认值 10 if nargin < 7 11 MaxIter = 100; %最大迭代次数默认为100 12 end 13 if nargin < 6 14 dist0 = 10; %初始步长默认为10 15 end 16 if nargin < 5 17 TolFun = 1e-8; %函数值误差为1e-8 18 end 19 if nargin < 4 20 TolX = 1e-6; %自变量距离误差 21 end 22 %%%%%第一步,求解的初值的函数值 23 x = x0; 24 fx0 = feval(f,x0); 25 fx = fx0; 26 dist = dist0; 27 kmax1 = 25; %线性搜索法确定步长的最大搜索次数 28 warning = 0; 29 %%%%%迭代计算求最优解 30 31 for k = 1: MaxIter 32 g = feval(grad,x); 33 g = g/norm(g); %求在x处的梯度方向 34 %%线性搜索方法确定步长 35 dist = dist*2; %令步长为原步长的二倍 36 fx1 = feval(f,x-dist*2*g); 37 for k1 = 1:kmax1 38 fx2 = fx1; 39 fx1 = feval(f,x-dist*g); 40 if fx0 > fx1+TolFun & fx1 < fx2 - TolFun %fx0 > fx1 < fx2, 41 den = 4*fx1 - 2*fx0 - 2*fx2;num = den - fx0 + fx2; %二次逼近法 42 dist = dist*num/den; 43 x = x - dist*g; fx = feval(f,x); %确定下一点 44 break; 45 else 46 dist = dist/2; 47 end 48 end 49 if k1 >= kmax1 50 warning = warning + 1; %无法确定最优步长 51 else 52 warning = 0; 53 end 54 if warning >= 2|(norm(x - x0) < TolX&abs(fx - fx0) < TolFun) 55 break; 56 end 57 x0 = x; 58 fx0 = fx; 59 end 60 xo = x; fo = fx; 61 if k == MaxIter 62 fprintf('Just best in %d iterations',MaxIter); 63 end

 

注意修改目标函数和梯度函数(一阶偏导函数)。


__EOF__

本文作者北漂的尘埃
本文链接https://www.cnblogs.com/shizhe99/p/14148274.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   北漂的尘埃  阅读(2110)  评论(3编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示