This is why I limited my statement to "something like a sync function"


On Tue, Sep 10, 2013 at 12:11 PM, Jason Moore <[email protected]> wrote:

> 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.
>

-- 
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