Sympy 解决域上的所有解决方案

D A*_*ams 5 python solver sympy

对于周期函数,我如何知道sympy我想要某个域上的所有解决方案?

例子:

import sympy
import sympy.parsing.sympy_parser

SympyExpression = sympy.parsing.sympy_parser.parse_expr( 'sin(pi* x)*sin(pi*y)' )
Variables = [sympy.Symbol('x'),sympy.Symbol('y') ]
Zeros = sympy.solve( f = SympyExpression, symbols = Variables )

print Zeros
Run Code Online (Sandbox Code Playgroud)

输出:

 >>>> [{x: 0}, {x: 1}, {y: 0}, {y: 1}]
Run Code Online (Sandbox Code Playgroud)

显然,解决方案是正确的,但并不完整。

如果我想要实域上的所有零怎么办:

-2 < x < 2
-2 < y < 2 
Run Code Online (Sandbox Code Playgroud)

不知何故,如果能获得该域上的所有解决方案就好了:

 x = k -> k in [-2,-1,0,1,2]
 OR
 y = j -> j in [-2,-1,0,1,2]
Run Code Online (Sandbox Code Playgroud)

为了便于说明,我提供了Wolfram Alpha 的链接,它绘制了这个 2D 曲面。

Cle*_*leb 0

我认为这不能直接完成,但有一个解决方法(至少对于您发布的这个特定功能):

import sympy

x = sympy.Symbol('x')
y = sympy.Symbol('y')
n = sympy.Symbol('n')

sol = sympy.solve('sin(pi*(x + n))*sin(pi*(y+n))', [x, y])
Run Code Online (Sandbox Code Playgroud)

这使:

[{x: -n}, {x: -n + 1}, {y: -n}, {y: -n + 1}]
Run Code Online (Sandbox Code Playgroud)

所以,很明显,为n = 0您提供了标准解决方案。现在,您可以简单地循环遍历您的解决方案以获取某些值,n并过滤出您所需范围内的值。例如

[sol2[0][x].subs(n, vali) for vali in range(-30, 40) if sol2[0][x].subs(n, vali) >= -2 and sol2[0][x].subs(n, vali) <= 2]
Run Code Online (Sandbox Code Playgroud)

这会给你想要的输出:

[2, 1, 0, -1, -2]
Run Code Online (Sandbox Code Playgroud)

当然,您随后需要合并分别为x和获得的不同解决方案y,但这应该会让您走上正确的轨道。