假设我在Matlab calc(x,a,b)
中有一个输出标量的函数。 a
和b
是常量,x
被视为多变量。如何在Matlab中最小化calc(x,a,b)
x
?
编辑:函数的内容创建一个向量$ v(x)$和一个矩阵$ A(x)$然后计算$ v(x)'* A(x)^( - 1)* v( x)的$
答案 0 :(得分:2)
这是一个相当普遍的问题,根据calc
的不同,有一百万个可能的答案。 (例如,您能为calc
提供渐变吗?x
是否需要采用特定范围内的值?)
但是,作为一个开始,请转到fminunc。它适用于没有可用梯度信息的功能,您希望找到无约束的最小值。
示例代码:
假设您要最小化dot(x,x)
。
calc = @(x,a,b) dot(x,x)
calc_to_pass_to_fminunc = @(x) calc(x,1,2)
X = fminunc(calc_to_pass_to_fminunc,ones(3,1))
给出:
Warning: Gradient must be provided for trust-region algorithm;
using line-search algorithm instead.
> In fminunc at 383
Local minimum found.
Optimization completed because the size of the gradient is less than
the default value of the function tolerance.
<stopping criteria details>
X =
0
0
0
答案 1 :(得分:1)
简单的答案是:如果a
和b
是常量,而x
是一维变量,那么它就是一维优化问题。
之前的回答建议使用fminunc
,这是MATLAB优化工具箱的一部分。如果你没有它,你可以使用fminbnd
代替它,这在给定间隔内进行一维优化的情况下效果很好。
例如,假设您的calc
函数是:
function [y] = calc(x,a,b)
y = x.^3-2*x-5+a-b;
end
这是您应该在x1 < x < x2
区间找到最小值:
% constants
a = 1;
b = 2;
% boundaries of search interval
x1 = 0;
x2 = 2;
x = fminbnd(@(x)calc(x,a,b), x1, x2);
% value of function at the minimum
y = calc(x,y,a);
如果x
变量不是标量,您可以使用类似于fminbnd
的多维变量:fminsearch
,它执行无约束搜索的最小值多变量函数。
fminbnd
是一个很好的工具,但有时候很难让它像你期望的那样表现。当然,您可以指定所需的精度和最大迭代次数,以便在选项中收敛,但根据我的经验fminbnd
可能存在高度非线性函数的问题。
在这些情况下,需要对优化过程进行更精细的控制,尤其是如何定义搜索间隔。给定搜索间隔,arrayfun
提供了一种优雅的方法来迭代数组以找到最小的函数。示例代码:
% constants
a = 1;
b = 2;
% search interval
xi = linspace(0,2,1000);
yi = arrayfun(@(x)calc(x,a,b), xi);
% value of function at the minimum
[y, idx_m] = min(yi);
% location of minimum
x = xi(idx_m);
这种方法的缺点是,为了获得高精度,您可能需要一个非常长的数组xi
。好的方法是有几种方法可以缓解这个问题:例如,可以使用对数间隔采样点的矢量,或者执行多步骤最小化缩小并在每一步增加采样频率,直到达到所需的精度