多项式展开:分离多项式系数和x

时间:2013-11-23 00:49:48

标签: matlab polynomial-math symbolic-math binomial-coefficients

我想自动计算多项式的扩展,其中有变量(x1,x2,...)以及系数(c1,c2,...)。我的目标是计算p(1)*(c1*x1+c2*x2+...)^n+ ... + p(n)*(c1*x1+c2*x2+...)^n .

您可以注意到,结果表达式可以写为F(x1,x2...)*g(c1,c2,...) [其中F是行矩阵,g是列矩阵],即系数和变量之间存在一些乘法解耦。

现在我使用MATLAB符号工具箱并通过手动检查生成的符号扩展来构造F和g。这不是很可行,因为n很大并且c=(c1,c2,...)太大,有太多的术语,并且不再可能手动。例如(c1*x1+c2*x2+c3)n=2,我想要的是跟随。

>> p=[2 5]

p =

     2     5

>> syms c1 c2 c3
>> syms x1 x2
>> expression= p(1)*(c1*x1+c2*x2+c3)^2 + p(2)*(c1*x1+c2*x2+c3);
>> expand(expression)

ans =

2*c1^2*x1^2 + 4*c1*c2*x1*x2 + 4*c1*c3*x1 + 5*c1*x1 + 2*c2^2*x2^2 + 4*c2*c3*x2 + 5*c2*x2 + 2*c3^2 + 5*c3

>> F=[5*x1 5*x2 5 4*x1*x2 4*x1 4*x2 2*x1^2 2*x2^2 2]

F =

[ 5*x1, 5*x2, 5, 4*x1*x2, 4*x1, 4*x2, 2*x1^2, 2*x2^2, 2]

>> g=[c1 c2 c3 c1*c2 c1*c3 c2*c3 c1^2 c2^2 c3^2].'

g =

    c1
    c2
    c3
 c1*c2
 c1*c3
 c2*c3
  c1^2
  c2^2
  c3^2

>> expand(F*g)

ans =

2*c1^2*x1^2 + 4*c1*c2*x1*x2 + 4*c1*c3*x1 + 5*c1*x1 + 2*c2^2*x2^2 + 4*c2*c3*x2 + 5*c2*x2 + 2*c3^2 + 5*c3

我找到了以下question,看起来可能有办法使用conv等自动完成。如果有人可以提出自动化解决方案(或者至少有一些想法对于x=(x1,x2) and c=(c1,c2,c3) and n=2的情况,如上所述;我想我可以将它推广到更高维度的情况。

注意:F或g中的术语顺序无关紧要,因为它们是以某种结构化方式排序的。

1 个答案:

答案 0 :(得分:2)

来自不同术语的系数不重叠。第一个词p(1)*(c'*x)^1xici中只有1个学位,依此类推。因此,它成为一次计算一个术语的系数的问题。

那也有一个“简单”的表达方式:

p(k)*(c'*x)^k = sum(i1,..,im>=0 with sum(i_)=k) 
    M(k;i1,..,im)*x1^i1*...*xm^im * c1^i1*...*cm^im

其中总和使得所有i等于kM的总和为multinomial coefficient

对于m=3n=2i将按您的示例顺序排列:110,101,011,200,020,002。 M(2; 110)= 2所以第一项是'p(2)* M(2; 110)* x1 * x2 = 4 * x1 * x2'。

你的F和g术语是:

F(...) = p(k)*M(k;i1,..,im)*x1^i1*...*xm^im
g(...) = c1^i1*...*cm^im