Hi.

So this is related to this.  You can't make UnitVector or Vector
derive from Basic basic because x*vector will still try to put vector
in the Mul, because the way that Expr.__mul__ is implemented, it takes
in any sympifiable argument.  But does this make sense?  It seems to
me that it should only accept any argument that becomes an instance of
Expr after being sympified.  Ronan, what do you think?

If it were done that way, then it would be easy to make x*vector
distribute the x into the vector, because x.__mul__(vector) would
return NotImplemented (because vector would be Basic, not Expr), and
so it would call vector.__rmul__(x), which could then do distribution
magic.  This could also work for Poly, i.e., right now:

In [5]: 2*Poly(x)
Out[5]: Poly(2*x, x, domain='ZZ')

In [6]: Poly(x)*2
Out[6]: Poly(2*x, x, domain='ZZ')

In [7]: S(2)*Poly(x)
Out[7]: 2⋅Poly(x, x, domain='ZZ')

p.s., Poly derives from Expr, but it seems to me that it should just
derive from Basic.  Again, Ronan, what do you think?

Aaron Meurer


On Mon, May 9, 2011 at 6:51 PM, Luke <[email protected]> wrote:
> Can the vectors and multivectors in the GA module work with arbitrary
> sympy expressions?  i.e, if v is a GA vector, and s is a sympy
> expression, does it make sense to do: s*v?  Is the result of type Mul
> or of something else?
>
> ~Luke
>
> On Mon, May 9, 2011 at 5:42 PM, Alan Bromborsky <[email protected]> wrote:
>> On 05/09/2011 08:30 PM, Luke wrote:
>>>
>>> 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<[email protected]>
>>>  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 [email protected].
>>>> To unsubscribe from this group, send email to
>>>> [email protected].
>>>> For more options, visit this group at
>>>> http://groups.google.com/group/sympy?hl=en.
>>>>
>>>
>>>
>> GA module has vectors and multivectors.  See documentation
>> http://docs.sympy.org/dev/modules/galgebra/GA/GAsympy.html
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "sympy" group.
>> To post to this group, send email to [email protected].
>> To unsubscribe from this group, send email to
>> [email protected].
>> 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 [email protected].
> To unsubscribe from this group, send email to 
> [email protected].
> 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 [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/sympy?hl=en.

Reply via email to