【问题标题】:Avoid sorting args in Python module Sympy避免在 Python 模块 Sympy 中对 args 进行排序
【发布时间】:2013-04-26 15:30:19
【问题描述】:

我目前正在开发一个differential operator for sympy,它可以以矩阵形式放置。 在这种情况下,创建Mul 对象时args 列表的顺序对于保证仅在需要的地方执行微分非常重要。

问题是,当完成以下操作时:

input = (t,z,x)
Mul(*input).args

它返回(t, x, z),因为args 中发生了一些重新排列。如何避免args被排序?

【问题讨论】:

标签: python math sympy differentiation automatic-differentiation


【解决方案1】:

为什么 arg 排序对于它的正确性很重要?

防止这种情况的唯一方法是将您的符号设置为不可交换的 (x = Symbol('x', commutative=False))。 SymPy 对象通过比较args 进行比较,因此要使x*y*z == y*x*z 起作用,必须对args 进行规范排序。已经有some attempts 在没有显式排序的情况下使其工作(主要是出于性能原因),但请注意,即使我们这样做了,也无法保证 arg 顺序,特别是如果您执行任何类型的操作表达方式。函数在 SymPy 中重建表达式是很常见的,这通常会使用原始的一些其他不相关的顺序。

【讨论】:

  • args 的顺序对于避免 Mul(*(r,D(z),z)(稍后要评估)成为 r*z*D(z) 很重要,因为在后者中,微分运算符 D(z) 将无法正确应用。
  • 我明白了。这是我在stackoverflow.com/a/15482872/161801(第一段)提到的基本问题。目前,没有办法控制 Mul 内部关于自定义乘法规则的情况。你能得到的最好的结果是你的操作员在乘以 * 时做正确的事情,并编写一个自定义函数来“完成工作”以应用其他方式的乘法。鉴于我在同一个答案中提到的关联性问题,您可能只需要使用后一种解决方案。
  • 就是这样!我用sympy.var('t, x, z', commutative=False) 为每个人做x = Symbol('x', commutative=False),现在args 没有被重新排列!谢谢!
  • Sage/Pynac 有什么不同?
猜你喜欢
  • 1970-01-01
  • 2013-12-01
  • 1970-01-01
  • 2016-01-10
  • 2023-03-02
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
相关资源
最近更新 更多