Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Evaluate sympy expression from an array of values

I'm experimenting with sympy and I've hit upon an issue I can't work out.

Using scipy I can write an expression and evaluate it for an array of x values as follows:

import scipy xvals = scipy.arange(-100,100,0.1) f = lambda x: x**2 f(xvals) 

Using sympy I can write the same expression as follows:

import sympy x = sympy.symbols('x') g = x**2 

I can evaluate this expression for a single value by doing the following:

g.evalf(subs={x:10}) 

However I can't work out how to evaluate it for an array of x values, like I did with scipy. How would I do this?

like image 751
mgoi Avatar asked May 21 '12 02:05

mgoi


People also ask

How do you evaluate an expression in SymPy?

To evaluate a numerical expression into a floating point number, use evalf . SymPy can evaluate floating point expressions to arbitrary precision. By default, 15 digits of precision are used, but you can pass any number as the argument to evalf .

How do you approximate in SymPy?

Basics. Exact SymPy expressions can be converted to floating-point approximations (decimal numbers) using either the . evalf() method or the N() function.

Can I use NumPy and SymPy together?

Numpy arrays don't play well with sympy objects (they're best if you use built-in numerical types with numpy). You should try sympy arrays instead, which will support something like . subs . Look at recent sympy posts that also use lambdify .


1 Answers

First of all, at the moment SymPy does not guarantee support for numpy arrays which is what you want in this case. Check this bug report http://code.google.com/p/sympy/issues/detail?id=537

Second, If you want to evaluate something numerically for many values SymPy is not the best choice (it is a symbolic library after all). Use numpy and scipy.

However, a valid reason to evaluate something numerically will be that deriving the expression to be evaluated was hard so you derive it in SymPy and then evaluate it in NumPy/SciPy/C/Fortran. To translate an expression to numpy just use

from sympy.utilities.lambdify import lambdify func = lambdify(x, big_expression_containing_x,'numpy') # returns a numpy-ready function numpy_array_of_results = func(numpy_array_of_arguments) 

Check the docstring of lambdify for more details. Be aware that lambdify still has some issues and may need a rewrite.

And just as a side note, if you want to evaluate the expressions really many times, you can use the codegen/autowrap module from sympy in order to create fortran or C code that is wrapped and callable from python.

EDIT: An updates list of ways to do numerics in SymPy can be found on the wiki https://github.com/sympy/sympy/wiki/Philosophy-of-Numerics-and-Code-Generation-in-SymPy

like image 145
Krastanov Avatar answered Oct 13 '22 20:10

Krastanov