2017-08-05 335 views
2

于是我开始与方程的平等和一小部分,我用它来解决x和y:sympy solveset返回FiniteSet在一种情况下,但在另一种情况下,补

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?另外,是否有办法解决其他变量,以获得有限集而不是补充?

回答

1

作为一个结果你期望什么?你能用手解决这个问题并写出预期的解决方案吗?你为什么要用FiniteSet作为解决方案?

由于x=0需要排除,我自己不能拿出比sympy更好的符号。

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

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

如果您解决了y,那么x=0已被排除,因为y/0没有很好地定义。

如果您解决了y,那么y=0是先验可能的,因为0/x=0x!=0。因此sympy需要手动排除x=0,它通过从解决方案集中删除0来完成。

现在,由于我们知道x=0永远不可能是方程的解,所以我们可以在尝试求解方程之前排除它。因此我们做

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

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

+0

所以我真的希望得到一个Finiteset,因为我知道如何访问我得到的答案,以便我可以将它们替换回另一个方程。当我在纸上做这个问题时,我只是交叉乘法,所以我可以找到x和y。这意味着我期待的只是{5 * y/2}而不是补集sympy给我的。 – CcruzRamos

+0

真的吗?我确实得到了不同的东西。 {5 * y/2}包括y = 0,因此x = 0。但计算mrs = y/x = 0/0的定义并不明确(特别是不是2/5),所以y = 0,x = 0不是一个有效的解决方案。 – Hannebambel

+0

更改x的参数有窍门!非常感谢,队友! – CcruzRamos

相关问题