On Wed, Mar 24, 2010 at 11:55 AM, Ondrej Certik <ond...@certik.cz> wrote: > On Wed, Mar 24, 2010 at 11:09 AM, Ondrej Certik <ond...@certik.cz> wrote: >> On Wed, Mar 24, 2010 at 11:01 AM, Freddie Witherden >> <fred...@witherden.org> wrote: >>> Hi all, >>> >>> After a discussion on IRC I am interested if there is any way to evaluate >>> sums of the form: >>> >>>>>> B = [ Symbols, expressions, ... ] >>>>>> Sum(n*B[n]*Sqrt(B[n]), (n, 0, len(b)-1)) >>> >>> I ask because the project I am currently working on is based heavily around >>> sums of this form: >>> sum(sum(sum(sum(B[i]*A[i,j]*A[j,k]*A[k,l]*C[l],l,1,s),k,1,s),j,1,s),i,1,s) >>> = 1/120 >>> >>> where s, A[i,j] (matrix) and C[i] (vector) are evaluate to Real numbers >>> with just B[i] being Symbols (so the result of the above expression is an >>> equation of the form x1*B[1] + x2*B[2] + ... + xn*B[n] with xn being Reals >>> (of course in Python the indices would be slightly different). >>> >>> Can anyone think of a clean way to evaluate these sorts of sums? (Extra >>> points if you know where such sums arise in practise ;) >>> >>> Currently my workflow is: >>> 1) Use Python to generate the sums; >>> 2) Evaluate using Maxima; >>> 3) Paste back into a Python script, parse with regex, solve. >> >> Can you paste your whole code so that we can try it? So your problem >> is that some (complicated?) sums can't be evaluated in sympy, but it >> works in maxima? >> >> Paste the exact expressions, let's see what can be done. > > Ok, after chatting at IRC a bit, here are the examples of expressions > in maxima, that you need to work in sympy: > > sum(sum(sum(sum(B[i1]*A[i1,i2]*A[i2,i3]*A[i3,i4]*C[i4]^1, i4, 1, i3), > i3, 1, i2), i2, 1, i1), i1, 1, s) - 1/120 > sum(sum(sum(B[i1]*A[i1,i2]*A[i2,i3]*C[i3]^2, i3, 1, i2), i2, 1, i1), > i1, 1, s) - 1/60 > sum(sum(sum(B[i1]*A[i1,i2]*C[i2]^1*A[i2,i3]*C[i3]^1, i3, 1, i2), i2, > 1, i1), i1, 1, s) - 1/40 > sum(sum(sum(B[i1]*C[i1]^1*A[i1,i2]*A[i2,i3]*C[i3]^1, i3, 1, i2), i2, > 1, i1), i1, 1, s) - 1/30 > sum(sum(B[i1]*A[i1,i2]*C[i2]^3, i2, 1, i1), i1, 1, s) - 1/20 > sum(sum(B[i1]*C[i1]^1*A[i1,i2]*C[i2]^2, i2, 1, i1), i1, 1, s) - 1/15 > sum(sum(sum(B[i1]*A[i1,i2]*C[i2]^1*A[i1,i3]*C[i3]^1, i3, 1, i1), i2, > 1, i1), i1, 1, s) - 1/20 > sum(sum(B[i1]*C[i1]^2*A[i1,i2]*C[i2]^1, i2, 1, i1), i1, 1, s) - 1/10 > sum(B[i1]*C[i1]^4, i1, 1, s) - 1/5 > > e.g.: > > (%i1) s : 17; > (%o1) 17 > (%i2) sum(B[i1]*C[i1]^4, i1, 1, s) - 1/5; > 4 4 4 4 4 4 4 > (%o2) B C + B C + B C + B C + B C + B C + B C > 17 17 16 16 15 15 14 14 13 13 12 12 11 11 > 4 4 4 4 4 4 4 4 4 > + B C + B C + B C + B C + B C + B C + B C + B C + B C > 10 10 9 9 8 8 7 7 6 6 5 5 4 4 3 3 2 2 > 4 1 > + B C - - > 1 1 5 > > > Yes, this should be possible.
Here is one way (thanks again to Fernando for implementing the symarray!): In [1]: s = 17 In [2]: Bi1 = symarray(s, "B") In [3]: Ci1 = symarray(s, "C") In [4]: Add(*(Bi1*Ci1**4)) - S(1)/5 Out[4]: 4 4 4 4 4 4 4 -1/5 + B₀⋅C₀ + B₁⋅C₁ + B₁₀⋅C₁₀ + B₁₁⋅C₁₁ + B₁₂⋅C₁₂ + B₁₃⋅C₁₃ + B₁₄⋅C₁₄ 4 4 4 4 4 4 4 4 + B₁₅⋅C₁₅ + B₁₆⋅C₁₆ + B₂⋅C₂ + B₃⋅C₃ + B₄⋅C₄ + B₅⋅C₅ + B₆⋅C₆ + B₇⋅C₇ + 4 4 B₈⋅C₈ + B₉⋅C₉ Ondrej -- You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to sy...@googlegroups.com. To unsubscribe from this group, send email to sympy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sympy?hl=en.