使用 syms、f 和 hessian 编写带有动态变量的函数以获取其 Hessian 矩阵
Write function with dynamic variables to get its Hessian matrix using syms, f, and hessian
我的问题有 60 个变量(x1
到 x60
),这里是函数:
f=(x1+x2+x3)*x1+(x2+x3+x4)*x2+...+(x58+x59+x60)*x58
我想得到函数f
的Hessian矩阵。不过因为变量太多了,syms
和f
.
就不一一写了
我知道我可以手动计算函数的 Hessian 矩阵 f
因为函数不是太难。但是,我偶尔需要改变函数的形式,比如把函数改成(增加括号中的变量个数):
f=(x1+x2+x3+x4)*x1+(x2+x3+x4+x5)*x2+...+(x57+x58+x59+x60)*x57
因此,只要函数形式发生变化,我不想手动计算函数f
的Hessian矩阵。有没有更简单的方法在MATLAB中用syms
写f
这60个变量,这样我就可以用hessian
得到f
的Hessian矩阵?
首先,鉴于所描述的函数 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
循环,但不会有太大的性能优势。
我的问题有 60 个变量(x1
到 x60
),这里是函数:
f=(x1+x2+x3)*x1+(x2+x3+x4)*x2+...+(x58+x59+x60)*x58
我想得到函数f
的Hessian矩阵。不过因为变量太多了,syms
和f
.
我知道我可以手动计算函数的 Hessian 矩阵 f
因为函数不是太难。但是,我偶尔需要改变函数的形式,比如把函数改成(增加括号中的变量个数):
f=(x1+x2+x3+x4)*x1+(x2+x3+x4+x5)*x2+...+(x57+x58+x59+x60)*x57
因此,只要函数形式发生变化,我不想手动计算函数f
的Hessian矩阵。有没有更简单的方法在MATLAB中用syms
写f
这60个变量,这样我就可以用hessian
得到f
的Hessian矩阵?
首先,鉴于所描述的函数 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
循环,但不会有太大的性能优势。