【问题标题】:How to isolate the exponent in Sympy (how to `match` large formulas in Sympy)如何在 Sympy 中隔离指数(如何在 Sympy 中“匹配”大公式)
【发布时间】:2017-08-25 16:04:29
【问题描述】:

我正在尝试以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() 隔离方程中的指数?

【问题讨论】:

    标签: python sympy symbolic-math


    【解决方案1】:

    仅在 Wild F 上使用排除。然后 E 将匹配表达式的 exp 部分。这适用于高斯但不是很大——我不知道为什么。因此,或者,您仍然可以仅在 Wild F 上使用排除并使用 m = foo.match(E*F) - 指数将为 E.exp

    不匹配破解这个Mul的另一种方法是使用as_independent

    coeff, e = foo.as_independent(exp)
    expo = e.exp
    

    【讨论】:

    • 使用as_independent 的解决方案对我有用!只需要注意表达式不像coeff*exp(e1)*exp(e2)。我为此使用了simplify()。这回答了“如何隔离指数”的问题(第二部分)。使用match 匹配大型公式仍未解决,但不是我的问题。 ` def decomp_exp(x): exp = simple(exp) coeff, e = x.as_independent(exp) assert isinstance(e, exp) expon = e.exp assert not isinstance(coeff, exp) 断言简化(coeff*exp( expon) - x) == 0 返回系数,expon `
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2016-04-09
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多