Sympy的尴尬替代

时间:2013-12-29 15:52:05

标签: python sympy sage

在Sympy中有一种更简单的替代方法,类似于Sage或Mathematica。 在Mathematica中你有一个名为eliminate()的东西,它给出了一组方程式,你可以要求它消除某些变量。 在Sage你需要更多地掌握它,但它仍然或多或少类似于Mathematica。 在Sympy相对来说,做替换更加尴尬。

在屏幕截图中,红色箭头显示我正在谈论的内容。白箭是我认为更合适的方法。

http://i.stack.imgur.com/FQHzd.jpg

编辑1:这是mathematica http://reference.wolfram.com/mathematica/ref/Eliminate.html

中函数的链接

2 个答案:

答案 0 :(得分:4)

你可以在SymPy中使用方程式(实际上是Equality对象):

>>> eq1=Eq(x,y);eq2=Eq(x,5)

但你是对的,潜艇不会为你猜测一切。看起来Sage假设如果变量在方程的一侧被隔离,那就是要替换的变量。但无法保证您始终可以方便地隔离所需的变量。使用solve来提供所需的变量是不难的:

>>> solve(eq2,x,dict=1)
[{x:5}]

然后可以将其替换为您想要消除该变量的等式。

>>> eq1.subs(solve(eq2,x,dict=1)[0])
5=y

使用“exclude”关键字目前的表现并不像我预期的那样;也许它应该在消除意义上行动:

>>> solve((eq1,eq2), exclude=(x,))
{y:x}

答案 1 :(得分:0)

跟进上述评论和https://github.com/sympy/sympy/issues/14741,在Sympy中执行上述操作的一种方法是:

from sympy import Eq, var
var('P, F, K, M, E0, E1, E2, E3, E4')
a = Eq(E1, (E0 + P - F)*K - M)
b = Eq(E2, (E1 + P - F)*K - M)
c = Eq(E3, (E2 + P - F)*K - M)
d = Eq(E4, (E3 + P - F)*K - M - F)
d.subs(*c.args).subs(*b.args).subs(*a.args)