Как правильно получить матрицу Якоби в Зиготе (Юлия)? - PullRequest
1 голос
/ 15 марта 2020

Я пытаюсь получить матрицу Якоби для L с вектором q и q ^ точка, но не могу получить правильную матрицу. Может ли кто-нибудь помочь мне получить матрицу, используя этот пакет Zygote правильно? К вашему сведению, я совершенно не знаком с этим дифференцированным миром программирования. Также приветствуются любые ссылки на изучение DP или AD с нуля. Спасибо:)

using LinearAlgebra
using Zygote
using DifferentialEquations

## 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̇) = gradient(((q, q̇) -> ∂L_∂q(f,q,q̇)),q,q̇)[2];
∂∂L_∂q∂q̇(L,q1,q̇1) #ERROR

1 Ответ

1 голос
/ 15 марта 2020

Zygote поверх Zygote в настоящее время не работает, поэтому я бы порекомендовал Tracker over Zygote для этого:

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)
...