【问题标题】:How to Sum with conditions on Sympy?如何对 Sympy 的条件求和?
【发布时间】:2017-09-06 22:55:01
【问题描述】:

对不起,如果这听起来很愚蠢。我是 Sympy 的初学者,我真的很想克服这个问题。失败的。就这样吧:

如果我这样做,例如:

>>> i, j = Dummy('i'), Dummy('j')
>>> N = symbols('N')
>>> expr = Sum(KroneckerDelta(i,j), (i,0,N))
>>> expr.doit()

我明白了

Piecewise((1, And(0 <= _j ,_j <= N)), (0, otherwise))

这意味着在给定条件下会有两种不同的结果。 我的问题是:如果我先验地知道确实满足第一个条件(0

【问题讨论】:

    标签: python sympy


    【解决方案1】:

    我不确定您是否要问是否有一种方法可以定义 j 以便最终结果只是 1 或者您是否想知道如何使用您所知道的(j 是非负数且小于或等于 N) 以得到简化的结果。

    我不知道如何做前者,但后者可以做到。如果您知道条件为真,您可以在结果中使用它:

    >>> ans = expr.doit()
    

    天真的方法是尝试按照您看到的方式进行替换,记住 _j 就是 Dumm('j') 的表示方式:

    >>> ans.subs(And(0 <= j, j <= N), True)
    Piecewise((1, (0 <= _j) & (_j <= N)), (0, True))
    

    这没有任何作用,因为0 是一个python 整数,输入0 &lt; j 会将其变为j &gt; 0,并且无法识别替换。

    >>> 0 < j
    _j > 0
    

    您也可以尝试用一个值替换 j 以使其成为真的

    >>> ans.subs(j,0)
    Piecewise((1, 0 <= N), (0, True))
    

    但这失败了,因为 N 可能是正数或负数。如果你知道 N 是非负数,你可以在一开始就使用这个假设来创建它:

    >>> N = var('N', nonnegative=True)
    >>> expr = Sum(KroneckerDelta(i, j), (i, 0, N))
    >>> ans = expr.doit()
    >>> ans.subs(j, 0)
    1
    

    或者,您可以通过原子访问您知道为 True 的确切表达式。您知道为真的条件是 And。我们可以得到一组所有出现在ans中的Ands

    >>> ans.atoms(Ans)
    set([(0 <= _j) & (_j <= N)])
    

    只有这个,所以我们只需从集合中弹出它并在ans中将其替换为True:

    >>> ans.subs(_.pop(), True)
    1
    

    (如果有超过 1 个原子,则必须将集合转换为列表并使用索引来选择您感兴趣的原子。)

    【讨论】:

    • 我确实是当场询问您的回答。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多