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.
