Day_08: Filing and tracking issues in GitHub

Day_08: Filing and tracking issues in GitHub#

Today I ran into some strange behavior when I tried to generalize my Lagrangian equations of motion. It boils down to something happening with Symbolic Vectors

Take for example

using Symbolics

@variables t x[1:2](t) # independent and dependent variables
@variables k # parameters

Dx1 = Differential(x[1])
Dx2 = Differential(x[2])

V = 1/2*k*(x[2]- x[1])^2
┌ Warning: The variable syntax (x[1:2])(t) is deprecated. Use (x(t))[1:2] instead.
                  The former creates an array of functions, while the latter creates an array valued function.
                  The deprecated syntax will cause an error in the next major release of Symbolics.
                  This change will facilitate better implementation of various features of Symbolics.
@ Symbolics ~/.julia/packages/Symbolics/YbNrd/src/variable.jl:133
\[ \begin{equation} 0.5 \left( x\_{2}\left( t \right) - x\_{1}\left( t \right) \right)^{2} k \end{equation} \]

I define a symbolic function V that is

$\frac{1}{2}\left(x_2 - x_1\right)^2$.

Now, I take a derivative with respect to $x_1$

$\frac{\partial L}{\partial x_1} = -k(x_2 - x_1)$

but instead I get

Symbolics.expand_derivatives(Dx1(V))
\[ \begin{equation} - k \left( x\_{2}\left( t \right) - x\_{1}\left( t \right) \right) \end{equation} \]

Weird!

Expanding the polynomial there are 3 terms

  • $1/2 kx_1^2$

  • $1/2 kx_2^2$

  • $-kx_1x_2$

So, I’ll take derivatives of these terms and see what I get

Vterms = [1/2*k*x[1]^2,1/2*k*x[2]^2, -k*x[1]*x[2]]
\[\begin{split} \begin{equation} \left[ \begin{array}{c} 0.5 x\_{1}\left( t \right)^{2} k \\ 0.5 x\_{2}\left( t \right)^{2} k \\ - k x\_{2}\left( t \right) x\_{1}\left( t \right) \\ \end{array} \right] \end{equation} \end{split}\]
Symbolics.expand_derivatives.(Dx1.(Vterms))
\[\begin{split} \begin{equation} \left[ \begin{array}{c} k x\_{1}\left( t \right) \\ 0 \\ - k x\_{2}\left( t \right) \\ \end{array} \right] \end{equation} \end{split}\]

Here is the root of my problem, for some reason the partial derivative Differential(x[1]) is treating x[1] and x[2] as the same variable. The result should have been

  • $kx_1$

  • $0$

  • $-kx_2$

Unindexed variables work#

Now, I can compare this to an unindexed set of variables

@variables t y1(t) y2(t) # independent and dependent variables
@variables k # parameters

Dy1 = Differential(y1)
Dy2 = Differential(y2)

V = 1/2*k*(y2- y1)^2
\[ \begin{equation} 0.5 \left( - \mathtt{y1}\left( t \right) + \mathtt{y2}\left( t \right) \right)^{2} k \end{equation} \]
Symbolics.expand_derivatives(Dy1(V))
\[ \begin{equation} - k \left( - \mathtt{y1}\left( t \right) + \mathtt{y2}\left( t \right) \right) \end{equation} \]

This returns the correct derivative,

$\frac{\partial V}{\partial y_1} = -k(y_2 - y_1)$

@variables z_1(t)
\[\begin{split} \begin{equation} \left[ \begin{array}{c} \mathtt{z\_1}\left( t \right) \\ \end{array} \right] \end{equation} \end{split}\]
D = Differential(t)
Differential(t)
D.(x)
(broadcast(Differential(t), map(Symbolics.CallWith((t,)), x)))[Base.OneTo(2)]
D.([y1,y2])
\[\begin{split} \begin{equation} \left[ \begin{array}{c} \frac{\mathrm{d} \mathtt{y1}\left( t \right)}{\mathrm{d}t} \\ \frac{\mathrm{d} \mathtt{y2}\left( t \right)}{\mathrm{d}t} \\ \end{array} \right] \end{equation} \end{split}\]

Symbolics still adding support for arrays#

The Symbolics.jl package is incredible. Its still working on supporting differentiation with arrays. I filed this behavior on github.com/Symbolics.jl issue #571. From what I can see, the main driver behind symbolic differentiation is in the diff.jl file.

I was getting the error from line 58

    if symtype(expr) <: AbstractArray
        error("Differentiation of expressions involving arrays and array variables is not yet supported.")
    end

but @shashi added some great exceptions that remove this error in #570 and #568. There is always more work to be done on projects like this and because Julia is open source, I can dig into the code, offer help and try to add my experiences to the solution.

Wrapping up#

Today, I found some strange behavior in the Symbolics.jl package. I’ll continue to update/add to the Julia projects as issues or hopefully merge some improvements. It would be great to document the process of a PR merge from start-to-finish.

For now, the work-around appears to be that jacobian and Differential only support scalar values. So I can create a Vector of individual values as such

@variables x1(t) x2(t)
x = [x1, x2]

The development behind Julia and Symbolics.jl is active and inspiring, so I’m sure this work-around won’t need to exist much longer.