gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:12:11 27 4
gpt4 key购买 nike

我有几个未定义函数的表达式,其中一些包含该函数的相应(未定义)导数。该函数及其导数都仅以数值数据形式存在。我想从表达式中创建函数,然后使用相应的数值数据调用该函数以对表达式进行数值计算。不幸的是我遇到了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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com