Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 辛集的化简_Python_Set_Sympy_Symbolic Math - Fatal编程技术网

Python 辛集的化简

Python 辛集的化简,python,set,sympy,symbolic-math,Python,Set,Sympy,Symbolic Math,我想知道是否有一种通用方法可以将sympy.set实例简化为其“最简单”的形式,例如,使用最少数量的集合对象和最少重复的集合元素,最好以线性方式嵌套。例如: >>> from sympy.abc import x,y >>> from sympy import S >>> from sympy.calculus.util import continuous_domain >>> >>> >>&g

我想知道是否有一种通用方法可以将
sympy.set
实例简化为其“最简单”的形式,例如,使用最少数量的集合对象和最少重复的集合元素,最好以线性方式嵌套。例如:

>>> from sympy.abc import x,y
>>> from sympy import S
>>> from sympy.calculus.util import continuous_domain
>>>
>>>
>>> f = (1-x)/(2+x) - 3*(x-y)/(1+x+y)
>>>
>>> continuous_domain(f, x, S.Reals)
Union(Complement(Interval.open(-oo, -2), Union(Complement(Intersection(FiniteSet(-2, -y - 1), Reals), FiniteSet((y - 3)/4 - sqrt(y**2 + 22*y + 13)/4, (y - 3)/4 + sqrt(y**2 + 22*y + 13)/4)), Intersection(FiniteSet(-y - 1), Reals))), Complement(Interval.open(-2, oo), Union(Complement(Intersection(FiniteSet(-2, -y - 1), Reals), FiniteSet((y - 3)/4 - sqrt(y**2 + 22*y + 13)/4, (y - 3)/4 + sqrt(y**2 + 22*y + 13)/4)), Intersection(FiniteSet(-y - 1), Reals))))
>>>
>>> # Display the answer with pretty printing
>>> from sympy import init_printing
>>> init_printing()
>>> 
>>> continuous_domain(f, x, S.Reals)
⎛           ⎛                 ⎛                     ⎧            ________________             ________________ ⎫⎞⎞⎞   ⎛          ⎛                 ⎛                     ⎧            ________________             ________________ ⎫⎞⎞⎞
⎜           ⎜                 ⎜                     ⎪           ╱  2                         ╱  2              ⎪⎟⎟⎟   ⎜          ⎜                 ⎜                     ⎪           ╱  2                         ╱  2              ⎪⎟⎟⎟
⎜           ⎜                 ⎜                     ⎨ y - 3   ╲╱  y  + 22⋅y + 13   y - 3   ╲╱  y  + 22⋅y + 13  ⎬⎟⎟⎟   ⎜          ⎜                 ⎜                     ⎨ y - 3   ╲╱  y  + 22⋅y + 13   y - 3   ╲╱  y  + 22⋅y + 13  ⎬⎟⎟⎟
⎜(-∞, -2) \ ⎜(ℝ ∩ {-y - 1}) ∪ ⎜(ℝ ∩ {-2, -y - 1}) \ ⎪ ───── - ───────────────────, ───── + ─────────────────── ⎪⎟⎟⎟ ∪ ⎜(-2, ∞) \ ⎜(ℝ ∩ {-y - 1}) ∪ ⎜(ℝ ∩ {-2, -y - 1}) \ ⎪ ───── - ───────────────────, ───── + ─────────────────── ⎪⎟⎟⎟
⎝           ⎝                 ⎝                     ⎩   4              4             4              4          ⎭⎠⎠⎠   ⎝          ⎝                 ⎝                     ⎩   4              4             4              4          ⎭⎠⎠⎠

我觉得这是解决方案的一个极其复杂的表达式,也可以写成一系列的补充和联合:

>>> Reals - FiniteSet(-y-1) - FiniteSet(-2) + FiniteSet((y - 3)/4 - sqrt(y**2 + 22*y + 13)/4, (y - 3)/4 + sqrt(y**2 + 22*y + 13)/4)
                     ⎧        ________________             ________________     ⎫
                     ⎪       ╱  2                         ╱  2                  ⎪
                     ⎨ y   ╲╱  y  + 22⋅y + 13    3  y   ╲╱  y  + 22⋅y + 13    3 ⎬
(ℝ \ {-2, -y - 1}) ∪ ⎪ ─ - ─────────────────── - ─, ─ + ─────────────────── - ─ ⎪
                     ⎩ 4            4            4  4            4            4 ⎭

我已经搜索了文档,但是没有找到任何方法来简化复杂的集合表达式,比如这个。有这样的方法吗?如果没有,我如何编写一个函数来实现这一点呢?

自上一个版本(1.5)以来,Symphy master的功能似乎有所改进。和师父在一起

In [1]: from sympy.calculus.util import continuous_domain                                                                         

In [2]: x, y = symbols('x, y')                                                                                                    

In [3]: f = (1-x)/(2+x) - 3*(x-y)/(1+x+y)                                                                                         

In [4]: continuous_domain(f, x, S.Reals)                                                                                          
Out[4]: ((-∞, -2) \ (ℝ ∩ {-y - 1})) ∪ ((-2, ∞) \ (ℝ ∩ {-y - 1}))
您可以通过将y声明为实来改进这一点:

In [5]: x, y = symbols('x, y', real=True)                                                                                         

In [6]: f = (1-x)/(2+x) - 3*(x-y)/(1+x+y)                                                                                         

In [7]: continuous_domain(f, x, S.Reals)                                                                                          
Out[7]: ((-∞, -2) ∪ (-2, ∞)) \ {-y - 1}

谢谢你的意见。关于显式声明实值符号的要点是有趣和有用的。然而,即使在更新了Symphy并按照您的建议使用它之后,我仍然得到了与我的原始帖子中显示的完全相同的输出(奇怪的是)。此外,我觉得这并不能完全回答我的问题。首先,即使是第二个示例中的输出也可以进一步简化为
ℝ \ {-2,-y-1}
。而且,即使我可以让sympy在这种情况下输出一个或多或少简化的形式,其他情况又如何?对不起,我现在知道你指的是未发布的主控。下载后,我现在可以复制您给出的输出。不过,我仍然对简化集合的方法感兴趣。