我有一个名为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)
但我不知道如何在模式匹配中做到这一点,或者它是否能够做到这样的事情。
先谢谢=)
答案 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}
正如所料。
编辑:我发现了一种略有不同的方法:
solve(Eq(f, g))
相当于solve(f - g)
(隐式== 0)
我们可以像f - g
一样减少simplify(f - g)
,但默认情况下它不会做任何事情,因为结果公式比原始方程长1.7倍({的默认值{1}}论点)。
如果我们指定更高的比率,例如ratio
,我们就会得到
simplify(f - g, ratio=5)
现在这是解算器将要处理的形式:
>>> 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)
进行匹配,并将a
,b
和c
操纵到p
和q
。 solve
可以显示确切的公式:
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⎭
这在技术上是正确的,但可能不是你想要的。