【发布时间】:2014-03-28 03:51:38
【问题描述】:
在 sympy 中分布在加法上的乘法似乎没有计算乘法。
我创建了sympy.Symbol 的子类,它知道如何将自己与其他事物相乘。作为一个最小的工作示例,让我们假设子类只是吃掉乘以它的任何东西:
from sympy import *
class Gobbler(Symbol):
_op_priority = 1.0e200
def __mul__(self, other):
return Gobbler('gob('+self.name+'*'+str(other)+')')
def __rmul__(self, other):
return Gobbler('gob('+self.name+'*'+str(other)+')')
x = Gobbler('x')
y = Gobbler('y')
a = Symbol('a')
b = Symbol('b')
[是的,_op_priority 太荒谬了。但是将其更改为更可观的数字 ~10.0 并没有改变任何东西。] 我可以运行
>>> x*a
gob(x*a)
>>> x*a + y*a
gob(x*a) + gob(y*a)
一切都很自然,直到我开始
>>> expand((x+y)*a)
x*a + y*a
为什么这些不被吞噬?!结果看起来和我在上一个提示中输入的完全一样,但是什么也没发生。
Gobblers 现在是 Muls 中的因子,其中两个是 Add 中的术语。那么我怎样才能让那些Muls 评估呢?我已经尝试了simplify、expand 等的所有组合,以及我能想到的所有选项组合。但没有什么能让这些去任何地方。我什至可以用.args[0] 提取总和的前半部分并尝试简化/扩展它。没什么!
更糟糕的是,我的实际用例涉及很多嵌套表达式,例如
>>> b*expand((x+y)*a)
b*(x*a + y*a)
发生了什么事?我怎样才能让它工作?神奇的词是什么?
【问题讨论】: