我在 Sympy 中有一个表达式(比如
-M - n + x(n)
) 我会 喜欢创建一个正式的线性函数,说 f,并将其应用于我的表达式,以便在简化后得到:
-f(M) - f(n) + f(x(n))
是否可以告诉 sympy 验证了线性等属性?
一个非常 hacky 的方法是将函数 f 应用于求和中的每个子表达式。 例如,当给出像我给出的第一个表达式那样的表达式时,简单地访问出现在总和中的术语会很好(这里是
[-M, -n , x(n)]
然后将 f 映射到列表上并将其求和以获得预期的结果。
是否有一种简单的方法可以做到这一点,或者我是否必须遍历表达式的句法树?
最佳答案
这个有效:
>>> x,f = map(Function, 'xf'); n,M = symbols('n,M'); expr = -M - n + x(n)
>>> Add(*[f(a) for a in Add.make_args(expr)])
f(-M) + f(-n) + f(x(n))
如果你有一个像 f(n*(M + 1))
这样的表达式,你展开它你会得到 f(n*M + n)
。你能告诉 SymPy 将函数应用于 f
的参数吗?是的:
>>> expr = f(n*(M + 1))
>>> expr.expand().replace(lambda x: x.func == f,
... lambda x: Add(*[f(a) for a in Add.make_args(x.args[0])]))
f(n) + f(M*n)
如果您调用这样的替换 linapp
,您可以将它用于您想要的任何功能:
def linapp(expr, *f):
return expr.expand().replace(
lambda x: x.func in f,
lambda x: Add(*[x.func(a) for a in Add.make_args(x.args[0])]))
>>> print(linapp(cos(x+y) + sin(x + y), cos, sin))
sin(x) + sin(y) + cos(x) + cos(y)
(并不是说这是一个真实的结果,只是说你可以做到。如果你用其他东西替换一个变量并且你想重新应用线性化,你可以:
>>> linapp(_.subs(y, z + 1), cos)
sin(x) + sin(z + 1) + cos(x) + cos(z) + cos(1)
关于python - 在 Sympy 中创建一个正式的线性函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34674133/