The first issue I would report to the mpmath list. https://groups.google.com/forum/#!forum/mpmath. But first:
- make sure you are using the latest version of SymPy (1.0). It no longer includes mpmath, so you should use mpmath directly instead of sympy.mpmath. - don't mix SymPy and mpmath objects. Mpmath doesn't know about sympy objects. You should use mpmath.pi instead of sympy.pi. For most users, I would recommend only using SymPy functions (like Float and evalf), which are wrappers to mpmath, and know about SymPy objects. For the lambdify thing, it's a known issue https://github.com/sympy/sympy/issues/5642. For the most part, it shouldn't be an issue in practice because NumPy's broadcasting rules will make f0(y) act as if it were a an array in the appropriate contexts. However, that isn't to say that the issue shouldn't be fixed. Aaron Meurer On Fri, Apr 28, 2017 at 8:57 AM, <[email protected]> wrote: > I'm trying to find the Taylor series expansion of sin(x). My first attempt: > > >>> import numpy as np > > >>> import sympy as sy # I use "sp" as abbreviation for SciPy... > > > > >>> sy.mpmath.taylor(sy.sin,0,0) > > [mpf('0.0')] > > > > >>> sy.mpmath.taylor(sy.sin,np.pi,0) > > [mpf('0.0')] > > > > # For some strange reason, I cannot expand around sy.pi... > > > > >>> sy.mpmath.taylor(sy.sin,np.pi,1) > > [mpf('0.0'), mpf('-0.99999999999998623')] > > > > # ok… > > > > >>> sy.mpmath.taylor(sy.sin,np.pi,2) > > [mpf('0.0'), mpf('-1.0'), mpf('0.0')] > > > > # ok > > > > >>> sy.mpmath.taylor(sy.sin,np.pi,3) > > Out[8]: > > [mpf('0.0'), > > mpf('-1.0'), > > mpf('31845.854976072664'), > > mpf('2.5611218906685583e+23')] > > > # What on **earth** is this??? > -- > I then found that I can use the series method. This method seems to work... > > >>> import sympy as sy > >>> import numpy as np > >>> x = sy.Symbol('x') > >>> sin0 = sy.series(sy.sin(x),x0=sy.pi/2,n=0) > >>> sin0 > O(1, (x, pi/2)) > >>> e_sin0 = sin0.removeO() > >>> e_sin0 > 0 > >>> e_sin3 = sy.series(sy.sin(x),x0=sy.pi/2,n=3).removeO() > >>> e_sin3 > -(x - pi/2)**2/2 + 1 > > # Fine. This seems to work. > # I can now use method "lambdify" to turn these expressions into > numpy-compatible functions... > > >>> f0 = sy.lambdify(x,e_sin0,"numpy") > >>> f3 = sy.lambdify(x,e_sin3,"numpy") > > >>> y = np.linspace(-2,2,5) > > >>> f0(y) > 0 > >>> f3(y) > array([-5.3752932 , -2.30449688, -0.23370055, 0.83709578, 0.9078921 ]) > > # There is a bug in "lambdify" -- if the expression does not depend on x, > then the response is a scalar even with array input. I think the resulting > function should respond with an array of the same shape as the input array. > > # Of course, I can get around this problem by defining... > >>> f0 = sy.lambdify(x,e_sin0 + x,"numpy") > >>> f00 = lambda x: f0(x)-x > > # But this is neither not elegant, nor very user friendly > > > -- > 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 https://groups.google.com/group/sympy. > To view this discussion on the web visit https://groups.google.com/d/ > msgid/sympy/4509d8f8-6465-4018-8ce2-7ae3f77d0fac%40googlegroups.com > <https://groups.google.com/d/msgid/sympy/4509d8f8-6465-4018-8ce2-7ae3f77d0fac%40googlegroups.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- 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 https://groups.google.com/group/sympy. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAKgW%3D6Kq3uN3fVTvSSXTW%3Dd2ES0OOhcmyPK6Br78Ucx1i_Qv6w%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
