用最速下降法求解无约束优化问题min f(x)=1/2*x1^2+2/9*x2^2,设初始点x0=(9,1),一维搜索采用黄金分割法.完成最速下降法的MATLAB编程、调试
时间: 2024-11-13 21:40:50 浏览: 23
用最速下降法解决无约束优化问题通常涉及迭代过程,其中每次更新目标函数梯度的方向并沿着负梯度方向移动以逐步接近最小值。对于给定的问题,目标函数是二次型f(x) = 1/2 * x1^2 + 2/9 * x2^2,初始点x0 = (9, 1),一维搜索采用黄金分割法,我们可以编写如下的MATLAB代码:
```matlab
% 定义目标函数
function f = objFun(x)
f = 0.5 * x(1)^2 + (2/9) * x(2)^2;
end
% 初始化参数
x0 = [9; 1]; % 初始点
gradF = @(x) [x(1); 2/9 * x(2)]; % 梯度向量
tol = 1e-6; % 目标精度
maxIter = 100; % 最大迭代次数
% 黄金分割法的一维搜索
goldenRatio = (sqrt(5) - 1) / 2; % 黄金比例
a = x0;
b = [];
while ~isempty(b) && abs(a - b) > tol
c = a - goldenRatio * (a - b);
if objFun(c) < objFun(a)
b = a;
a = c;
else
b = c;
end
end
bestSearchPoint = a;
% 开始最速下降法
iter = 0;
x = x0;
while iter < maxIter
grad = gradF(x);
alpha = -objFun(x) / norm(grad); % 学习率,选择使得下一个点的函数值下降的最大步长
x_new = x + alpha * grad;
% 使用黄金分割法在一维上寻找更优的学习率
betterAlpha = false;
while ~betterAlpha
testAlpha = goldenRatio * alpha;
if objFun(x + testAlpha * grad) < objFun(x_new)
alpha = testAlpha;
x_new = x + alpha * grad;
betterAlpha = true;
else
testAlpha = (1 - goldenRatio) * alpha;
end
end
% 更新并检查停止条件
x = x_new;
iter = iter + 1;
fprintf('Iteration %d: Objective value at %s is %.4f\n', iter, num2str(x), objFun(x));
% 达到足够精确或达到最大迭代数则退出循环
if abs(objFun(x)) < tol || iter == maxIter
break;
end
end
% 输出结果
fprintf('Final solution after %d iterations:\n', iter);
fprintf('Minimum point: x* = %s\n', num2str(x));
fprintf('Minimum value: f(x*) = %.4f\n', objFun(x));
阅读全文