如何在 sympy 1.3 上进行区间运算?
How to do interval arithmetic on sympy 1.3?
如何在 Sympy 1.3 中进行区间运算? (具体来说,加法和乘法)
例如,给定:
q1 = Interval(0,255)
q2 = Interval(0,255)
这两个区间相加应该是Interval(0, 510)
。 (加号运算符重载表示 "union",因此 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
但是dispatcher机制好像没有捕捉到Interval + Interval的情况。
如何在 sympy 中对区间进行加法和乘法?
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
目前处于隐藏状态,大部分未记录。
除了 SetExpr(Interval(...))
之外,您还可以使用 AccumBounds
,它较旧,最初旨在回答 "find the limit of 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)))
如何在 Sympy 1.3 中进行区间运算? (具体来说,加法和乘法)
例如,给定:
q1 = Interval(0,255)
q2 = Interval(0,255)
这两个区间相加应该是Interval(0, 510)
。 (加号运算符重载表示 "union",因此 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
但是dispatcher机制好像没有捕捉到Interval + Interval的情况。
如何在 sympy 中对区间进行加法和乘法?
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
目前处于隐藏状态,大部分未记录。
除了 SetExpr(Interval(...))
之外,您还可以使用 AccumBounds
,它较旧,最初旨在回答 "find the limit of 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)))