如何替换和简化sympy中的表达式?

如何替换和简化sympy中的表达式?,sympy,Sympy,我想用表达代替 (k*x_2 + m)/(x_2 + 1) + (k*x_1 + m)/(x_1 + 1) 与 并对其进行简化,其结果如下: 8*(k + m)/(k**2 - 2*k*m + m**2 + 8) 我试过.subs({x1+x2:blahblah,x1*x2:blahblah})。事实上,它确实用blahblah替换了一些x1+x2和x1*x2,但在表达式中仍然保留了一些x1+x2。如何解决这个问题 谢谢 SymPy仅在能够准确找到表达式的情况下用表达式替换表达式(添加一些附

我想用表达代替

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

并对其进行简化,其结果如下:

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


谢谢

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)

这似乎没有完全起作用,我为此打开了一个bug

也许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)
考虑此问题的另一种方式是,根据您定义的关系,需要从
a
中删除
x_1
x_2
。因此,如果我们求解
x_1
x_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)

您是否尝试过.simplify()表达式?一个解决方法似乎是执行另一个
子({x1+x2+2:-(2*k*m-8)/k**2+2})
。然后,您可以对结果调用
cancel
,以获得所需的
8*(k+m)/(k**2-2*k*m+m**2+8)
。我曾考虑过解决
x_1
x_2
,但当我看到解决方案有多么复杂时,决定不走这条路。这种技术在一般情况下肯定不起作用。我不认为我的变量定义不正确。我的确有
x1=x_1
x2=x_2
。但请注意我的评论,在评论中,两边都添加了
2
,这样做很有效。谢谢!我没有尝试
expr.cancel().collect(k).collect(m)
,这确实很有效!
>>> 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)