SymPy:如何处理Union和Imag

2024-05-18 06:33:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我对SymPy和solveset还不熟悉。我在寻找一个表达式的奇点,为此我求解分母。之后,我想用这些结果进行进一步的计算,生成一个处理奇点情况的代码

不同方程之间的“解集”潜水员的返回。就我而言,到目前为止:

  • sets.FiniteSet
  • sets.Union

虽然FiniteSet可以直接与for循环一起使用,但Union不能

例如:

sol = Union(ImageSet(Lambda(_n, 2*_n*pi + pi/2), Integers), ImageSet(Lambda(_n, 2*_n*pi + 3*pi/2), Integers))

如果我把它放入一个循环(for s in sol:),这个循环将永远不会结束。所以这没用。sol.is_interval结果是False,而我期望的是True

观察以下检测不允许输入的示例:

def fun(x):
    if (x+pi/2)%pi == 0:
        print('Detect a not allowed input.')

其中if-条件必须从上面的解sol导出

  1. 如何确定Union的元素数是有限的还是无限的
  2. 我怎样才能得到一个在这个世界之外可用的表达式呢

这张图表解释了我想做什么:

enter image description here

左边的深蓝色部分是右边的浅蓝色部分的代码生成器,它可以是一种不同的编程语言,不能处理无穷大或被零除之类的事情。我要实现的深蓝色部分

目前我停留在“一代 奇点处理”,因为SetUnion对于打印很好,但是对于进一步的处理来说很困难,如果不是无用的话

我试图涉及solveset,因为at SymPy's documentation语句,即“solveset迟早会在内部或外部接管solve”。关于我的申请,我希望这不会发生。也许我没有完全理解sets的机制

旁注:

  • 我也没有找到一种方法,在这个Union中只提取一个ImageSethold。我想我能把它打包,但没想到会拆箱。但从我的观点来看,这对计算是必不可少的

Tags: integerslambdaforif表达式setspiunion
1条回答
网友
1楼 · 发布于 2024-05-18 06:33:59

你的具体问题1和2都是很好的问题,我认为SymPy还没有答案

不过,我会尽量回答另一部分。如果我理解正确的话,您的函数fun将拒绝解决方案x,其中(x+pi/2)%pi == 0。另一种方法是,要排除整数n的形式x = n*pi + pi/2的解决方案。我们可以将其表示为一个集合,然后将其从solveset的结果中排除:

In [7]: _n = Symbol('_n', integer=True)                                                                                                                       

In [8]: sol = Union(ImageSet(Lambda(_n, 2*_n*pi + pi/2), Integers), ImageSet(Lambda(_n, 2*_n*pi + 3*pi/2), Integers))                                         

In [9]: sol                                                                                                                                                   
Out[9]: 
⎧         π         ⎫   ⎧         3⋅π         ⎫
⎨2⋅π⋅_n + ─ | _n ∊ ℤ⎬ ∪ ⎨2⋅π⋅_n + ─── | _n ∊ ℤ⎬
⎩         2         ⎭   ⎩          2          ⎭

In [10]: exclude = ImageSet(Lambda(_n, _n*pi + pi/2), Integers)                                                                                               

In [11]: exclude                                                                                                                                              
Out[11]: 
⎧       π         ⎫
⎨π⋅_n + ─ | _n ∊ ℤ⎬
⎩       2         ⎭

In [12]: sol - exclude                                                                                                                                        
Out[12]: 
⎛⎧         π         ⎫   ⎧       π         ⎫⎞   ⎛⎧         3⋅π         ⎫   ⎧       π         ⎫⎞
⎜⎨2⋅π⋅_n + ─ | _n ∊ ℤ⎬ \ ⎨π⋅_n + ─ | _n ∊ ℤ⎬⎟ ∪ ⎜⎨2⋅π⋅_n + ─── | _n ∊ ℤ⎬ \ ⎨π⋅_n + ─ | _n ∊ ℤ⎬⎟
⎝⎩         2         ⎭   ⎩       2         ⎭⎠   ⎝⎩          2          ⎭   ⎩       2         ⎭⎠

不幸的是,在这一点上,SymPy并没有真正简化事情(而且simplify也没有帮助)。理想情况下,sol首先会简化为exclude,这样减去这两个就得到了空集,但我想这还没有实现

相关问题 更多 >