有没有办法在 SymPy 中处理常量函数参数?
Is there a way to handle constant function parameters in SymPy?
我正在生成符号函数并使用 SymPy 来简化它们。
现在我想要一种 "simplify" 符号的方法,这些符号表示尚未安装的函数中的常量参数。
例如,如果我正在生成多项式,我可能会生成这样的字符串
C*x*x + C*x + C*x + C,
SymPy 会变成
C*x^2 + 2*C*x + C.
现在我想找到一个方法来得到这个:
C*x^2 + C*x + C.
换句话说,有没有办法告诉SymPy某个符号是常量和未定义的,这样
C+C -> C, C*C -> C, etc. Or more generally: f(C) = C, for any f(C)?
我的第一个想法是,也许有一个假设(例如Q.positive)描述了这个属性,我也许可以使用refine。然而,情况似乎并非如此。
如果不出意外,我确信有一种方法可以使用 preorder_traversal 来做我想做的事,但我想不出一个策略来做这件事。
感谢任何帮助或想法。
也许是这样的(应用于已完全展开的表达式):
def consim(eq, *v):
con = numbered_symbols('c', cls=Dummy)
reps = {}
for i in preorder_traversal(eq):
if i.is_Mul or i.is_Add:
c, d = i.as_independent(*v)
if c != i.identity and c.free_symbols:
c = reps.setdefault(c, next(con))
return eq.subs(reps)
>>> from sympy.abc import a, b, c, d, x
>>> eq = 2*a*x**2 + b*c*x + d + e
>>> consim(eq, x)
2
c₀ + c₁⋅x + c₂⋅x
您可能需要带编号的符号,而不是所有符号都相同。
我正在生成符号函数并使用 SymPy 来简化它们。 现在我想要一种 "simplify" 符号的方法,这些符号表示尚未安装的函数中的常量参数。 例如,如果我正在生成多项式,我可能会生成这样的字符串
C*x*x + C*x + C*x + C,
SymPy 会变成
C*x^2 + 2*C*x + C.
现在我想找到一个方法来得到这个:
C*x^2 + C*x + C.
换句话说,有没有办法告诉SymPy某个符号是常量和未定义的,这样
C+C -> C, C*C -> C, etc. Or more generally: f(C) = C, for any f(C)?
我的第一个想法是,也许有一个假设(例如Q.positive)描述了这个属性,我也许可以使用refine。然而,情况似乎并非如此。 如果不出意外,我确信有一种方法可以使用 preorder_traversal 来做我想做的事,但我想不出一个策略来做这件事。 感谢任何帮助或想法。
也许是这样的(应用于已完全展开的表达式):
def consim(eq, *v):
con = numbered_symbols('c', cls=Dummy)
reps = {}
for i in preorder_traversal(eq):
if i.is_Mul or i.is_Add:
c, d = i.as_independent(*v)
if c != i.identity and c.free_symbols:
c = reps.setdefault(c, next(con))
return eq.subs(reps)
>>> from sympy.abc import a, b, c, d, x
>>> eq = 2*a*x**2 + b*c*x + d + e
>>> consim(eq, x)
2
c₀ + c₁⋅x + c₂⋅x
您可能需要带编号的符号,而不是所有符号都相同。