• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

最速下降法+Matlab代码

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

算法原理

to-do

Matlab代码

clc; clear;

f = @(x) x(1).^2+2*x(1)*x(2)+3*x(2).^2; %待求函数,x1,x2,x3...
% f = @(x) x(1).^2+2*x(2).^2;
paraNum = 2; %函数参数的个数,x1,x2,x3...的个数
x0 = [3,3]; %初始值
tol = 1e-5; %迭代容忍度
flag = inf; %结束条件
error = []; %函数变化

while flag > tol
    p = g(f,x0,paraNum); %列向量
    f2 = @(a) f(x0-a*p');
    buChang = argmin(f2); %求步长,line search:argmin function
    x1 = x0-buChang*p';
    flag = norm(x1-x0);
    error = [error,flag];
    x0 = x1;
end
plot(0:length(error)-1,error)

function [f_grad] = g(f,x0,paraNum)
temp = sym('x',[1,paraNum]);
f1=f(temp);
Z = gradient(f1);
f_grad = double(subs(Z,temp,x0));
end

function [x] = argmin(f)
%求步长
t = 0;
options = optimset('Display','off');
[x,~] = fminunc(f,t,options);
end

代码问题

  1. Matlab符号运算,耗时
  2. 最速下降法的步长使用line-search,耗时

代码改进

clc; clear;

f = @(x) x(1).^2+2*x(1)*x(2)+3*x(2).^2; %待求函数,x1,x2,x3...
% f = @(x) x(1).^2+2*x(2).^2;
paraNum = 2; %函数参数的个数,x1,x2,x3...的个数
x0 = [3,3]; %初始值
tol = 1e-3; %迭代容忍度
flag = inf; %结束条件
error = []; %函数变化

while flag > tol
% for i =1:1
    p = g(f,x0,paraNum); %列向量    
    if norm(p) < tol
            buChang = 0;
    else
        buChang = argmin(f,x0,p,paraNum); %求步长,line search:argmin function
    end
    x1 = x0-buChang.*p';
    flag = norm(x1-x0);
    error = [error,flag];
    x0 = x1;
end
plot(0:length(error)-1,error)

function [f_grad] = g(f,x0,paraNum)
temp = sym('x',[1,paraNum]);
f1=f(temp);
Z = gradient(f1);
f_grad = double(subs(Z,temp,x0));
end

% function [x] = argmin(f,paraNum)
% %求步长
% t = zeros(1,paraNum);
% options = optimset('Display','off');
% [x,~] = fminunc(f,t,options);
% end

function [x] = argmin(f,x0,p,num)
% 求步长
% for i=1:paraNum
%     syms(['x',num2str(i)]);
% end
temp = sym('x',[1,num]);
f1=f(x0 - temp.*p');
for i = 1:num
    temp(i) = diff(f1,temp(i));
end
jieGuo = solve(temp);
jieGuo = struct2cell(jieGuo);
x = zeros(1,num);
for i = 1:num
    x(i) = double(jieGuo{i});
end
end

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi的RzDbgrid改变某行的背景色发布时间:2022-07-18
下一篇:
delphi简单的分页实现(高手可以不看)发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap