如果您使用了索引符号,您可能自己也注意到了这个错误,而我也很难看到它。以线路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+r3i+rim2i和G=[g0,g1,…,gn]T在哪里gi=ϕmi+m3i+mir2i. 我们要计算∇[FG]这将是一个矩阵。让我们从写第一行开始,它由偏导数组成f0=ϕr0+r30+r0m20:∂r0f0=ϕ+3r20+m20,
∂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 等)。