0

我想自動計算存在變量(x1,x2,...)以及係數(c1,c2,...)的多項式的展開式。我的目標是計算p(1)*(c1*x1+c2*x2+...)^n+ ... + p(n)*(c1*x1+c2*x2+...)^n .多項式展開:分離多項式係數和x

正如您可以注意到的結果表達式可以寫成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中的術語排序並不重要,因爲它們是以某種結構化方式排序的。

回答

2

來自不同術語的係數不重疊。第一項,p(1)*(c'*x)^1,僅在xici等級中具有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,並Mmultinomial coefficient

對於m=3,n=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 
+0

感謝漂亮的答案。例如我的情況下g的權力是'[100,010,001,110,101,011,200,020,002]'。有沒有很好的方法來生成這種類型的矢量。對於任何'm'和'n'。 – YBE