我想自动计算多项式的扩展,其中有变量(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中的术语顺序无关紧要,因为它们是以某种结构化方式排序的。
答案 0 :(得分:2)
来自不同术语的系数不重叠。第一个词p(1)*(c'*x)^1
在xi
和ci
中只有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
等于k
和M
的总和为multinomial coefficient。
对于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