2

我正在寻找一种在 Matlab 中操作多元多项式的好方法。这个问题的目的是非常全球化的。目前,我正在 MATLAB 中处理一些多项式矩阵(目前有 2 个变量)。为了简化这种操作,我将每个矩阵拆分为四个新矩阵:

  • 一种用于定义系数:C
  • 一个用于定义指数:(E见下文)
  • 一个用于定义第一个变量的幂XMX
  • 一个用于定义第二个变量的装腔作势者YMY

因此,您可以通过这种方式评估多项式矩阵C./h^E.*X.^MX.*Y.^MY。出于某种原因,有时多项式矩阵的每个分量都可以是一些单项式的和。在这种情况下,我使用了一些 nD 数组(和sum(.,3))。

对于我的工作,我还需要定义多项式矩阵关于Xor的导数Y。使用前面的公式,可以很容易地通过将相关矩阵减去 1MXMY乘以C右矩阵MX或来获得导数MY

目前这种方法适用于较低的度数,但我还需要乘以一些多项式矩阵,这是这种方法的大问题。为了解决这个问题,我手动编写了完整的矩阵乘积(使用 Mathematica 计算)。

我想将我的代码扩展为更高的度数并更轻松地操作多项式矩阵。因此,如果您有任何想法这样做。

我可以在 Matlab 中使用任何工具箱,但最后我需要有矩阵MX、、MYEC我需要这个分离的矩阵来进行一些特定的计算)。我尝试使用,Symbolic Toolbox但是当多项式矩阵很复杂时,提取这四个矩阵似乎非常困难。

例子:

    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'和提取C, E,MXMY(使用H上面的定义)和

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

1 回答 1

1

最后我找到了一个解决方案。不幸的是(或没有)我使用Symbolic Toolbox. 在我的例子中,我考虑了 7 个符号变量,多项式的变量是XY。matlab 变量poly是一个struct包含字段的变量ppsymfun多项式矩阵。

对于输出参数,、C和分别包含在、和中。EMXMYpolyOut.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 回答