如何在 sympy 中进行基于模式的替换来识别任何形式的因素?

问题描述 投票:0回答:1

我希望 sympy 能够在任何时候看到以下形式的表达式时进行替换

因子1 * exp^{ - 因子2 * x^2}

使用表达式 expr1。

在这里,我希望 sympy 能够在每次 Factor1 和 Factor 2 不包含符号 x 时识别该模式。

问题是,只有我知道因子 1 和因子 2 的确切形式,我现在才能进行替换工作。

一般我该怎么做?

例如,在下面的代码中,我得到了 -b + c 的预期输出

import sympy as sp
a, b, c, q = sp.symbols('a b c q')
f= (a)*sp.exp(c *q) - b

y = sp.Wild('y', properties=[lambda x: isinstance(x, sp.Symbol)])

x = sp.Wild('x', properties=[lambda x: isinstance(x, sp.Symbol)])

f.replace(x*sp.exp(y * q), c)

但是,在下面稍作修改的代码中,替换不起作用

import sympy as sp
a, b, c, q = sp.symbols('a b c q')
f= (a/b)*sp.exp(c *q) - b

y = sp.Wild('y', properties=[lambda x: isinstance(x, sp.Symbol)])

x = sp.Wild('x', properties=[lambda x: isinstance(x, sp.Symbol)])

ans = f.replace(x*sp.exp(y * q), c)

print(ans)

输出:aexp(cq)/b - b

sympy substitution symbolic-math
1个回答
0
投票

我通常通过明确定义我要查找的内容(而不是使用 Wild)来进行这些更改:

def hit(e,q):
    if not e.is_Mul: return False
    i, ex = e.as_independent(q)
    if not isinstance(ex, exp): return False
    i, d = ex.args[0].as_independent(q,as_Add=False)
    if d == q:
        return True

您说过您对

x**2
中的
exp
表达式感兴趣,但在您的示例中使用了
q
。所以我使用了一个可以指定的参数
q

>>> from sympy.abc import *
>>> from sympy import *
# your code
>>> f.replace(lambda x:hit(x,q), lambda x:y)
-b + y
>>> ((a/b)*exp(c/d*x**2)+e).replace(lambda i: hit(i,x**2), lambda i: A)
A + e

`

© www.soinside.com 2019 - 2024. All rights reserved.