0

我想自动计算有变量(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)and 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

我发现了以下问题,看起来可能有一种方法可以使用convetc 自动完成。如果有人可以针对这种情况提出自动化解决方案(或至少对这种自动化有一些想法),x=(x1,x2) and c=(c1,c2,c3) and n=2上面描述的情况; 我想我可以将其推广到更高维的情况。

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

4

1 回答 1

2

不同项的系数不重叠。第一项 ,p(1)*(c'*x)^1仅在xi和中具有 1 次项ci,依此类推。因此,它变成了一次计算一项的系数的问题。

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

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等于k,并且M多项式系数

对于m=3, n=2,i将按照您的示例的顺序: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
于 2013-11-23T11:33:52.230 回答