首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用同情来替换和简化表达式?

如何用同情来替换和简化表达式?
EN

Stack Overflow用户
提问于 2014-05-04 08:49:26
回答 2查看 1.1K关注 0票数 2

我想用表达代替

代码语言:javascript
复制
(k*x_2 + m)/(x_2 + 1) + (k*x_1 + m)/(x_1 + 1)

使用

代码语言:javascript
复制
x_1 + x_2 = -(2*k*m-8)/k**2
x_1 * x_2 = m**2/k**2

并将其简化,其结果如下:

代码语言:javascript
复制
8*(k + m)/(k**2 - 2*k*m + m**2 + 8)

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

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-08 00:54:22

也许x1和x2的定义有问题。我使用所示的方法得到了预期的结果:

代码语言:javascript
复制
>>> 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_2中消除a。因此,如果我们解决x_1x_2的耦合关系,并将它们替换为a,我们就会得到预期的结果:

代码语言:javascript
复制
>>> 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)
票数 2
EN

Stack Overflow用户

发布于 2014-05-06 22:27:31

只有在能够找到表达式的情况下,SymPy才能替换表达式(添加一些小的内容,比如将2*x4*x匹配)。

您将需要重写表达式,以获得您想要的那些条件。cancel会将所有内容放在一个分母之下,而collect将允许您在表达式中将m*x_1 + m*x_2转换为m*(x_1 + x_2),这样就有了x_1 + x_2。简言之:

代码语言:javascript
复制
>>> 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打开了一个bug。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23454295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档