gpt4 book ai didi

python - 如何模式匹配和更改表达式中所有出现的子表达式?

转载 作者:行者123 更新时间:2023-11-28 18:20:52 26 4
gpt4 key购买 nike

使用 sympy,我需要用 C*exp(anything) 替换所有出现的 exp(C+anything)。因为exp(C)是常量,所以我就把at写成C

我可以对表达式中出现一次 exp 执行此操作。但是,如果不止一个实例,请不要这样做。

例如,对于一个实例,如 x+exp(C_0+3*x)+3*y,我需要将其更改为 x+C_0*exp(3 *x)+3*y

举个例子,经过反复试验,这似乎可行

from sympy import *
x,y,C_0 = symbols('x y C_0')
expr=x+exp(C_0+3*x)+3*y
#first check if exp is in the expression
if any([isinstance(a, exp) for a in preorder_traversal(expr)]):
p_1=Wild('p1');p_2=Wild('p_2');p_3=Wild('p_3')
r=(p_1+exp(C_0+p_2)+p_3).matches(expr)
expr.subs(exp(C_0+r[p_2]),C_0*exp(r[p_2]))

哪个给

C_0*exp(3*x) + x + 3*y

但是我需要将 x+exp(C_0+3*x)+3*y+exp(C_0+30*x+y) 更改为 x +C_0*exp(3*x)+3*y+C_0*exp(30*x+y) 我无法为每种可能的情况进行特殊模式匹配。我需要一种方法来更改所有 事件

在 Mathematica 中,我按如下方式执行上述操作

expr = x + Exp[c + 3*x]*3*y + 3*y + Exp[c + 30*x + y]
expr /. Exp[c + any_] :> (c Exp[any])

哪个给

Mathematica graphics

我实际上更喜欢告诉 Python 只需将 exp(C+anything) 更改为 C*exp(anything) 而不必为整个表达式提供模式,因为这可以在很多方面改变。

我确信以上内容在 python/sympy 中也是可行的。有什么提示吗?

最佳答案

我会在表达式中寻找函数 exp,检查它的参数是否为 Add,然后检查 C_0 是否在参数中添加。然后构建一个东西来替换 exp 。请考虑以下事项:

from sympy import *
x, y, C_0 = symbols('x y C_0')
expr = x + exp(C_0+3*x) + 3*y + exp(y+C_0+30*x) - exp(x+y-C_0) + exp(x*y)

exp_sum = [(a, a.args[0].args) for a in preorder_traversal(expr) if a.func == exp and a.args[0].func == Add]
exp_sum = [p for p in exp_sum if C_0 in p[1]]

new_exp = [C_0*exp(Add(*[x for x in p[1] if x != C_0])) for p in exp_sum]

for (old, new) in zip(exp_sum, new_exp):
expr = expr.subs(old[0], new)

最初,exp_sum 包含 exp(Add(...)) 形式的所有部分。之后,它被过滤为包含 C_0 的总和。新的指数是通过获取所有不是 C_0 的被加数、将它们相加、应用 exp 并乘以 C_0 来形成的。然后替换发生。

为了阐明这个过程,这里是上面示例中的exp_sum:一个元组列表(指数和里面的加数):

 [(exp(C_0 + 3*x), (C_0, 3*x)), (exp(C_0 + 30*x + y), (C_0, y, 30*x))]

这是new_exp

 [C_0*exp(3*x), C_0*exp(30*x + y)]

最后,expr结尾:

 C_0*exp(3*x) + C_0*exp(30*x + y) + x + 3*y + exp(x*y) - exp(-C_0 + x + y)

请注意 exp(-C_0...) 不受更改的影响;它不是模式的一部分。

关于python - 如何模式匹配和更改表达式中所有出现的子表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45179931/

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