1

我的问题有 60 个变量(x1to x60),这是函数:

f=(x1+x2+x3)*x1+(x2+x3+x4)*x2+...+(x58+x59+x60)*x58

我想得到函数的 Hessian 矩阵fsyms不过,因为变量太多,对于and ,我不想一一写出来f

我知道我可以手动计算函数的 Hessian 矩阵,f因为该函数并不太难。不过我偶尔需要改变函数的形式,比如把函数改成(增加括号里的变量个数):

f=(x1+x2+x3+x4)*x1+(x2+x3+x4+x5)*x2+...+(x57+x58+x59+x60)*x57

f因此,只要函数形式发生变化,我不想手动计算函数的 Hessian 矩阵。有没有更简单的方法可以在 MATLAB 中使用这 60 个变量syms进行编写f,以便我可以使用它hessian来获取 Hessian 矩阵f

4

1 回答 1

0

首先,鉴于所f描述函数的常规和简单性质,您的 Hessian 矩阵具有定义的结构,可以直接用数值计算。像这样,例如:

n = 60; % number of variables
b = 3;  % number of terms in parentheses
h = diag(2+zeros(n,1));
for i = 1:b-1
    d = diag(ones(n-i,1),i);
    h = h+d+d.';
end
h(n-b+2:n,n-b+2:n) = 0

这可以通过以下方式在没有for循环的情况下完成:

n = 60; % number of variables
b = 3;  % number of terms in parentheses
h = full(spdiags(repmat(ones(n,1),1,2*b-1),1-b:b-1,n,n)+speye(n));
h(n-b+2:n,n-b+2:n) = 0

象征性地,您可以创建一个变量向量sym来创建您的函数并像这样计算 Hessian:

n = 60; % number of variables
b = 3;  % number of terms in parentheses
x = sym('x',[n 1]); % vector of variables
f = 0;
for i = 1:n-b+1
    f = f+sum(x(i:i+b-1))*x(i);
end
h = hessian(f,x)

可以删除for循环,但不会有太多的性能优势。

于 2018-02-15T19:23:16.147 回答