Mathematica一种实现多项式合并化简的方法

问题描述

当符号计算多项式涉及叠波、频谱分析等的时候,对如下多项式的简化

mathematica的Simplify或factor函数实现的形式并不是我们想要的,因为在计算机并不能识别你输入的公式符号变量的权重,它对所有变量一视同仁,导致最后的结果只是形式上的整理。实际上我们需要将多项式相同指数项选择性的合并操作,例如

而实际情况下在涉及复杂多项式的对应简化,人工手动选择逐一合并是不现实的,所以本文提出一个解决的方案。

解决方案

核心的函数是PotionIndex和映射定义1

首先将多项式逐项展开成列表形式:

1
2
p1expand = Expand[p1](* p1是如上需要被展开的多项式 *)
apply[list,p1expand]

有了以上的逐项展开式,我们可以分别对多项式的子项进行操作,由此,可以调用FirstCase函数并创建映射关系,提取列表的每一项的系数和指数信息,并将指数转换成系数矩阵的形式:
1
coefflist = FirstCase[#, Exp[b__] a_. :> {a, CoefficientList[ b, {x,c}, {}, {0}] & /@ p1list ;(*注意,这里e指数部分的多项式变量是x和c,只是简单示例,类似地,可以定义任意的底数*)

由于实际的多项式指数部分的可能只有常系数,所以转换来的系数矩阵可能是空集,因此我们需要把这部分空集去掉。
这里一开始要确定空集的位置:
1
nullindex = Position[coefflist, {}]

由此获得coefflist去除空集后的列表,进而得到去除空集的元素位置::
1
2
withoutnull = Cases[coefflist, Except[{}]];
index = PositionIndex[withoutnull[[;; , 2]]]

这里使用List结构和循环结构,分别计算系数项,e指数项以及常数项:

系数项:

1
coeff=Table[Simplify[withoutnull[[index[[i]], 1]] // Total], {i, 1,  Length[index]}];

指数项:
1
expon=Table[Simplify[Internal`FromCoefficientList[ withoutnull[[waveindex[[i]][[1]], 2]], {x,c}]]// Exp, {i, 1, Length[index]}]

常数项:
1
2
ct = 0;
Do[rt = ct + p1list[[nullindex[[i, 1]]]], {i, Length[nullindex]}]

最后只需要
1
poly=coeff.expon+rt;

即可得到最后的归并形式。

参考

1. 这是小憩片刻的思路