【问题标题】:How to do interval arithmetic on sympy 1.3?如何在 sympy 1.3 上进行区间运算?
【发布时间】:2018-10-11 18:18:38
【问题描述】:

如何在 Sympy 1.3 中进行区间运算? (特别是加法和乘法)

例如,给定:

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

这两个间隔相加应该是Interval(0, 510)。 (加号运算符重载表示“并集”,因此 q1+q2 产生 Interval(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 中对区间进行加法和乘法?

【问题讨论】:

    标签: python sympy intervals


    【解决方案1】:

    Sympy 区间不执行区间算术。您在存储库中找到的函数是 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 目前是隐藏的,而且大多没有记录。

    【讨论】:

    • 没错。请注意,SymPy 集试图以与 Python 集相同的方式使用运算符重载,因此大多数操作不对应于区间算术。将区间(或其他 SymPy 集)嵌入到 SetExpr 中解决了这个问题。
    【解决方案2】:

    除了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)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-11
      • 2018-02-18
      相关资源
      最近更新 更多