min 2*(x1)^2 + 3*(x2)^ 2 + 4*(x3) ^2 + 2x1 x2 −2x1x3 −8x1 −4x2 −2*x3 s.t. x 1 , x 2 , x 3 ≥ 0.在MATLAB中如何用梯度投影法实现,并且把每次迭代数据打印出来
时间: 2023-06-01 07:01:28 浏览: 122
以下是MATLAB代码实现梯度投影法,并打印每次迭代数据:
function [x, fval, history] = gradient_projection(x0, alpha, tol, max_iter)
% x0:初始点
% alpha:步长
% tol:容忍度
% max_iter:最大迭代次数
% 初始化
x = x0;
fval = 2*(x(1)^2) + 3*(x(2)^2) + 4*(x(3)^2) -2*x(1)*x(2) -2*x(1)*x(3) -8*x(1) -4*x(2) -2*x(3);
history = [x, fval];
for i = 1:max_iter
% 计算梯度
gx1 = 4*x(1) - 2*x(2) - 2*x(3) - 8;
gx2 = 6*x(2) - 2*x(1) - 4;
gx3 = 8*x(3) - 2*x(1) - 2;
g = [gx1, gx2, gx3];
% 投影操作
x = max(x-alpha*g, 0);
% 计算函数值
fval = 2*(x(1)^2) + 3*(x(2)^2) + 4*(x(3)^2) -2*x(1)*x(2) -2*x(1)*x(3) -8*x(1) -4*x(2) -2*x(3);
% 保存历史数据
history = [history; x, fval];
% 判断是否满足停止条件
if norm(g) < tol
break;
end
end
end
% 测试
[x, fval, history] = gradient_projection([1,1,1], 0.1, 1e-6, 100);
disp(history);
阅读全文