次梯度法matlab代码
时间: 2023-11-05 14:41:19 浏览: 51
下面是一个简单的次梯度法的MATLAB代码:
function [x, fval] = subgradient(f, x0, maxIter, tol)
% f: 目标函数
% x0: 初始解
% maxIter: 最大迭代次数
% tol: 收敛精度
% x: 迭代收敛的解
% fval: 目标函数在最优解处的取值
x = x0;
fval = f(x);
for i = 1:maxIter
g = subgrad(f, x);
alpha = 1/sqrt(i);
x = x - alpha*g;
fval_new = f(x);
if abs(fval_new - fval) < tol
break
end
fval = fval_new;
end
function g = subgrad(f, x)
% f: 目标函数
% x: 当前解
% g: 次梯度
n = length(x);
g = zeros(n, 1);
for i = 1:n
xplus = x;
xplus(i) = xplus(i) + 1e-6;
g(i) = (f(xplus) - f(x))/1e-6;
end
g = g + randn(n,1)*1e-6; % 加入随机扰动,避免次梯度为0的情况
end
注意,次梯度法可能会陷入局部最优解,因此需要多次运行,或者与其他方法结合使用以获得更好的结果。
相关问题
梯度下降法MATLAB代码
梯度下降法是一种常见的优化算法,用于最小化一个函数。它的思想是沿着函数下降最快的方向来搜索最优解。以下是梯度下降法的MATLAB代码示例:
```matlab
% 设定初始点
x0 = [1; 2];
% 设定学习率
alpha = 0.1;
% 设定迭代次数
max_iter = 1000;
% 定义函数
f = @(x) x(1)^2 + x(2)^2;
% 定义梯度函数
grad_f = @(x) [2*x(1); 2*x(2)];
% 初始化参数
x = x0;
iter = 0;
grad_norm = Inf;
% 开始迭代
while iter < max_iter && grad_norm > 1e-6
% 计算梯度
grad = grad_f(x);
% 更新参数
x = x - alpha * grad;
% 计算梯度范数
grad_norm = norm(grad);
% 迭代次数加1
iter = iter + 1;
end
% 输出最优解和最小值
fprintf('最优解为 (%f, %f)\n', x(1), x(2));
fprintf('最小值为 %f\n', f(x));
```
此代码中,我们设定了初始点、学习率、迭代次数、函数以及梯度函数,并进行了初始化操作。然后,在每一次迭代中,我们计算梯度、更新参数、计算梯度范数,并进行迭代操作,直到达到最大迭代次数或者梯度范数小于一定阈值为止。最后输出最优解和最小值。
梯度下降法matlab代码
以下是一个简单的梯度下降法的MATLAB代码示例:
```matlab
% 定义目标函数
f = @(x) x^2 + 2*x + 1;
% 定义目标函数的梯度
df = @(x) 2*x + 2;
% 初始点
x0 = 0;
% 学习率
alpha = 0.1;
% 迭代次数
max_iter = 100;
% 初始化迭代变量
x = x0;
iter = 0;
% 迭代更新
while iter < max_iter
% 计算梯度
grad = df(x);
% 更新参数
x = x - alpha * grad;
% 更新迭代次数
iter = iter + 1;
end
% 输出结果
fprintf('最终迭代次数:%d\n', iter);
fprintf('最优解:%f\n', x);
fprintf('目标函数最小值:%f\n', f(x));
```
这是一个简单的一元二次函数的例子,可以根据需要进行修改。