我的问题有60个变量(x1
到x60
),这是函数:
f=(x1+x2+x3)*x1+(x2+x3+x4)*x2+...+(x58+x59+x60)*x58
我想得到函数f
的Hessian矩阵。但是,由于变量太多,我不想逐一为syms
和f
编写它们。
我知道我可以手动计算函数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矩阵?
答案 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
循环,但不会带来很多性能优势。