python - lambdaify 包含 UndefinedFunction 的 Derivative 的 sympy 表达式

标签 python python-3.x sympy

我有几个未定义函数的表达式,其中一些包含该函数的相应(未定义)导数。该函数及其导数都仅以数值数据形式存在。我想从表达式中创建函数,然后使用相应的数值数据调用该函数以对表达式进行数值计算。不幸的是我遇到了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)UndefinedFunctiont > 一个符号。我不知道如果导数的任何参数是一个更复杂的表达式会发生什么。我有点认为/希望(自动)简化过程将任何更复杂的导数减少为由“基本”导数组成的表达式。但我当然不防备它。
  • 基本上未经测试(除了我的特定用例)

除此之外,它运行得很好。

关于python - lambdaify 包含 UndefinedFunction 的 Derivative 的 sympy 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29920641/

相关文章:

python - 在同一类中的不同方法创建的对象上调用类中的方法?

javascript - web2py CRUD.create() 表单中的字段表示

python - 在Python中比较两个数据帧值

python - psycopg2 更新查询破坏了我的 PostgreSQL 表

python - 类型错误 : a bytes-like object is required, 不是 'str'

python - Sympy:删除多项式中的高阶项

python - 如何使用 Crypto 在 python 中导入公钥?

python - 按多维数组中的值(前 5 个)排序

python - 如何将 和 代入 sympy 方程以便绘制方程?

python - 如何在 SymPy 中扩展矩阵表达式?