Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Substitute Function call with sympy

Tags:

python

sympy

I want to receive input from a user, parse it, then perform some substitutions on the resulting expression. I know that I can use sympy.parsing.sympy_parser.parse_expr to parse arbitrary input from the user. However, I am having trouble substituting in function definitions. Is it possible to make subsitutions in this manner, and if so, how would I do so?

The overall goal is to allow a user to provide a function of x, which is then used to fit data. parse_expr gets me 95% of the way there, but I would like to provide some convenient expansions, such as shown below.

import sympy
from sympy.parsing.sympy_parser import parse_expr

x,height,mean,sigma = sympy.symbols('x height mean sigma')
gaus = height*sympy.exp(-((x-mean)/sigma)**2 / 2)

expr = parse_expr('gaus(100, 5, 0.2) + 5')

print expr.subs('gaus',gaus)                                  # prints 'gaus(100, 5, 0.2) + 5'
print expr.subs(sympy.Symbol('gaus'),gaus)                    # prints 'gaus(100, 5, 0.2) + 5'
print expr.subs(sympy.Symbol('gaus')(height,mean,sigma),gaus) # prints 'gaus(100, 5, 0.2) + 5'

# Desired output: '100 * exp(-((x-5)/0.2)**2 / 2) + 5'

This is done using python 2.7.9, sympy 0.7.5.

like image 242
Eldritch Cheese Avatar asked Mar 02 '26 00:03

Eldritch Cheese


1 Answers

You can use the replace method. For instance

gaus = Function("gaus") # gaus is parsed as a Function
expr.replace(gaus, Lambda((height, mean, sigma), height*sympy.exp(-((x-mean)/sigma)**2 / 2)))

replace also has other options, such as pattern matching.

like image 130
asmeurer Avatar answered Mar 03 '26 13:03

asmeurer



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!