【问题标题】:Minimize function defined by script最小化脚本定义的函数
【发布时间】:2015-05-07 17:01:16
【问题描述】:

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

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

【问题讨论】:

  • multidimensional 是指一个通用的M-by-N 矩阵吗?如果是这样,祝你好运!

标签: matlab function optimization minimize


【解决方案1】:

这是一个相当普遍的问题,根据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

【讨论】:

  • 函数内容创建一个向量$v(x)$和一个矩阵$A(x)$并计算$v(x)'*A(x)^-1*v( x)$
【解决方案2】:

简单的答案是:如果ab 是常数,而x 是一维变量,那么它就是一维优化问题。

上一个答案建议使用fminunc,它是 MATLAB 优化工具箱的一部分。如果您没有它,您可以使用fminbnd 代替它,这在给定间隔内进行一维优化的情况下效果很好。

例如,假设您的 calc 函数是:

function [y] = calc(x,a,b)
y = x.^3-2*x-5+a-b;
end

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

【讨论】:

  • 如何抑制任何 fminsearch 显示输出。以下没有帮助:x0=初始常数; options = optimset('Display', 'off');香蕉=@(x)计算(x,常数); [x,fval] = fminsearch(banana,x0,options);
  • 我的有一个内容 :) 我找到了一种方法,尽管输入了 warning('off');
猜你喜欢
  • 1970-01-01
  • 2011-09-10
  • 2018-08-04
  • 1970-01-01
  • 2017-01-27
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 2021-10-25
相关资源
最近更新 更多