最小化脚本定义的功能

时间:2015-05-07 17:01:17

标签: matlab function optimization minimize

假设我在Matlab calc(x,a,b)中有一个输出标量的函数。 ab是常量,x被视为多变量。如何在Matlab中最小化calc(x,a,b) x

编辑:函数的内容创建一个向量$ v(x)$和一个矩阵$ A(x)$然后计算$ v(x)'* A(x)^( - 1)* v( x)的$

2 个答案:

答案 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)

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