Your problem comes from using atoms(IndexedBase). Here is what that gives:
In [24]: expr.atoms(IndexedBase) Out[24]: set(p) But this doesn't have the i, j, n args that you want. I think what you really want to do is use atoms(Indexed) (Øyvind, correct me if I am wrong here). That gives: In [23]: expr.atoms(Indexed) Out[23]: set(p[1, 1, n], p[1, 1, 1 + n], p[1, 2, n], p[1, 2, 1 + n]) Making that change in your script, I get -A⋅p[1, 2, n] - B⋅p[1, 1, n] = A⋅p[1, 2, 1 + n] + B⋅p[1, 1, 1 + n] + B⋅p[1, 2, 1 + n] - A⋅p[1, 1, 1 + n] Which I think is right (at least it has all the n terms on the lhs and n + 1 terms on the rhs, is that what you wanted?) Aaron Meurer On Oct 8, 2010, at 10:34 AM, Nicholas Kinar wrote: > Hello, > > Looking back at a previous thread > (http://groups.google.com/group/sympy/browse_thread/thread/a406176eeb28eb04), > an interesting procedure was discussed to place p[i,j,n+1] terms on the LHS > of the expression. (Thanks again, Aaron!) As shown in another sample code > below, the procedure uses as_independent() with filter and lambda. > > I am testing this example code with the main branch of sympy, and I receive > the following error: > > Traceback (most recent call last): > File "test-collect-final.py", line 33, in <module> > main() > File "test-collect-final.py", line 29, in main > generate_fdtd(expr,n+1) > File "test-collect-final.py", line 21, in generate_fdtd > expr3 = expr2.as_independent(*filter(lambda t: t.args[-1] == Idx(n), > expr2.atoms(IndexedBase) ) ) > File "/usr/local/lib/python2.6/dist-packages/sympy/core/expr.py", line 323, > in as_independent > if term.has(*deps): > File "/usr/local/lib/python2.6/dist-packages/sympy/core/basic.py", line 919, > in has > raise TypeError("has() requires at least 1 argument (got none)") > TypeError: has() requires at least 1 argument (got none) > > I understand that IndexedBase is now used instead of IndexedElement in the > main branch, and I am wondering if something has changed (or if I am missing > something again). What would I have to change to make this code work with > the main branch of sympy? > > Nicholas > > > #begin sample code > from sympy import * > from sympy.tensor import Indexed, Idx, IndexedBase > from sympy.matrices import * > > p = IndexedBase('p') > var('deltax deltay delta deltat A B') > i,j,n = symbols('i j n', integer = True) > > > # > # function to generate the FDTD scheme > # > # All p[i,j,n+1] indices should be collected and on the LHS of the expression > def generate_fdtd(expr, nsolve): > expr0 = expr.lhs - expr.rhs > expr1 = expr0.expand() > w1 = Wild('w1',integer=True) > w2 = Wild('w2',integer=True) > expr2 = collect(expr1, p[w1, w2, nsolve]) > expr3 = expr2.as_independent(*filter(lambda t: t.args[-1] == Idx(n), > expr2.atoms(IndexedBase) ) ) # error here > right = -1 * expr3[0] > left = expr3[1] > return Eq(left, right.expand()) > > > def main(): > expr = Eq( A*p[1,1,n+1] - B*p[1,1,n], B*p[1,1,n+1] + A*p[1,2,n] + > B*p[1,2,n+1] + A*p[1,2,n+1]) > generate_fdtd(expr,n+1) > > > if __name__ == "__main__": > main() > # end sample code > > -- > 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. > -- 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.