# [sympy] Re: Help with chain rule

```loglikelihood does not involve W anywhere, so the derivative is zero. The
reason is that the object Zl and Sl that you introduced have nothing to do
with Zk and Sk that were computed earlier, they share the name but are of a
different class.  Other issues: ```
```
summation or hadamard_product), you'll need loglikelihood.doit() to get the
computation done before taking the derivative.

The summation (t, 0, Tk-1) is out of bounds. Sum ranges include the end
value of the index, unlike Python ranges. So you are summing over Tk values
of the index but the matrix does not have that many because one column was
dropped earlier.

Calculus with indexed symbols is still rough around the edges in SymPy. If
the above issues are sorted, you'll hit another one, #14216
<https://github.com/sympy/sympy/issues/14216> - differentiating loggamma
leads to unpolarify, which doesn't understand indexed matrix elements. A
workaround is to fill the matrix with non-indexed symbols, for example
generating them with symarray. This is what I do below; the code is
modified according to the above remarks.

n = 3
T = 5
eta = sympy.Symbol('eta')
W = sympy.Matrix(symarray('W', (n, n)))
S = sympy.Matrix(symarray('S', (n, T)))
def detdyn(s,w):
'''Z if a function of S and W'''
f = w*s
f_average = sympy.ones(1,f_average.shape[0]) * f_average #row sum
#compute coefficients of Z
c=f.as_mutable()
for r in range(T):
c.col_op(r, lambda i,j: i / f_average[0, r])
return z
Tk = S.shape[1] #length of the data
Zk = detdyn(S,W)[:,:-1] #compute the deterministic dynamics
Sk = S[:,1:] #drop first observation
i, t = sympy.symbols('i t', cls=sympy.Idx)
loglikelihood=(Tk-1)*sympy.loggamma(eta)+sympy.Sum(sympy.Sum(-sympy.loggamma(eta*Zk[i,t])+(eta*Zk[i,t]-1)*sympy.ln(Sk[i,t]),(i,

0, 2)),(t, 0, Tk-2))
print(loglikelihood.doit().diff(W[0, 0]))

--
You received this message because you are subscribed to the Google Groups
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email