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 を構築しています。c=(c1,c2,...)n が大きくて大きすぎる場合、項が多すぎて手動では不可能になるため、これはあまり実現可能ではありません。たとえば(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

次の質問を見つけました。などを使用して自動的に行う方法があるようです。上記のconv場合の自動化されたソリューション(またはそのような自動化に向けた少なくともいくつかのアイデア)を思いつくことができるx=(x1,x2) and c=(c1,c2,c3) and n=2場合; 高次元の場合に一般化できると思います。

注: F または g の項の順序は、構造化された方法で順序付けられている場合、問題ではありません。

4

1 に答える 1

2

異なる項の係数は重複しません。最初の項 は、とp(1)*(c'*x)^1の次数が 1 の項のみを持ち、以下同様です。そのため、一度に 1 つの項の係数を計算することが問題になります。xici

それもまた「単純な」表現を持っています:

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あり、多項係数です。

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
于 2013-11-23T11:33:52.230 に答える