So our module generates tons of .diff() calls on expressions with generally
multiplies, divides, powers, adds, subtracts, and the basic three trig
functions (cos, sin, tan). These expressions can be really big so we can't
identify these things by eye all the time. How would I have a Piecewise map
to these subexpressions that would cause a divide by zero?


Jason
moorepants.info
+01 530-601-9791


On Tue, Sep 10, 2013 at 3:07 PM, Matthew Rocklin <[email protected]> wrote:

> I would use a Piecewise to define something like a sync function.  This is
> an explicit way to do what you want on the SymPy side.
>
>
> On Tue, Sep 10, 2013 at 11:19 AM, Jason Moore <[email protected]>wrote:
>
>> In this case, real and positive assumptions don't help for the lambdify
>> call. I guess making lambdify assumption aware could be an option.
>>
>> I think we should define dynamicsymbols in mechanics to have a default
>> real assumption, this could help in simplification.
>>
>> The different basis is an interesting idea. Do you have an example of
>> that?
>>
>>
>> Jason
>> moorepants.info
>> +01 530-601-9791
>>
>>
>> On Tue, Sep 10, 2013 at 2:01 PM, Stefan Krastanov <
>> [email protected]> wrote:
>>
>>> The poorman's solution that I used when I had this problem was to do
>>> the calculations in a different basis. I do not know how
>>> general/automatic this solution would be.
>>>
>>> However, a common reason for bad/no simplification is lack of
>>> appropriate assumptions. Define all you symbols as real/positive and
>>> half of the issues will go away.
>>>
>>> On 10 September 2013 12:17, Jason Moore <[email protected]> wrote:
>>> > In the mechanics package we sometimes end up with symbolic expressions
>>> that
>>> > can give a divide by zero error if we use the expression in a numerical
>>> > function. Below is a simple example of an expression that could be
>>> generated
>>> > by the mechanics package. It should evaluate to zero (i.e the limit as
>>> vx ->
>>> > zero. evalf says it's zero but if I use lambdify (or probably any code
>>> > generator) to transform the expression to something that is purely
>>> numeric
>>> > we get divide by zeros. I feel like this must be a common issue when
>>> > transforming symbolic expressions to numerical functions. Does anyone
>>> know
>>> > how or if this is dealt with? It be nice if we could generate
>>> equations of
>>> > motion in the mechanics package and generate code from them that
>>> wouldn't
>>> > have divide by zero errors, requiring some fix on the numerical side.
>>> >
>>> > In [1]: from sympy import symbols, sqrt, lambdify
>>> >
>>> > In [2]: k, vx, vy, vz = symbols('k vx vy vz')
>>> >
>>> > In [3]: f = k * sqrt(vx ** 2 + vy ** 2 + vz ** 2)
>>> >
>>> > In [4]: dfdvx = f.diff(vx)
>>> >
>>> > In [5]: dfdvx
>>> > Out[5]: k*vx/sqrt(vx**2 + vy**2 + vz**2)
>>> >
>>> > In [6]: dfdvx.evalf(subs={k: 1.0, vx: 0.0, vy: 0.0, vz: 0.0})
>>> > Out[6]: 0
>>> >
>>> > In [7]: numeric_dfdvx = lambdify((k, vx, vy, vz), dfdvx)
>>> >
>>> > In [8]: numeric_dfdvx(1.0, 0.0, 0.0, 0.0)
>>> >
>>> ---------------------------------------------------------------------------
>>> > ZeroDivisionError                         Traceback (most recent call
>>> last)
>>> > <ipython-input-8-55e44f8ab1bf> in <module>()
>>> > ----> 1 numeric_dfdvx(1.0, 0.0, 0.0, 0.0)
>>> >
>>> > /usr/local/lib/python2.7/dist-packages/numpy/__init__.pyc in
>>> > <lambda>(_Dummy_26, _Dummy_27, _Dummy_28, _Dummy_29)
>>> >
>>> > ZeroDivisionError: float division by zero
>>> >
>>> > In [9]: numeric_dfdvx = lambdify((k, vx, vy, vz), dfdvx,
>>> modules='numpy')
>>> >
>>> > In [10]: numeric_dfdvx(1.0, 0.0, 0.0, 0.0)
>>> > /usr/local/lib/python2.7/dist-packages/numpy/__init__.py:1:
>>> RuntimeWarning:
>>> > invalid value encountered in double_scalars
>>> >   """
>>> > Out[10]: nan
>>> >
>>> > In [11]: numeric_dfdvx = lambdify((k, vx, vy, vz), dfdvx,
>>> modules='mpmath')
>>> >
>>> > In [12]: numeric_dfdvx(1.0, 0.0, 0.0, 0.0)
>>> >
>>> ---------------------------------------------------------------------------
>>> > ZeroDivisionError                         Traceback (most recent call
>>> last)
>>> > <ipython-input-12-55e44f8ab1bf> in <module>()
>>> > ----> 1 numeric_dfdvx(1.0, 0.0, 0.0, 0.0)
>>> >
>>> > <string> in <lambda>(k, vx, vy, vz)
>>> >
>>> > /usr/local/lib/python2.7/dist-packages/sympy/mpmath/ctx_mp_python.pyc
>>> in
>>> > __rdiv__(s, t)
>>> >     206         if t is NotImplemented:
>>> >     207             return t
>>> > --> 208         return t / s
>>> >     209
>>> >     210     def __rpow__(s, t):
>>> >
>>> > /usr/local/lib/python2.7/dist-packages/sympy/mpmath/ctx_mp_python.pyc
>>> in
>>> > __div__(self, other)
>>> >
>>> > /usr/local/lib/python2.7/dist-packages/sympy/mpmath/libmp/libmpf.pyc in
>>> > mpf_div(s, t, prec, rnd)
>>> >     928     if not sman or not tman:
>>> >     929         if s == fzero:
>>> > --> 930             if t == fzero: raise ZeroDivisionError
>>> >     931             if t == fnan: return fnan
>>> >     932             return fzero
>>> >
>>> > ZeroDivisionError:
>>> >
>>> > In [19]: dfdvx.limit(vx, 0.0)
>>> > Out[19]: 0
>>> >
>>> >
>>> > Jason
>>> > moorepants.info
>>> > +01 530-601-9791
>>> >
>>> > --
>>> > You received this message because you are subscribed to the Google
>>> Groups
>>> > "sympy" group.
>>> > To unsubscribe from this group and stop receiving emails from it, send
>>> an
>>> > email to [email protected].
>>> > To post to this group, send email to [email protected].
>>> > Visit this group at http://groups.google.com/group/sympy.
>>> > For more options, visit https://groups.google.com/groups/opt_out.
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "sympy" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To post to this group, send email to [email protected].
>>> Visit this group at http://groups.google.com/group/sympy.
>>> For more options, visit https://groups.google.com/groups/opt_out.
>>>
>>
>>  --
>> You received this message because you are subscribed to the Google Groups
>> "sympy" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at http://groups.google.com/group/sympy.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>
>  --
> You received this message because you are subscribed to the Google Groups
> "sympy" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/sympy.
> For more options, visit https://groups.google.com/groups/opt_out.
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to