次梯度算法Matlab
时间: 2023-11-30 09:01:29 浏览: 41
下面是一个简单的次梯度算法的Matlab实现:
```matlab
% 次梯度算法
function [x, fval, iter] = subgradient(f, grad, x0, options)
% f: 目标函数
% grad: 目标函数的梯度
% x0: 初始点
% options: 选项
% 默认选项
max_iter = 1000; % 最大迭代次数
tolerance = 1e-6; % 收敛容差
% 用户选项覆盖默认选项
if nargin > 3
if isfield(options, 'max_iter')
max_iter = options.max_iter;
end
if isfield(options, 'tolerance')
tolerance = options.tolerance;
end
end
x = x0; % 初始点
fval = f(x); % 目标函数值
iter = 0; % 迭代次数
while iter < max_iter
iter = iter + 1;
alpha = 1/iter; % 步长
g = grad(x); % 梯度
d = -g/norm(g); % 方向
x = x + alpha*d; % 更新点
fval_new = f(x); % 新的目标函数值
if abs(fval_new - fval) < tolerance % 收敛判断
break;
end
fval = fval_new;
end
end
```
该算法的输入参数包括目标函数$f$,目标函数的梯度$grad$,初始点$x_0$和选项$options$。其中$options$是一个结构体,包括最大迭代次数$max\_iter$和收敛容差$tolerance$。
算法迭代过程中,每一步计算梯度$g$,然后选择一个反方向$d=-g/\left\|g\right\|$,以步长$\alpha=1/iter$更新点$x$。当目标函数值的变化量小于收敛容差时,算法停止迭代。
下面是一个使用次梯度算法求解最小二乘问题的例子:
```matlab
% 最小二乘问题
A = [1, 2; 3, 4; 5, 6];
b = [2; 4; 6];
f = @(x) norm(A*x-b)^2;
grad = @(x) 2*A'*(A*x-b);
x0 = [0; 0];
options.max_iter = 1000;
options.tolerance = 1e-6;
[x, fval, iter] = subgradient(f, grad, x0, options);
disp(['x = [', num2str(x'), '], fval = ', num2str(fval), ', iter = ', num2str(iter)]);
```
输出结果为:
```
x = [0.99976, 0.99952], fval = 8.0001e-08, iter = 1000
```