在多变量情况下使用 SymPy 求解时限制解集域
Restricting domain of solution set when using SymPy solve in the multiple variables case
说,我正在尝试求解方程组:
对于 θ、λ 和 ɸ ,其中 a
、b
、c
和 d
是复数,LHS 上的矩阵是酉矩阵。
我手头的 SymPy code 确实成功地完成了这项工作,但它遗漏了一些边缘情况。
from sympy import *
def get_angles(a, b, c, d):
theta, phi, lamb = symbols('\theta \phi \lambda', real=True)
a_eq = Eq(cos(theta / 2), a)
b_eq = Eq(exp(I * phi) * sin(theta / 2), b)
c_eq = Eq(-exp(I * lamb) * sin(theta / 2), c)
d_eq = Eq(exp(I * (phi + lamb)) * cos(theta / 2), d)
res = solve([a_eq, b_eq, c_eq, d_eq],
theta,
phi,
lamb,
check=False,
set=True)
return res
例如,它不限制解决方案的范围。我 做了 注意到 this answer 但它只适用于单变量情况。那么知道如何在处理多个变量时为解集添加域限制吗?
您可以对符号声明假设并解决应该检查它们,例如:
In [12]: solve(x*(1-x))
Out[12]: [0, 1]
In [13]: x = Symbol('x', positive=True)
In [14]: solve(x*(1-x))
Out[14]: [1]
这适用于某些限制,但不适用于 x<y
这样的限制。但是,您可以 post-process solve:
的输出
In [6]: sol = [{x:1, y:2, z:3}, {x:1, y:0, z:4}, {x:3, y:2, z:1}]
In [7]: sol
Out[7]: [{x: 1, y: 2, z: 3}, {x: 1, y: 0, z: 4}, {x: 3, y: 2, z: 1}]
In [8]: cond = And(0 < x, x < z, 0 < y)
In [9]: cond
Out[9]: x > 0 ∧ y > 0 ∧ x < z
In [10]: cond.subs(sol[0])
Out[10]: True
In [11]: [s for s in sol if cond.subs(s)]
Out[11]: [{x: 1, y: 2, z: 3}]
说,我正在尝试求解方程组:
对于 θ、λ 和 ɸ ,其中 a
、b
、c
和 d
是复数,LHS 上的矩阵是酉矩阵。
我手头的 SymPy code 确实成功地完成了这项工作,但它遗漏了一些边缘情况。
from sympy import *
def get_angles(a, b, c, d):
theta, phi, lamb = symbols('\theta \phi \lambda', real=True)
a_eq = Eq(cos(theta / 2), a)
b_eq = Eq(exp(I * phi) * sin(theta / 2), b)
c_eq = Eq(-exp(I * lamb) * sin(theta / 2), c)
d_eq = Eq(exp(I * (phi + lamb)) * cos(theta / 2), d)
res = solve([a_eq, b_eq, c_eq, d_eq],
theta,
phi,
lamb,
check=False,
set=True)
return res
例如,它不限制解决方案的范围。我 做了 注意到 this answer 但它只适用于单变量情况。那么知道如何在处理多个变量时为解集添加域限制吗?
您可以对符号声明假设并解决应该检查它们,例如:
In [12]: solve(x*(1-x))
Out[12]: [0, 1]
In [13]: x = Symbol('x', positive=True)
In [14]: solve(x*(1-x))
Out[14]: [1]
这适用于某些限制,但不适用于 x<y
这样的限制。但是,您可以 post-process solve:
In [6]: sol = [{x:1, y:2, z:3}, {x:1, y:0, z:4}, {x:3, y:2, z:1}]
In [7]: sol
Out[7]: [{x: 1, y: 2, z: 3}, {x: 1, y: 0, z: 4}, {x: 3, y: 2, z: 1}]
In [8]: cond = And(0 < x, x < z, 0 < y)
In [9]: cond
Out[9]: x > 0 ∧ y > 0 ∧ x < z
In [10]: cond.subs(sol[0])
Out[10]: True
In [11]: [s for s in sol if cond.subs(s)]
Out[11]: [{x: 1, y: 2, z: 3}]