TransWikia.com

Simplify rules with variable number of arguments

Mathematica Asked by R zu on March 13, 2021

Problem

How to simplify the following rules?

  • The rules simplify (single, double, triple …) summations of Kronecker delta.

  • Replacement should occur if any summation and the Kronecker delta share an index.

The rules

Single summation:

expr /. Sum[y_ KroneckerDelta[r_, s_], {s1_, 1, p1_}] :> (y /. s1 -> r)

Double summation:

expr /. Sum[y_ KroneckerDelta[r_, s_], {s1_, 1, p1_}, {s2_, 1, p2_}] :> 
    Sum[(y /. s1 -> r), {s2, 1, p2}]

Tripple summation:

Sum[y_ KroneckerDelta[r_, s_], {s1_, 1, p1_}, {s2_, 1, p2_}, {s3_, 1, p3_}] :> 
    Sum[(y /. s1 -> r), {s2, 1, p2}, {s3_, 1, p3_}]

Test Case

expr0 = Sum[Log[Sum[A[j, k, l]*B[j, k, l], {l, 1, L}]], 
            {j, 1, J}, {k, 1, K}]
expr = Simplify[D[expr0, A[a, b, c]]]
expr = expr /. Sum[y_ KroneckerDelta[r_, s_], {s_, 1, p_}] :> 
            (y /. s -> r)
expr = expr /. Sum[y_ KroneckerDelta[r_, s_], {s1_, 1, p1_}, {s2_, 1, p2_}] :> 
            Sum[(y /. s1 -> r), {s2, 1, p2}]
expr = expr /. Sum[y_ KroneckerDelta[r_, s_], {s_, 1, p_}] :> 
            (y /. s -> r)

Attempt

I try to replace all the rules with the following rule:

Sum[y_ KroneckerDelta[r_, s_], {s_, 1, p_}, z___] :> Sum[(y /. s -> r), z]

Doesn’t work because sum needs at least 2 arguments but z___ can match with nothing. In that case, Sum[(y /. s -> r), z] is a Sum with only 1 argument.

One Answer

Split the rule into two rules that match with summation over more than 1 index or just over 1 index.

z__ matches with 1 or more arguments.

expr = expr /. Sum[y_ KroneckerDelta[r_, s_], {s_, 1, p_}, z__] :> 
    Sum[(y /. s -> r), z] /. 
        Sum[y_ KroneckerDelta[r_, s_], {s_, 1, p_}] :> 
            (y /. s -> r)

Answered by R zu on March 13, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP