我正在尝试最小化该非线性函数
使用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的梯度。因此,函数公式将需要保留此属性
答案 0 :(得分:0)
我使用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});