【问题标题】:Producing nonlinear function to be optimized in MATLAB在 MATLAB 中生成要优化的非线性函数
【发布时间】:2019-10-16 22:34:59
【问题描述】:

我正在尝试最小化这个非线性函数

在 MATLAB 中使用 BFGS 优化方法。但是,我很难弄清楚如何为 n=500 编写函数代码。我尝试了这些变体但没有运气:

1) S_symsum = @(x) (100*(x(2*(1:250))-x(2*(1:250)-1)^2)^2+(1-x(2*(1:250)-1))^2);

2) k = 1:N/2; V = (100*(x(2*k)-x(2*k-1).^2).^2+(1-x(2*k-1)).^2); f = sum(V);

3)f = symsum(100*(x(2*k)-x(2*k-1).^2).^2+(1-x(2*k-1)).^2,k,1,500)
编辑:由于 BFGS 方法需要,我需要能够在每次迭代时获取函数 f 的梯度。所以,函数公式需要保持这个属性

【问题讨论】:

  • f = @(x) sum(100*(x(2:2:end)-x(1:2:end).^2).^2+(1-x(2:2:end)).^2)?
  • 它怎么知道从 1 到 500 (n = 500) 的总和?
  • 对于所有元素都等于 1 的向量 x(您得到 F(x)==0),此函数被最小化。
  • @user23985723985 它没有。它将一直执行到x 的最后一个值。所以如果xn=500 值(length(x)==500)那么它会做 500,如果它有 20 那么它会做 20。
  • @CrisLuengo 是的,这很直观,但起始向量将为零,鉴于其独特的属性,我不能保证找到该函数的全局最优值

标签: matlab optimization nonlinear-optimization


【解决方案1】:

我使用 N = 10 进行说明,将其更改为 500 即可进行优化。

% given length of x, here N
N = 10;
% supposed x is a row vector 
 x = sym('x', [1,N]);
f = 0;
 for i = 1:N/2
    f =   f + 100.*(x(2*i) - (x(2*i-1)).^2) + (1-x(2*i-1)).^2;
 end


% gradient 
% to compute gradient, use syms function type
g = gradient(f);


% for evaluating the function or the gradient use function handle
feval = matlabFunction(f, 'vars', {x});
geval = matlabFunction(g, 'vars', {x});



【讨论】:

  • 请不要覆盖函数名sum。它存在于matlab中。称它为mysum 或其他名称。
  • 感谢您的回复!我将执行 BFGS 作为非线性优化方法。因此,在每次迭代中,我都需要能够获得函数 f 的梯度。这个配方可以吗?
  • @CrisLuengo 1)同意N是偶数,2)fmincon的使用是为了表明OP可以使用任何需要函数句柄的优化器。 3)syms函数可以区分,函数句柄不能区分
  • @Adam 谢谢你!稍后我将对此进行进一步研究
  • @user23985723985 如果您认为这对您有帮助,请接受答案。检查此链接stackoverflow.com/help/someone-answers
猜你喜欢
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2016-08-28
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-31
相关资源
最近更新 更多