简单的答案是:如果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。好消息是有几种方法可以缓解这个问题:例如,可以使用对数间隔采样点的向量,或者执行多步最小化缩小并增加每一步的采样频率,直到达到所需的精度.