2

Matlab で多変量多項式を操作する良い方法を探しています。この質問の目的は非常にグローバルです。現在、MATLAB でいくつかの多項式の行列を操作しています (現在 2 つの変数があります)。この操作を簡単にするために、各マトリックスを 4 つの新しいマトリックスに分割します。

  • 係数を定義するためのもの:C
  • 指数を定義するためのもの: E(以下を参照)
  • 最初の変数のべき乗を定義するためのものX:MX
  • 2 番目の変数のポーズを定義するためのものY:MY

したがって、この方法で多項式行列を評価できますC./h^E.*X.^MX.*Y.^MY。何らかの理由で、多項式行列の各コンポーネントがいくつかの単項式の和になることがあります。この場合、いくつかの nD 配列 (およびsum(.,3)) を使用します。

私の仕事では、Xまたはに関する多項式行列の導関数も定義する必要がありYます。前の定式化を使用すると、導関数は、関連付けられた行列に 1 を減算するか、右の行列MXまたはMYを掛けることによって簡単に取得できます。CMXMY

現在、このアプローチはより低い次数でうまく機能しますが、いくつかの多項式行列を乗算する必要もあり、これがこのアプローチの大きな問題です。この問題に対処するために、完全な行列積を手動で記述します (Mathematica を使用して計算します)。

コードをより高度に拡張し、多項式行列をより簡単に操作したいと考えています。したがって、これを行うアイデアがあれば。

Matlab の任意のツールボックスを使用できますが、最後に行列MXMYEおよびC(特定の計算を行うには、この分離された行列が必要です) が必要です。を使用してみましたSymbolic Toolboxが、多項式行列が複雑な場合、これら 4 つの行列を抽出するのは非常に難しいようです。

例:

    H=[
    1 0 Y/h 10*Y^2/h^2 5X*Y/h^2 0
    0 1 -X/h X/h 50*X^2/h^2 60*X*Y/h^2
    ]

    C=[
    1 0 1 10 5 0
    0 1 -1 1 50 60
    ]

    E=[
    0 0 1 2 2 0
    0 1 1 1 2 2
    ]

    MX=[
    0 0 0 0 1 0
    0 0 1 1 2 1
    ]

    MY=[
    0 0 1 2 1 0
    0 0 0 0 0 1
    ]

問題: 、、および(上記の定義を使用) およびを計算H*D'して抽出するCEMXMYH

    D=[
    Y/h Y^2/h^2 X/h 
    X/h Y/h X*Y/h
    ]
4

1 に答える 1

1

最後に、私は1つの解決策を見つけました。残念ながら(またはそうではない)私はSymbolic Toolbox. 私の場合、7 つのシンボリック変数を考慮し、多項式の変数はXYです。matlab 変数polystruct、フィールドを含むpです。psymfun多項式の行列です。

出力引数 、C、およびは、それぞれ、E、およびに含まれます。MXMYpolyOut.multpolyOut.exphpolyOut.expoXpolyOut.expoY

  %% Build the polynomial matrices
  function polyOut=buildPolyMat(poly)
  syms X Y real
  syms c11 c12 c21 c22 c33 real
  P=poly.p(X,Y);
  sizP=size(P);
  polyOut.mult=sym(zeros(sizP));
  polyOut.expoX=zeros(sizP);
  polyOut.expoY=zeros(sizP);
  %for each term of the polynomial matrix
  for it=1:prod(sizP)
      %polynomial
      pT=P(it);
      %read coeff and exponents
      [C,M]=coeffs(pT,[X,Y]);
      if ~isempty(C)
          %subscripts in matrix
          [sC,sR]=ind2sub(sizP,it);
          %exponents
          for iE=1:numel(C)
              eX=feval(symengine,'degree',M(iE),X);
              eY=feval(symengine,'degree',M(iE),Y);
              polyOut.mult(sC,sR,iE)=C(iE);
              polyOut.expoX(sC,sR,iE)=eX;
              polyOut.expoY(sC,sR,iE)=eY;
          end
      end
  end
  polyOut.exph=poly.eH*ones(size(polyOut.mult));
  %clean matrices with zeros multiplier
  Ind=(polyOut.mult==0);
  polyOut.expoX(Ind)=0;
  polyOut.expoY(Ind)=0;
  polyOut.exph(Ind)=0;
  end
于 2014-07-03T07:42:19.203 に答える