Here is a more explicit example of what Gilbert is talking about: In [1]: from sympy import * In [2]: from pydy import * In [3]: x = symbols('x') In [4]: N = ReferenceFrame('N') In [5]: type(N[1]) Out[5]: pydy.pydy.UnitVector In [9]: test = x*N[1] + x*x*N[2] In [10]: type(test) Out[10]: sympy.core.add.Add In [11]: test2 = Vector(test) In [12]: test2 Out[12]: x*n1> + x**2*n2> In [13]: type(test2) Out[13]: pydy.pydy.Vector In [14]: test3 = x*test2 In [15]: test3 Out[15]: x*x*n1> + x**2*n2> In [16]: type(test3) Out[16]: sympy.core.mul.Mul
As you can see, in Out[15], the multiplication of x and test2 is being printed in a way that doesn't make sense, and in Out[16] we can see that this multiplication isn't resulting in another Vector object, instead it is of type Mul. Currently, to create a Vector object, you need to explicitly call Vector on a sympy expression that is composed from terms that have UnitVectors in them, or pass a dictionary with UnitVectors as the keys and sympy expressions as the values. Once you have that Vector object, you might want to multiply it by a scalar (sympy expression) and have it return another Vector object. This could be done using a somewhat user unfriendly approach: In [22]: Vector(dict([(k, x*v) for k, v in test2.dict.items()])) Out[22]: x**2*n1> + x**3*n2> This gets the job done, but it isn't very convenient. So basically, the question is whether 1) Is it easy enough in Sympy to make something like x*aVectorObject evaluate to another Vector object? Where the x is a "scalar part" (probably a sympy Expression) and aVectorObject is of type Vector (which currently subclasses from Basic)? 2) Or is it ok to have to be more explicit about creating Vector objects by using the notation Vector(x**2*N[1] + x**3*N[2]) or Vector({N[1]: x**2, N[2]:x**3})? Additionally, there are other types of products that make sense for Vector and UnitVector objects, namely dot, cross, and outer products. So the stuff above would only be for multiplying a Vector by a scalar. I think all the other types of products have to make use of explicit method calls since there would be no way to know which type of product would be implied. ~Luke On Mon, May 9, 2011 at 4:23 PM, Gilbert Gede <gilbertg...@gmail.com> wrote: > In PyDy (which we plan to merge into SymPy.physics.classical this summer) > Vector is one of the classes already implemented (along with UnitVector). > Vectors extend Basic, and UnitVector extend Expr. > The way it works now, you can't use Vector as part of a SymPy expression: > In [57]: test > Out[57]: x*n1> + x*a1> > In [58]: x*test*x > Out[58]: x**2*x*n1> + x*a1> > Do people want to be able to use Vector (which comes with dot, cross, outer > products, and derivative (between reference frames) functions implemented) > in SymPy expressions? Or is it the type of thing no one really wants? > I'm looking forward to getting to work on PyDy & SymPy this summer. > -Gilbert > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To post to this group, send email to sympy@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. > -- "Those who would give up essential liberty to purchase a little temporary safety deserve neither liberty nor safety." -- Benjamin Franklin, Historical Review of Pennsylvania, 1759 -- You received this message because you are subscribed to the Google Groups "sympy" group. To post to this group, send email to sympy@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.