I would like to lambdify a sympy expression, and substitute an
implementation of an abstract function into the expression (as usual the
implementation is *a **scipy.interpolate.**spline* function). The typical
problem is the expression contains derivatives of the function. For example:
import sympy as sy
import numpy as np
import scipy.interpolate as interp
# the expression:
t = sy.Symbol('t')
f = sy.Function('f')(t)
expr = (f + f**2 / 2).diff()
# implementation:
f_spline = interp.splrep(np.linspace(0, 1, 100), np.sin(np.linspace(0, 1,
100)))
def df_impl(x):
print '[trace] f_der(' + str(x) + ')'
return interp.splev(x, f_spline, der=1)
def f_impl(x):
print '[trace] f(' + str(x) + ')'
return interp.splev(x, f_spline)
expr_impl = sy.lambdify(t, expr, {'Derivative(f(t), t)': df_impl, 'f':
f_impl})
print expr_impl(0.1)
This latest line throws the error:
File "<string>", line 1, in <lambda>
NameError: global name 'Derivative' is not defined
It's clear because *lambdify *can't substitute the the derivative string.
There is a workaround, I can do 2 subs:
expr = expr.subs({'Derivative(f(t), t)': 'g(t)'})
expr_impl = sy.lambdify(t, expr, {'g': df_impl, 'f': f_impl})
print expr_impl(0.1)
But the solution looks ugly. Any suggestions?
--
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.
To view this discussion on the web visit
https://groups.google.com/d/msgid/sympy/1600fcbd-1201-40a6-b962-e271fe73f7e3%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.