You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SymPy中定义点积函数与规则并实现展开化简?求替代方案

在SymPy中自定义点积运算规则实现表达式展开与化简,以及替代工具推荐

一、SymPy中的实现方案

方案1:模式匹配循环替换

你已经定义了点积函数和基本规则,接下来可以通过通配符模式匹配结合循环替换,让规则自动应用到表达式上,直到无法再化简:

from sympy import symbols, Eq, function, Wild

a, b, c, d = symbols("a b c d")
dot = function("dot")

# 定义通用匹配规则(用通配符适配任意表达式)
x, y, z = Wild('x'), Wild('y'), Wild('z')
# 分配律规则
dist_rule = Eq(dot(x + y, z), dot(x, z) + dot(y, z))
# 交换律规则
comm_rule = Eq(dot(x, y), dot(y, x))

# 测试表达式
expr = dot(a + b, c + d)

# 循环应用规则直到表达式不再变化
while True:
    new_expr = expr.replace(comm_rule).replace(dist_rule)
    if new_expr == expr:
        break
    expr = new_expr

print(expr)  # 输出: dot(a, c) + dot(a, d) + dot(b, c) + dot(b, d)

方案2:自定义点积类(更原生的集成)

如果希望点积能和SymPy的expand等内置函数无缝配合,可以继承SymPy的Basic类,重载构造和展开逻辑:

from sympy import symbols, Basic, expand

class Dot(Basic):
    def __new__(cls, left, right):
        # 构造时自动应用交换律(按符号排序避免重复项)
        if hasattr(left, 'sort_key') and hasattr(right, 'sort_key'):
            if left.sort_key() > right.sort_key():
                left, right = right, left
        return super().__new__(cls, left, right)
    
    def expand(self, **hints):
        # 展开时应用分配律
        left, right = self.args
        if left.is_Add:
            return sum(Dot(term, right) for term in left.args)
        if right.is_Add:
            return sum(Dot(left, term) for term in right.args)
        return self

# 测试使用
a, b, c, d = symbols("a b c d")
expr = Dot(a + b, c + d)
print(expand(expr))  # 输出: Dot(a, c) + Dot(a, d) + Dot(b, c) + Dot(b, d)

这种方式下,调用expand()就能自动处理点积的展开,体验更接近SymPy原生运算。

二、替代工具推荐

如果SymPy的自定义方式不够灵活,以下工具更适合处理这类自定义代数运算:

  • SageMath:内置丰富的代数结构支持,可直接定义内积空间,点积的展开、化简规则可以通过代数系统自动处理,无需手动写匹配逻辑。
  • Mathematica:通过UpValues或模式定义实现自定义运算规则,比如Dot[x_ + y_, z_] := Dot[x, z] + Dot[y, z],规则会自动应用到所有匹配的表达式,模式匹配能力极强。
  • Mathics:开源的Mathematica兼容工具,支持相同的模式定义语法,适合需要免费开源方案的场景。

内容的提问来源于stack exchange,提问作者QT-1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 11:52:43