最速下降法matlab全局最小值_最速下降法+Matlab代码

本文介绍了最速下降法的算法原理,并提供了两种不同的Matlab实现方式,包括基本代码和改进后的代码。针对原代码中符号运算耗时及线搜索耗时的问题,提出了优化方案,通过调整步长计算方法来提高效率。
摘要由CSDN通过智能技术生成

算法原理

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

代码问题

Matlab符号运算,耗时

最速下降法的步长使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值