Python SymPy模式匹配中的对应系数

时间:2015-01-24 21:21:22

标签: python sympy

我有一个名为f = 0.5 /(z-3)的函数。我想知道如果用以下形式写出f,系数p和q是多少:q /(1-p * z)但不幸的是,sympy匹配函数返回None。难道我做错了什么?或者做这样的事情的正确方法是什么? 这是代码:

z = symbols('z')
p, q = Wild('p'), Wild('q')
print (0.5/(z-3)).match(q/(1-p*z))

编辑: 我的预期答案是:q = -1 / 6和p = 1/3

当然,一种方法是

p, q = symbols('p q')
f = 0.5/(z-3)
print solve(f - q/(1-p*z), p, q,rational=True)

但我不知道如何在模式匹配中做到这一点,或者它是否能够做到这样的事情。

先谢谢=)

2 个答案:

答案 0 :(得分:2)

如果您从转换为线性表格开始,

1 / (2*z - 6) == q / (1 - p*z)
                               # multiply both sides
                               #   by (2*z - 6) * (1 - p*z)
1 - p*z == q * (2*z - 6)

然后

from sympy import Eq, solve, symbols, Wild 

z   = symbols("z")
p,q = symbols("p q", cls=Wild)

solve(Eq(1 - p*z, q*(2*z - 6)), (p,q))

给出

{p_: 1/3, q_: -1/6}

正如所料。

编辑:我发现了一种略有不同的方法:

  1. solve(Eq(f, g))相当于solve(f - g)(隐式== 0)

  2. 我们可以像f - g一样减少simplify(f - g),但默认情况下它不会做任何事情,因为结果公式比原始方程长1.7倍({的默认值{1}}论点)。 如果我们指定更高的比率,例如ratio,我们就会得到

    simplify(f - g, ratio=5)
  3. 现在这是解算器将要处理的形式:

    >>> simplify(1/(2*z-6) - q/(1-p*z), ratio=5)
    (z*p_ + 2*q_*(z - 3) - 1)/(2*(z - 3)*(z*p_ - 1))
    

答案 1 :(得分:1)

SymPy的模式匹配器只进行最小的代数操作以匹配事物。在这种情况下它不匹配,因为分母中没有1。最好与a/(b + c*z)进行匹配,并将abc操纵到pqsolve可以显示确切的公式:

In [7]: solve(Eq(a/(b + c*z), q/(1 - p*z)), (q, p))
Out[7]:
⎧   -c      a⎫
⎨p: ───, q: ─⎬
⎩    b      b⎭

最后,在构建Wild对象时使用exclude始终是个好主意,例如Wild('a', exclude=[z])。否则你可能会出现意想不到的行为,比如

In [11]: a, b = Wild('a'), Wild('b')

In [12]: S(2).match(a + b*z)
Out[12]:
⎧         2⎫
⎨a: 0, b: ─⎬
⎩         z⎭

这在技术上是正确的,但可能不是你想要的。