Как сделать интервальную арифметику на симпее 1.3? - PullRequest
0 голосов
/ 11 октября 2018

Как мне сделать интервальную арифметику в Sympy 1.3?(в частности, сложение и умножение)

Например, задано:

q1 = Interval(0,255)
q2 = Interval(0,255)

Сложение этих двух интервалов должно составлять Interval(0, 510).(Оператор «плюс» перегружен, что означает «объединение», поэтому q1 + q2 дает интервал (0,255).)

Если я попытаюсь Add(q1, q2), я получу исключение:

  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/sympy/core/cache.py", line 93, in wrapper
    retval = cfunc(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/sympy/core/compatibility.py", line 850, in wrapper
    result = user_function(*args, **kwds)
  File "/usr/local/lib/python2.7/dist-packages/sympy/core/operations.py", line 45, in __new__
    c_part, nc_part, order_symbols = cls.flatten(args)
  File "/usr/local/lib/python2.7/dist-packages/sympy/core/add.py", line 223, in flatten
    newseq.append(Mul(c, s))
  File "/usr/local/lib/python2.7/dist-packages/sympy/core/cache.py", line 93, in wrapper
    retval = cfunc(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/sympy/core/compatibility.py", line 850, in wrapper
    result = user_function(*args, **kwds)
  File "/usr/local/lib/python2.7/dist-packages/sympy/core/operations.py", line 45, in __new__
    c_part, nc_part, order_symbols = cls.flatten(args)
  File "/usr/local/lib/python2.7/dist-packages/sympy/core/mul.py", line 186, in flatten
    r, b = b.as_coeff_Mul()
AttributeError: 'Interval' object has no attribute 'as_coeff_Mul'

(Я получаю аналогичное исключение для Mul).

Тем не менее, код для добавления двух интервалов, кажется, находится здесь: https://github.com/sympy/sympy/blob/sympy-1.3/sympy/sets/handlers/add.py#L22

Но механизм диспетчера, похоже, неловить случай Interval + Interval.

Как сделать сложение и умножение на интервалах в sympy?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

В дополнение к SetExpr(Interval(...)) вы также можете использовать AccumBounds, который является более старым и первоначально предназначался для ответа на «найти предел f», где f - осциллирующая функция.Что касается арифметики, то она работает примерно так же:

AccumBounds(3, 5) + AccumBounds(2, 8)  #  AccumBounds(5, 13)
AccumBounds(-2, 5) * AccumBounds(2, 8)  #  AccumBounds(-16, 40)

, но есть некоторые интервальные вычисления, в которых реализация AccumBounds является более полной.

sin(AccumBounds(0, 3))  #  AccumBounds(0, 1)
sin(SetExpr(Interval(0, 3)))  #  SetExpr(ImageSet(Lambda(x, sin(x)), Interval(0, 3)))
0 голосов
/ 11 октября 2018

Интервалы Симпи не выполняют интервальную арифметику.Функция, которую вы нашли в репозитории, является одним из обработчиков для sympy.sets.setexpr.SetExpr, типа выражения, который принимает значения в данном наборе:

from sympy import Interval
from sympy.sets.setexpr import SetExpr

q1 = SetExpr(Interval(0, 255))
q2 = SetExpr(Interval(0, 255))

result = q1 + q2

SetExpr в настоящее время скрыто и в основном не документировано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...