SymPy: как работать с Union и ImageSet - PullRequest
0 голосов
/ 07 октября 2019

Я новичок в SymPy и solveset. Я ищу особенность выражения и для этого я решаю знаменатель. После этого я хочу использовать результаты для дальнейших вычислений, чтобы сгенерировать код, который имеет дело со случаями сингулярности.

Возвращение дайверов «решает» между различными уравнениями. В моем случае до сих пор:

  • sets.FiniteSet
  • sets.Union

В то время как FiniteSet может использоваться непосредственно с циклами for,Union не может.

Например:

sol = Union(ImageSet(Lambda(_n, 2*_n*pi + pi/2), Integers), ImageSet(Lambda(_n, 2*_n*pi + 3*pi/2), Integers))

Если поместить это в цикл (for s in sol:), цикл никогда не закончится. Так что это бесполезно. sol.is_interval приводит к False, в то время как я ожидаю True.

Обратите внимание на следующий пример, который обнаруживает недопустимый ввод:

def fun(x):
    if (x+pi/2)%pi == 0:
        print('Detect a not allowed input.')

где условие ifдолжен быть получен из решения sol сверху.

  1. Как определить, имеет ли Union конечное или бесконечное число элементов?
  2. И как получить одно выражениечто можно использовать за пределами этого мира сетов?

Эта таблица объясняет, что я хочу сделать:

enter image description here

Темно-синяя часть с левой стороны является генератором кода светло-голубой части с правой стороны, который может быть другим языком программирования, который не способен обрабатывать такие вещи, как бесконечность или деление на ноль. Синюю часть, которую я собираюсь реализовать.

В настоящее время я остановился на блоке «Генерация обработки Singularity», потому что Set и особенно Union хороши для печати, но сложны, если не бесполезны. для дальнейшей обработки.

Я пытался задействовать solveset из-за утверждения в документации SymPy , что "рано или поздно, решающий набор данных переходит к решению, внутреннему или внешнему". Что касается моего заявления, я надеюсь, этого не произойдет. Может быть, я не совсем понял механизм sets.

Примечания:

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

1 Ответ

0 голосов
/ 07 октября 2019

Ваши конкретные вопросы 1 и 2 являются хорошими вопросами, на которые я не думаю, что у SymPy (пока) есть ответ.

Хотя я постараюсь ответить на другую часть. Если я правильно понимаю, ваша функция fun предназначена для отклонения решений x, где (x+pi/2)%pi == 0. Еще один способ указать, что вы хотите исключить решения вида x = n*pi + pi/2 для целых чисел n. Мы можем выразить это как набор и затем исключить его из результата executeset:

In [7]: _n = Symbol('_n', integer=True)                                                                                                                       

In [8]: sol = Union(ImageSet(Lambda(_n, 2*_n*pi + pi/2), Integers), ImageSet(Lambda(_n, 2*_n*pi + 3*pi/2), Integers))                                         

In [9]: sol                                                                                                                                                   
Out[9]: 
⎧         π         ⎫   ⎧         3⋅π         ⎫
⎨2⋅π⋅_n + ─ | _n ∊ ℤ⎬ ∪ ⎨2⋅π⋅_n + ─── | _n ∊ ℤ⎬
⎩         2         ⎭   ⎩          2          ⎭

In [10]: exclude = ImageSet(Lambda(_n, _n*pi + pi/2), Integers)                                                                                               

In [11]: exclude                                                                                                                                              
Out[11]: 
⎧       π         ⎫
⎨π⋅_n + ─ | _n ∊ ℤ⎬
⎩       2         ⎭

In [12]: sol - exclude                                                                                                                                        
Out[12]: 
⎛⎧         π         ⎫   ⎧       π         ⎫⎞   ⎛⎧         3⋅π         ⎫   ⎧       π         ⎫⎞
⎜⎨2⋅π⋅_n + ─ | _n ∊ ℤ⎬ \ ⎨π⋅_n + ─ | _n ∊ ℤ⎬⎟ ∪ ⎜⎨2⋅π⋅_n + ─── | _n ∊ ℤ⎬ \ ⎨π⋅_n + ─ | _n ∊ ℤ⎬⎟
⎝⎩         2         ⎭   ⎩       2         ⎭⎠   ⎝⎩          2          ⎭   ⎩       2         ⎭⎠

К сожалению, на этом этапе SymPy на самом деле не упрощает вещи так, как должно (а simplify не делаетПомогите). В идеале sol в первую очередь упростится до exclude, так что вычитание этих двух значений даст пустой набор, но я думаю, что это еще не реализовано ...

...