使用动态变量编写函数以使用syms,f和hessian

时间:2018-02-15 18:45:38

标签: matlab symbolic-math hessian-matrix

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

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

我想得到函数f的Hessian矩阵。但是,由于变量太多,我不想逐一为symsf编写它们。

我知道我可以手动计算函数f的Hessian矩阵,因为函数并不太难。但是,我偶尔需要更改函数的形式,例如将函数更改为(增加括号中的变量数):

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

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

1 个答案:

答案 0 :(得分: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循环,但不会带来很多性能优势。