我有几个未定义函数的表达式,其中一些包含该函数的相应(未定义)导数。该函数及其导数都仅以数值数据形式存在。我想从表达式中创建函数,然后使用相应的数值数据调用该函数以对表达式进行数值计算。不幸的是我遇到了lambdaify的问题。
考虑以下简化示例:
import sympy
import numpy
# define a parameter and an unknown function on said parameter
t = sympy.Symbol('t')
s = sympy.Function('s')(t)
# a "normal" expression
a = t*s**2
print(a)
#OUT: t*s(t)**2
# an expression which contains a derivative
b = a.diff(t)
print(b)
#OUT: 2*t*s(t)*Derivative(s(t), t) + s(t)**2
# generate an arbitrary numerical input
# for demo purposes lets assume that s(t):=sin(t)
t0 = 0
s0 = numpy.sin(t0)
sd0 = numpy.cos(t0)
# labdify a
fa = sympy.lambdify([t, s], a)
va = fa(t0, s0)
print (va)
#OUT: 0
# try to lambdify b
fb = sympy.lambdify([t, s, s.diff(t)], b) # this fails with syntax error
vb = fb(t0, s0, sd0)
print (vb)
错误消息:
File "<string>", line 1
lambda _Dummy_142,_Dummy_143,Derivative(s(t), t): (2*_Dummy_142*_Dummy_143*Derivative(_Dummy_143, _Dummy_142) + _Dummy_143**2)
^
SyntaxError: invalid syntax
显然 Derivative 对象未正确解析,我该如何解决这个问题?
作为lambdaify的替代方案,我也愿意使用基于theano或cython的解决方案,但我在相应的打印机上遇到了类似的问题。
感谢任何帮助。
最佳答案
据我所知,问题源于lambdaify函数中不正确/不幸的虚拟化过程。我编写了自己的虚拟化函数,在将参数和表达式传递给羔羊化之前,将其应用于参数和表达式。
def dummify_undefined_functions(expr):
mapping = {}
# replace all Derivative terms
for der in expr.atoms(sympy.Derivative):
f_name = der.expr.func.__name__
var_names = [var.name for var in der.variables]
name = "d%s_d%s" % (f_name, 'd'.join(var_names))
mapping[der] = sympy.Symbol(name)
# replace undefined functions
from sympy.core.function import AppliedUndef
for f in expr.atoms(AppliedUndef):
f_name = f.func.__name__
mapping[f] = sympy.Symbol(f_name)
return expr.subs(mapping)
像这样使用:
params = [dummify_undefined_functions(x) for x in [t, s, s.diff(t)]]
expr = dummify_undefined_functions(b)
fb = sympy.lambdify(params, expr)
显然这有点脆弱:
- 不防范名称冲突
- 也许不是最好的名称方案:
Derivative(f(x,y), x, y) 的 df_dxdy
- 假设所有导数的形式为:
Derivative(s(t), t, ...)
,其中s(t)
为UndefinedFunction
且t
> 一个符号
。我不知道如果导数的任何参数是一个更复杂的表达式会发生什么。我有点认为/希望(自动)简化过程将任何更复杂的导数减少为由“基本”导数组成的表达式。但我当然不防备它。 - 基本上未经测试(除了我的特定用例)
除此之外,它运行得很好。
关于python - lambdaify 包含 UndefinedFunction 的 Derivative 的 sympy 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29920641/