在合子(Julia)中获得雅可比矩阵的正确方法是什么?

在合子(Julia)中获得雅可比矩阵的正确方法是什么?,julia,gradient,Julia,Gradient,我试图得到L的雅可比矩阵,有一个向量q和q^dot,但不能得到一个合适的矩阵。有人能帮我正确使用这个受精卵包来获得母体吗?仅供参考,我完全不了解这个可微编程世界。任何从零开始研究DP或AD的参考资料也将受到欢迎。谢谢:) 合子对合子目前不起作用,因此我建议使用跟踪器对合子进行跟踪: using LinearAlgebra using Zygote using DifferentialEquations import Tracker ## CONSTANTS g = 9.81; ## PARAM

我试图得到L的雅可比矩阵,有一个向量q和q^dot,但不能得到一个合适的矩阵。有人能帮我正确使用这个受精卵包来获得母体吗?仅供参考,我完全不了解这个可微编程世界。任何从零开始研究DP或AD的参考资料也将受到欢迎。谢谢:)


合子对合子目前不起作用,因此我建议使用跟踪器对合子进行跟踪:

using LinearAlgebra
using Zygote
using DifferentialEquations
import Tracker

## CONSTANTS
g = 9.81;
## PARAMS
m₁ = 1;
m₂ = 1;
l₁ = 1;
l₂ = 1;

## TEST SAMPLE
θ₁=30*pi/180;
θ₂=15*pi/180;
ω₁=2.;
ω₂=1.;

q1 = [θ₁;θ₂]
q̇1 = [ω₁;ω₂]

##
M(q)=[(m₁+m₂)*l₁^2              l₁*l₂*m₂*cos(q[1]-q[2]);
      l₁*l₂*m₂*cos(q[1]-q[2])   m₂*l₂^2];

U(q) = g*(m₁*(-l₁*cos(q[1])) +
          m₂*(-l₁*cos(q[1])-l₂*cos(q[2])));

T(q,q̇) = ((1/2).*q̇'*M(q)*q̇)[1]
V(q,q̇) = U(q)

L(q,q̇) = T(q,q̇) - V(q,q̇);

## gradient((a, b) -> a*b, 2, 3)
∂L_∂q(f,q,q̇) = gradient(f,q,q̇)[1]; #Partial Diff. w/ q Vector
∂L_∂q̇(f,q,q̇) = gradient(f,q,q̇)[2]; #Partial Diff. w/ q̇ Vector
∂L_∂q(L,q1,q̇1) #OKAY
∂L_∂q̇(L,q1,q̇1) #OKAY

∂∂L_∂q∂q̇(f,q,q̇) = Tracker.gradient(((q, q̇) -> ∂L_∂q(f,q,q̇)),q,q̇)[2];
∂∂L_∂q∂q̇(L,q1,q̇1)

现在,我从最后一行得到这个错误消息,它是∂∂L_∂Q∂q̇(L,q1,q̇1)。“MethodError:没有方法匹配。”看起来跟踪器很旧,现在被合子()替换了。我可以参考Tracker软件包的任何文档吗?顺便说一下,我正在使用Julia版本1.3.1(2019-12-30)。请让我知道我是否应该恢复到以前的版本以正确使用跟踪器。谢谢:)Tracker在1.3上正常。您收到的错误消息是什么?当我尝试评估∇Q∇q̇L@(q1,q̇1),这是∂∂L_∂Q∂q̇(L,q1,q̇1):方法错误:没有方法匹配(::Zygote.var“{1276#1277”{TrackedArray{…,伴随{Tracker.TrackedReal{Float64},数组{Tracker.TrackedReal{Float64},1}},TrackedArray{…,数组{Float64,1}})(::Tracker.TrackedReal TrackedReal TrackedReal Tracker{trackedTrackedReal Tracker{trackedTracker.TrackedReal TrackedReal tracker64},TrackedReal TrackedReal tracker64},TrackedReal tracker64},数组},TrackedReal TrackedReal TrackedReal tracke在/Users/seongheonlee/.julia/packages/Zygote/ApBXe/src/lib/array.jl:295(::Zygote.var“#3252#back#1278”{Zygote.var“#1276#1277”{TrackedArray{…,伴随{跟踪器。(…其余省略…)
using LinearAlgebra
using Zygote
using DifferentialEquations
import Tracker

## CONSTANTS
g = 9.81;
## PARAMS
m₁ = 1;
m₂ = 1;
l₁ = 1;
l₂ = 1;

## TEST SAMPLE
θ₁=30*pi/180;
θ₂=15*pi/180;
ω₁=2.;
ω₂=1.;

q1 = [θ₁;θ₂]
q̇1 = [ω₁;ω₂]

##
M(q)=[(m₁+m₂)*l₁^2              l₁*l₂*m₂*cos(q[1]-q[2]);
      l₁*l₂*m₂*cos(q[1]-q[2])   m₂*l₂^2];

U(q) = g*(m₁*(-l₁*cos(q[1])) +
          m₂*(-l₁*cos(q[1])-l₂*cos(q[2])));

T(q,q̇) = ((1/2).*q̇'*M(q)*q̇)[1]
V(q,q̇) = U(q)

L(q,q̇) = T(q,q̇) - V(q,q̇);

## gradient((a, b) -> a*b, 2, 3)
∂L_∂q(f,q,q̇) = gradient(f,q,q̇)[1]; #Partial Diff. w/ q Vector
∂L_∂q̇(f,q,q̇) = gradient(f,q,q̇)[2]; #Partial Diff. w/ q̇ Vector
∂L_∂q(L,q1,q̇1) #OKAY
∂L_∂q̇(L,q1,q̇1) #OKAY

∂∂L_∂q∂q̇(f,q,q̇) = Tracker.gradient(((q, q̇) -> ∂L_∂q(f,q,q̇)),q,q̇)[2];
∂∂L_∂q∂q̇(L,q1,q̇1)