如何在同情中替换和简化表达?

时间:2014-05-04 08:49:27

标签: sympy

我想替换表达式

(k*x_2 + m)/(x_2 + 1) + (k*x_1 + m)/(x_1 + 1)

x_1 + x_2 = -(2*k*m-8)/k**2
x_1 * x_2 = m**2/k**2

并简化它,它应具有以下结果:

8*(k + m)/(k**2 - 2*k*m + m**2 + 8)

我试过了.subs({x1+x2: blahblah, x1*x2: blahblah})。实际上,它确实用x1+x2替换了一些x1*x2blahblah,但它仍然在表达式中保留了一些x1+x2。如何解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分:2)

也许x1和x2的定义有问题。我使用显示的内容得到了所需的结果:

>>> a = (k*x_2 + m)/(x_2 + 1) + (k*x_1 + m)/(x_1 + 1)
>>> b = collect(collect(cancel(a), m), k)
>>> b.subs({x_1 + x_2: -(2*k*m - 8)/k**2, x_1*x_2: m**2/k**2}).simplify()
8*(k + m)/(k**2 - 2*k*m + m**2 + 8)

考虑此问题的另一种方法是,鉴于您定义的关系,需要x_1x_2a中删除。因此,如果我们解决x_1x_2的耦合关系并将其替换为a,我们将得到所需的结果:

>>> e2  # = Eq(x_1 + x_2 , (-2*k*m + 8)/k**2)
x_1 + x_2 == (-2*k*m + 8)/k**2
>>> e3
x_1*x_2 == m**2/k**2
>>> x1x2 = solve((e2,e3),x_1,x_2,dict=True)  # two solutions are given
>>> a.subs(x1x2[0]).simplify()  # use either solution; the result is the same
8*(k + m)/(k**2 - 2*k*m + m**2 + 8)

答案 1 :(得分:0)

SymPy只能替换表达式的表达式,如果它能够准确地找到它们(有一些小的补充,比如匹配2*x 4*x)。

您需要重写表达式以获得您想要的那些术语。 cancel会将所有内容置于一个分母之下,collect会允许您在该表达式中将m*x_1 + m*x_2转换为m*(x_1 + x_2),以便您拥有x_1 + x_2。简而言之:

>>> a = (k*x_2 + m)/(x_2 + 1) + (k*x_1 + m)/(x_1 + 1)
>>> b = collect(collect(cancel(a), m), k)
>>> b
(k*(2*x_1*x_2 + x_1 + x_2) + m*(x_1 + x_2 + 2))/(x_1*x_2 + x_1 + x_2 + 1)
>>> b.subs({x1 + x2: -(2*k*m - 8)/k**2, x1*x2: m**2/k**2})
(k*(2*m**2/k**2 + (-2*k*m + 8)/k**2) + m*(x_1 + x_2 + 2))/(1 + m**2/k**2 + (-2*k*m + 8)/k**2)

这似乎没有完全奏效,我已经为https://github.com/sympy/sympy/issues/7475打开了一个错误。