wolfram-mathematica - Mathematica 中表达式开头的非交换乘法和负系数

标签 wolfram-mathematica

在一些非常亲切的 stackoverflow 贡献者的帮助下 in this post , 我对 NonCommutativeMultiply (**) 有了以下新定义在数学中:
Unprotect[NonCommutativeMultiply];
ClearAll[NonCommutativeMultiply]
NonCommutativeMultiply[] := 1
NonCommutativeMultiply[___, 0, ___] := 0
NonCommutativeMultiply[a___, 1, b___] := a ** b
NonCommutativeMultiply[a___, i_Integer, b___] := i*a ** b
NonCommutativeMultiply[a_] := a
c___ ** Subscript[a_, i_] ** Subscript[b_, j_] ** d___ /; i > j :=
c ** Subscript[b, j] ** Subscript[a, i] ** d
SetAttributes[NonCommutativeMultiply, {OneIdentity, Flat}]
Protect[NonCommutativeMultiply];

这种乘法很棒,但是,它不处理表达式开头的负值,即,a**b**c + (-q)**c**a应该简化为a**b**c - q**c**a它不会。

在我的乘法中,变量 q (和任何整数缩放器)是可交换的;我还在尝试写一个 SetCommutative功能,没有成功。我并不急需SetCommutative ,那就太好了。

如果我能够拉出所有 q's 也会有帮助。到每个表达式的开头,即:a**b**c + a**b**q**c**a应该简化为:a**b**c + q**a**b**c**a同样,将这两个问题结合起来:a**b**c + a**c**(-q)**b应该简化为:a**b**c - q**a**c**b
目前我想弄清楚如何处理表达式开头的这些负变量以及如何拉出q's(-q)'s到前面如上。我已经尝试使用 ReplaceRepeated (\\.) 来处理这里提到的两个问题。 ,但到目前为止我还没有成功。

欢迎所有想法,谢谢...

最佳答案

这样做的关键是要意识到 Mathematica 代表 a-ba+((-1)*b) ,正如你所看到的

In[1]= FullForm[a-b]
Out[2]= Plus[a,Times[-1,b]]

对于问题的第一部分,您所要做的就是添加以下规则:
NonCommutativeMultiply[Times[-1, a_], b__] := - a ** b

或者您甚至可以从任何位置捕捉标志:
NonCommutativeMultiply[a___, Times[-1, b_], c___] := - a ** b ** c

更新——第 2 部分。将标量放在前面的一般问题是模式 _Integer在您当前的规则中,只会发现明显是整数的东西。它甚至不会发现 q是结构中的整数,如 Assuming[{Element[q, Integers]}, a**q**b] .
为了实现这一点,您需要检查假设,将这个过程放入全局转换表中的成本可能很高。相反,我会编写一个可以手动应用的转换函数(并且可能从全局表中删除当前规则)。像这样的事情可能会奏效:
NCMScalarReduce[e_] := e //.  {
    NonCommutativeMultiply[a___, i_ /; Simplify@Element[i, Reals],b___] 
    :> i a ** b
}

上面使用的规则使用 Simplify显式查询假设,您可以通过分配给 $Assumptions 来全局设置这些假设或在本地使用 Assuming :
Assuming[{q \[Element] Reals},
  NCMScalarReduce[c ** (-q) ** c]] 

返回 -q c**c .

HTH

关于wolfram-mathematica - Mathematica 中表达式开头的非交换乘法和负系数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5038338/

相关文章:

graphics - 在 Mathematica 中排列和显示网格的各个部分

wolfram-mathematica - Mathematica 8.0 使用 HTTP POST 和 XML 与 Web 服务器 JSP 交互

wolfram-mathematica - Mathematica 溢出 [] 错误 : Why and how-to bypass?

layout - Mathematica 中的 2 列文档

wolfram-mathematica - 在 Mathematica 中使用 f@expr 和 expr//f 的不同结果

wolfram-mathematica - 数学 : Getting rid of the "x ->" in FindInstance results

Mathematica 不计算具有实系数的复数的绝对值

wolfram-mathematica - 简单的功率计数

wolfram-mathematica - 系数方程列表/矩阵(方程组)

wolfram-mathematica - 在 Mathematica 中根据相似元素顺序组合子列表