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 曲面。
我认为这不能直接完成,但有一个解决方法(至少对于您发布的这个特定功能):
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,但这应该会让您走上正确的轨道。