Ограничение домена набора решений при использовании SymPy решить в случае нескольких переменных - PullRequest
1 голос
/ 26 мая 2019

Скажите, я пытаюсь решить систему уравнений:

enter image description here

для θ, λ и ɸ, где a, b, c и d - комплексные числа, а матрица на LHS - унитарная матрица.

Код SymPy , который у меня под рукой, успешно справляется с работой, но есть несколько крайних случаев, которые он пропускает.

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

Например, он не ограничивает диапазон решений. Я сделал заметил этот ответ , но он работает только для случаев с одной переменной. Итак, есть идеи, как добавить ограничения домена для набора решений при работе с несколькими переменными?

1 Ответ

0 голосов
/ 27 мая 2019

Вы можете объявить предположения относительно символов и решить их следует проверить, например:

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.Тем не менее, вы можете постобработать вывод решения:

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}]
...