[SciPy-user] symbolic strings

Robert Clewley rclewley at cam.cornell.edu
Fri Feb 3 13:28:57 EST 2006


Ryan, you'll probably need __rdiv__ and __rmul__ methods to help with 
this, in case the other objects involved in the construction are not 
symbolic objects. There are a bunch of cases you have to check to add 
braces appropriately if one of the operands is "compound", and you can
find an example of what's needed in my code for the QuantSpec 
class.

-Rob


On Fri, 3 Feb 2006, Ryan Krauss wrote:

> Thanks Travis, it sounds like I am on the right track.  I defined
> checks in the __mul__ and __div__ methods to look for compound
> expressions and add parentheses.
>
> I am running into a weird problem though.  I broke the expression into
> a numerator and denominator to get the parentheses to work, but when I
> try a=anum/aden*-1
> I get an error: TypeError: unsupported operand type(s) for /: 'symstr'
> and 'symstr'.  But symstr does have a __div__ method and when I run
> the code with the ipython pdb magic turned on, I have no trouble
> executing temp=anum/aden*-1 and getting the correct result.  Why does
> it work in the debugger and not in the script?
>
> Below is a chunk of the ipython session.
>
> Thanks,
>
> Ryan
>
> /home/ryan/rwkpython/TMM/feedback/__init__.py in GetAugMat(self, s)
>     55         anum=L0*m1*r1*s**2-c1*s-k1
>     56         aden=c1*s+k1
> ---> 57         a=anum/aden*-1
>     58 #        a=(-1)*(L0*m1*r1*s**2-c1*s-k1)/(c1*s+k1)
>     59
> b=(-1)*((L0*m1*r1**2-L0*L1*m1*r1+Iz1*L0)*s**2+(c1*L1+c1*L0)*s+k1*L1+k1*L0)/(c1*s+k1)
>
> TypeError: unsupported operand type(s) for /: 'symstr' and 'symstr'
> /home/ryan/rwkpython/TMM/feedback/__init__.py in GetAugMat()
>     56         aden=c1*s+k1
> ---> 57         a=anum/aden*-1
>     58 #        a=(-1)*(L0*m1*r1*s**2-c1*s-k1)/(c1*s+k1)
>
> ipdb> temp=anum/aden*-1
> ipdb> temp
> '((Ll0*ml1*rl1*s**2-cj1*s-kj1)/(cj1*s+kj1))*(-1)'
> ipdb> type(anum)
> <class 'rwkmisc.symstr'>
> ipdb> type(aden)
> <class 'rwkmisc.symstr'>
> ipdb> rwkmisc.symstr(1)
> '1'
> ipdb>
>
>
> On 2/3/06, Travis Oliphant <oliphant.travis at ieee.org> wrote:
>> Ryan Krauss wrote:
>>
>>> I may be getting in over my head, but I think this can work.  I do a
>>> lot of analysis with matrices using the transfer matrix method.
>>> Sometimes I want to do numeric work with them and sometimes I use
>>> python to generate an input script for Maxima.  Right now I have two
>>> methods for my transfer matrix element, one that outputs a numeric
>>> matrix and one that outputs a string for Maxima.  I am working on a
>>> new element and would like to combined these two expressions by
>>> creating a symbolic string method so that expressions like
>>> a=-(L0*m1*r1*s**2-c1*s-k1)/(c1*s+k1)
>>>
>>> make sense whether L0, m1, r1, s, etc are floats or symstrs (my new
>>> class).  I overrode the __mul__, __add__, __div__,__sub__, and __pow__
>>> methods but don't know if there are methods to override to deal with
>>> the parenthesis and the unary - out in front.  Can this be done with
>>> only a little bit more work?  Basically I want the output of this
>>> expression to be 'a=-(L0*m1*r1*s**2-c1*s-k1)/(c1*s+k1)' if it is a
>>> string and a float or complex if the variables are numbers.
>>>
>>>
>> This can be done, but you would basically have to add the parenthesis in
>> yourself as you build up your string...
>>
>> Yes, the unary '-' can be over-written (see __neg__ special method).
>>
>> -Travis
>>
>> _______________________________________________
>> SciPy-user mailing list
>> SciPy-user at scipy.net
>> http://www.scipy.net/mailman/listinfo/scipy-user
>>
>
> _______________________________________________
> SciPy-user mailing list
> SciPy-user at scipy.net
> http://www.scipy.net/mailman/listinfo/scipy-user
>

-----------------------------------
Rob Clewley
Research Associate
Department of Mathematics
  and Center for Applied Mathematics
Cornell University
Ithaca, NY 14853
www.cam.cornell.edu/~rclewley
Tel: 607-255-7760
Fax: 607-255-9860




More information about the SciPy-User mailing list