我想最小化如下功能:
在这里,n可以是5,10,50,等等。我想使用Matlab,并希望将梯度下降和准牛顿法与BFGS更新一起使用,以解决此问题以及回溯线搜索。我是Matlab的新手。有人可以帮忙吗?我可以在该链接中找到类似问题的解决方案:https://www.mathworks.com/help/optim/ug/unconstrained-nonlinear-optimization-algorithms.html。
但是,我真的不知道如何在Matlab中创建矢量值的函数(在我的情况下,输入 x 可以是n维矢量)。
答案 0 :(得分:4)
要想达到自己的目标,您将需要做出很大的飞跃-我是否建议您先通过一些basic tutorial才能理解MATLAB的基本语法和概念?另一个有用的读物是documentation中无约束优化的最基本示例。但是,您问题的答案仅涉及基本语法,因此我们仍然可以快速进行遍历。
调用优化工具箱的无约束非线性优化算法的绝对最小值是目标函数的表达。该函数应该在任何给定的点f
上返回函数的函数值x
,并且在您的情况下,它将读取
function f = objfun(x)
f = sum(100 * (x(2:end) - x(1:end-1).^2).^2 + (1 - x(1:end-1)).^2);
end
注意
我们用matrix indexing选择x
向量的单个分量,并且
符号.^
表示操作数要平方elementwise。
为简单起见,请将此功能保存到当前工作目录中的文件objfun.m
中,以便在命令窗口中可用。
现在您所要做的就是在命令窗口中调用适当的优化算法,例如准牛顿法:
n = 10; % Use n variables
options = optimoptions(@fminunc,'Algorithm','quasi-newton'); % Use QM method
x0 = rand(n,1); % Random starting guess
[x,fval,exitflag] = fminunc(@objfun, x0, options); % Solve!
fprintf('Final objval=%.2e, exitflag=%d\n', fval, exitflag);
在我的机器上,我看到算法收敛:
找到本地最小值
已完成优化,因为渐变大小小于 最优公差的默认值。
最终objval = 5.57e-11,exitflag = 1