# derivative of multivariate equation with nested sum

Hello,

I often have to deal with functions like the one below, take derivatives and so on. I would really like to know if I could use a CAS like SAGE to do this tedious and error prone calculations but I couldn't find a similar kind of function in the docs and tutorials.

My questions are:

• how can I write this function in SAGE ?

for $x\in \mathbf{R}^p; v \in \mathbf{R}^{p \times k}$
$$y(x, v) := \sum^p_{i=1} \sum^p_{j>i} \sum_{f=1}^k v_{i,f} v_{j,f} x_i x_j = \sum^p_{i=1} \sum^p_{j>i} \langle v_{:,i}, v_{;,j} \rangle x_i x_j$$

• calculate the partial derivatives $\frac{\partial y(x,v)}{\partial v_{i,j}}$ ?
• or the the derivative with respect to the column-vector $\frac{\partial y(x,v)}{\partial v_{:, i} }$ ?

Or is there a better way to work with this kind of function in SAGE? (the function above is only an example)

Thanks

edit retag close merge delete

Sort by » oldest newest most voted

If your p and k are variables, then I don't know any way of doing it. But if they are fixed, then you can create them like this

sage: V = [var(['v_'+str(i)+'_'+str(j) for j in xrange(4)]) for i in xrange(5)]
sage: V
[(v_0_0, v_0_1, v_0_2, v_0_3),
(v_1_0, v_1_1, v_1_2, v_1_3),
(v_2_0, v_2_1, v_2_2, v_2_3),
(v_3_0, v_3_1, v_3_2, v_3_3),
(v_4_0, v_4_1, v_4_2, v_4_3)]
sage: X = var(['x'+str(i) for i in xrange(5)])
sage: X
(x0, x1, x2, x3, x4)


And now, your indices will match the variable names:

sage: V
v_0_1
sage: V
v_2_3


And you can do derivatives:

sage: f = sum(V[i][j] * X[i] * X[j] for i in xrange(3) for j in xrange(3))
sage: f
v_0_0*x0^2 + v_0_1*x0*x1 + v_1_0*x0*x1 + v_1_1*x1^2 + v_0_2*x0*x2 + v_2_0*x0*x2 + v_1_2*x1*x2 + v_2_1*x1*x2 + v_2_2*x2^2
sage: f.derivative(V)
x0^2

more

Thanks for your answer this is a nice approach for an intermediate solution. p and k are indeed variables and I'm looking more for a solution like $\frac{\partial y(x,v)}{\partial v_{l,f}} = x_l \sum_{j\neq l} v_{j,f} x_j$ . Maybe this is a situation where its just simpler to do it by hand and and use finite difference to check if the gradient is correct...