sympy solveset在一个案例中返回FiniteSet,但在另一个案例中返回一个补语

时间:2017-08-05 02:32:31

标签: python sympy

所以我从一个等式和一个分数开始,我用它来解决x和y:

mrs = y/x
ratio = 2/5
x = sympy.solveset(sympy.Eq(mrs, ratio), x)
y = sympy.solveset(sympy.Eq(mrs, ratio), y)

最后,解决y回报:

{2*x/5}  

哪个是FiniteSet

但是解决x返回:

{5*y/2} \ {0}  

哪个是补语

我不明白为什么解决一个变量给我一个有限集合,当解决另一个不做同样的事情时?另外,是否有办法解决其他变量以获得FiniteSet而不是Complement?

1 个答案:

答案 0 :(得分:1)

您对结果有何看法?你能用手解决这个问题并编写预期的解决方案吗?为什么你想要一个FiniteSet作为解决方案?

由于x=0需要被排除在外,我自己无法提出一个比同情更好的符号。

当您继续使用解决方案时,sympy可以轻松地使用FiniteSet和Complement。在数学上,这些并不是完全不同的结构。不同之处在于,sympy需要在内部代表这些解决方案,并且不能对所有内容使用相同的构造,而是使用小构建块来创建解决方案。使用type(x)获得的结果是使用的最后一个构建块。

编辑:这里有一些数学:x=0无法解决任何y/x=2/5的等式y。所以这必须从解决方案集中排除。

如果您解决y,则x=0已被排除,因为y/0定义不明确。

如果您解决y,那么y=0可能是先验的,因为0/x=0来自x!=0。因此,需要手动排除x=0,这样做会从解决方案集中移除0

现在,既然我们知道x=0永远不能成为方程的解,我们可以在尝试求解方程之前将其排除。因此,我们

x = sympy.symbols('x', real=True, nonzero=True)

就在示例的开头(在mrs的定义之前)。其余的可以保持不变。