【问题标题】:Sympy, is it possible to force a class to stay on the left or on the right side of the expressionSympy,是否可以强制一个类留在表达式的左侧或右侧
【发布时间】:2013-06-05 12:51:04
【问题描述】:

this answer 中解释了如何避免args 在诸如MulAdd 等SymPy 类中排序。

对于新创建的类like this one explained here,当乘以sympy.core.numbers.Floatsympy.core.numbers.Pisympy.core.numbers.Integer 时,它可以转到右侧,例如,给出:

print D(x) * 1.
1.0*D(x)

原始表达式在计算时给出0.,而新表达式给出D(x)

为了让这个微分算子正常工作,它必须保持在左侧:

print D(x) * 1.
D(x)*1.0

是否有任何隐藏参数,例如 _op_priority 用于更改 __mul__() 优先级,告诉 SymPy 更靠左或靠右的类型?

【问题讨论】:

  • 这个问题本身没问题,但如果你用它来创建一个微分运算符对象,你可能做错了。首先,对微分运算符使用乘法是对符号的不一致滥用。另外这种方法不能清楚地表示嵌套的微分​​算子或常数和微分算子之和等。而且微分算子已经在diffgeom模块中实现。
  • 感谢您的评论!我在使用这个微分运算符时遇到了很多问题,但到目前为止它一直在工作。你知道如何强制给定类在 SymPy 中保持在左侧/右侧吗?
  • 我不知道足够的细节来写这个作为答案,但你可以尝试使用commutative=False。我真的不喜欢这种方法,并希望在未来的 sympy 版本中将其删除(没有这样的计划),但如果您知道自己在做什么,请继续尝试。
  • “左侧”和“右侧”是什么意思?
  • @asmeurer 我更新了这个问题。如果您有任何其他问题,请告诉我...

标签: python expression sympy symbolic-math symbolic-computation


【解决方案1】:

Mul 的乘法并不像您期望的那样工作。

首先,打印顺序与任何事情无关。如果这就是您所关心的,您可以通过修改打印机来更改它。

您应该查看对象的.args。但即使在这里,这也无所谓。当您将某物乘以乘法时,它不会按照看到的顺序“应用”每个乘法。相反,它会创建一个新的 Mul 对象,其中包含所有 args 组合(可以肯定的是,在 commutative=False 的情况下,args 保持有序)。 Mul 不会对这些对象调用任何特殊的子方法。这是我们想要的功能(参见https://code.google.com/p/sympy/issues/detail?q=1941&id=1941https://github.com/sympy/sympy/wiki/Canonicalization),但目前还没有完成。

【讨论】:

    猜你喜欢
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    相关资源
    最近更新 更多