我如何计算这个函数的雅可比?

计算科学 雅可比
2021-12-16 04:43:48

我有两个向量rm. 两个向量都是N×1.

一个函数计算为 -

F(1:N)=ϕr+(r3+rm2)

F(N+1:2N)=ϕm+(m3+mr2)

F1 = (phi*r + r.^3 + r.*m.^2);
F2 = (phi*m + m.^3 + m.*r.^2);

F = [F1;F2];

我在计算这个函数的 Jacboian 时遇到了麻烦。这就是我所做的 -

J11 = phi*eye(N) + diag(3*r.^2 + m.^2);
J12 = diag(2*r.*m);
J21 = diag(2*m.*r);
J22 = phi*eye(N) + diag(3*m.^2 + r.^2);
J = [J11 J12; J21 J22];

其中 J 是雅可比行列式。我相信问题出在函数的一部分rm彼此相乘,但我对此不是 100% 确定,即使我是,我也不确定如何解决这个问题。

上面的代码是用 MATLAB 编写的。任何帮助将非常感激。

1个回答

如果您使用了索引符号,您可能自己也注意到了这个错误,而我也很难看到它。以线路J11 = phi*eye(N) + (3*r.^2 + m.^2); 为例。您正在将矩阵phi*eye(N)和向量添加(3*r.^2 + m.^2)在一起。几年来,这是 MATLAB 中允许的操作,因为它在数据科学中有很好的用途,但是,我更喜欢以前抛出错误的行为,因为它会导致像这样的语义错误。例如,跑步[1 0; 0 1] + [2;2]返回

ans =

     3     2
     2     3

这对于数据科学来说可能是一种方便的操作,但对你来说却是一个错误的来源。

现在,让我通过用索引符号重写你的问题来指出这个问题。F=[f0,f1,,fn]T在哪里fi=ϕri+ri3+rimi2G=[g0,g1,,gn]T在哪里gi=ϕmi+mi3+miri2. 我们要计算[FG]这将是一个矩阵。让我们从写第一行开始,它由偏导数组成f0=ϕr0+r03+r0m02

r0f0=ϕ+3r02+m02,
rif0=0for all i>0,
m0f0=2r0m0,
最后
mif0=0for all i>0.
因此,鉴于我正确解释了您的符号,所有雅可比计算都是错误的。(但我不知道如何理解F否则)

因此,雅可比应该计算为

J11 = phi*eye(N) + diag(3*r.^2 + m.^2);
J12 = diag(2*r.*m);
J21 = diag(2*m.*r);
J22 = phi*eye(N) + diag(3*m.^2 + r.^2);

J = [J11 J12; J21 J22];

根据未知数的数量,您可能希望使用 MATLAB 提供的稀疏数据结构(speye、spdiags 等)。