在MATLAB中快速评估分析雅可比

时间:2016-03-06 00:52:32

标签: matlab symbolic-math

我已经制定了一个优化问题,需要对雅可比矩阵进行非常快速的评估。我使用MATLAB的符号工具箱从我的约束中分析地计算了雅可比。我需要一个分析雅可比行列式,以便它是准确的(我认为它会很快,但我目前的实现情况并非如此)。

这部分代码计算一次,结果J保存,然后加载到下一部分

% symbolic variables
dvs = 5;
X=sym('X',[dvs,1]);

% multiple functions
for k = 1:4 
    f1(X(k+1),X(k)) = (X(k+1) - X(k));
    c(k) = f1;
end

J = jacobian(c,X);

x = ones(dvs,1);

以下是BOTTLENECK,在优化内部计算,每次加载J,x是设计变量的集合,X是变量的符号表达式。

方法1:

J_n = double(subs(J,X,x));

我也尝试过:

方法2:

J_fun(X) = jacobian(c,X);

然后我保存了J_fun

在优化期间,这样称为:

x = [1 3 4 5 10];
x=num2cell(x);
J_fun(x{:})

这也太慢了。

方法#3

http://www.mathworks.com/help/symbolic/create-matlab-functions-from-mupad-expressions.html

J_fun2 = matlabFunction(J_fun);
x = [1 3 4 5 10];
x=num2cell(x);
J_fun2(x)

时间:

方法1:经过的时间是0.038066秒。

方法2:经过的时间是0.017192秒。

方法3:经过的时间是0.000372秒。

评论/更新#1:这可能是显而易见的,但使用上述任何方法都要确保将雅可比行传递给函数而不是加载它。这是MUUUCCH更快!

对于这个问题它很快,但对于我的问题,它要慢得多(我有一个更大的问题)。

关于这个玩具问题,METHOD 3比其他两个快得多,但如果我能加快速度,我会很喜欢它。有什么想法吗?

评论/更新#2:

方法4

归功于霍克勒。

这似乎是一个新网站,因为我在研究这个问题时没有注意到它: http://www.mathworks.com/help/optim/ug/symbolic-math-toolbox-calculates-gradients-and-hessians.html

filename = 'func.m';
matlabFunction(J_fun,'file',filename,'vars',{X});
x = [1 3 4 5 10];
x=num2cell(x);
pause
tic
func(x')
toc

非常类似于METHOD 3,除了您正在构建和优化您可以查看的实际函数。性能方面它类似于METHOD 3(对于简单的例子),我目前正在为我的问题运行此代码,它可能永远不会完成,方法3花了大约10分钟来制作计算约束的.mat文件,方法4运行5小时。现在我必须计算一个雅可比人和大约1000个Hessians .....我正在考虑建立一个集群来做这个,但我不确定它会完成。

MY ACTUAL CONSTRAINT评估时间比较:

方法3:经过的时间是1.252072秒。

方法4:经过的时间是0.716127秒。

因此,METHOD 4肯定更快。

1 个答案:

答案 0 :(得分:0)

方法#3 使用此处描述的方法,它以可接受的速度运行!

http://www.mathworks.com/help/symbolic/create-matlab-functions-from-mupad-expressions.html

J_fun2 = matlabFunction(J_fun);
x = [1 3 4 5 10];
x=num2cell(x);
J_fun2(x)