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.

Reply via email to