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.
