2014-06-26 39 views
1

我正在尋找一種很好的方法來操作Matlab中的多元多項式。這個問題的目的是非常全球的。目前,我正在操作MATLAB中的多項式的矩陣(當前有2個變量)。爲了簡化此操作我每個矩陣分割成四個新的矩陣:操作多元多項式的最佳方式matlab

  • 一個用於限定所述係數:C
  • 一個用於限定指數:E(見下文)
  • 一個用於限定的功率第一可變XMX
  • 一個用於限定所述第二可變Y的拗造型:MY

因此,您可以通過這種方式評估多項式矩陣C./h^E.*X.^MX.*Y.^MY。出於某種原因,多項式矩陣的每個分量有時可能是一些單項式的和。在這種情況下,我使用了一些nD陣列(和sum(.,3))。

對於我的工作,我還需要定義關於XY的多項式矩陣的導數。使用先前的公式,可以通過將相關矩陣MXMY減去1並將C乘以右矩陣MXMY而容易地獲得衍生物。

目前這種方法適用於較低的程度,但我還需要乘以一些多項式矩陣,這是這種方法的大問題。爲了解決這個問題,我手動編寫完整的矩陣產品(使用Mathematica進行計算)。

我想擴展我的代碼以獲得更高的度數並更容易操作多項式矩陣。所以如果你有任何想法做到這一點。

我可以使用任何工具箱在Matlab但最後我需要有矩陣MXMYEC(我需要做一些具體計算這個分離矩陣)。我嘗試使用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'並提取CEMXMY(與H上述定義)和

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

回答

1

最後,我已發現一種解決方案。不幸的是(或不)我使用Symbolic Toolbox。在我的情況下,我考慮7個符號變量,多項式的變量是XY。 matlab變量poly是一個struct,其中包括字段pp是多項式的矩陣。

對於輸出參數,CEMXMY分別包括在polyOut.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