如何在Sympy中隔离指数(如何在Sympy中匹配`大型公式)

时间:2017-08-25 16:04:29

标签: python sympy symbolic-math

我试图以F*exp(E)的形式提取类似于高斯PDF的公式中的指数。来自SymPy的函数match()适用于简单的情况,但不适用于更复杂的公式,如下所示。

from __future__ import division
from sympy import *

δ, b, σ, m, s, μ, x = symbols('δ b σ m s μ x', real=True)

gauss = 1/σ/sqrt(2*pi)*exp( -(x-μ)**2/σ/σ/2 )
big = sqrt(2*σ**2*x + 2*s**2)* exp(
        b**2/(2*x*(σ**2*x + s**2)) - b**2/(2*x*s**2) - b*μ/(σ**2*x + s**2) + b*δ/s**2 + μ**2*x/(2*σ**2*x + 2*s**2) - μ**2/(2*σ**2) + μ*δ/σ**2 - x*δ**2/(2*s**2) - δ**2/(2*σ**2)
    ) / (2*sqrt(pi)*σ*s)

F, E = Wild('F', exclude=[exp,]), Wild('E', exclude=[exp,])
pprint( gauss)
print("match:")
pprint( gauss.match(F*exp(E)))
pprint( big )
print("match:")
pprint( big.match(F*exp(E)))  # Fails to match and returns None.

big的公式显然是F * exp(E)的形式,但match()不起作用。如何从高斯式公式中提取指数和归一化因子?

如何将等式中的指数与exp()

隔离开来

1 个答案:

答案 0 :(得分:1)

仅在Wild F上使用排除。然后E将匹配表达式的exp部分。这适用于高斯但不大 - 我不知道为什么。因此,另外,您仍然可以仅使用Wild F上的排除项并使用E.exp - 指数将为as_independent

在没有匹配的情况下破解此Mul的另一种方法是使用coeff, e = foo.as_independent(exp) expo = e.exp

distribute