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

时间:2016-06-02 23:05:26

标签: python sympy solver

对于周期性功能,我如何告诉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

输出:

 >>>> [{x: 0}, {x: 1}, {y: 0}, {y: 1}]

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

如果我想要真实域名中的所有零,该怎么办?

-2 < x < 2
-2 < y < 2 

以某种方式获得该域上的所有解决方案会很好:

 x = k -> k in [-2,-1,0,1,2]
 OR
 y = j -> j in [-2,-1,0,1,2]

为了说明,我提供了link to Wolfram Alpha来绘制这个2D表面的图形。

1 个答案:

答案 0 :(得分: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])

给出:

[{x: -n}, {x: -n + 1}, {y: -n}, {y: -n + 1}]

因此,显然,对于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]

为您提供所需的输出:

[2, 1, 0, -1, -2]

当然,您需要分别合并为xy获得的不同解决方案,但这样可以让您走上正确的轨道。