我有一个MATLAB代码,它生成3变量函数f(x,y,z)的一般泰勒级数的指数。在下面的例子中,我正在计算3阶泰勒级数。
order = 3;
nTuple = 3;
allExponents = [];
for n = 1 : order
[~,x] = nsumk(nTuple, n); % nsumk can be downloaded from: https://www.mathworks.com/matlabcentral/fileexchange/28340-nsumk
allExponents = [allExponents; x]
end
该函数生成以下系数:
0 0 1 % This means z with exponent 1; x and y with zero exponent.
0 1 0 % This means y with exponent 1; x and z with zero exponent.
1 0 0 % This means x with exponent 1; y and z with zero exponent.
0 0 2
0 1 1
0 2 0
1 0 1
1 1 0
2 0 0
0 0 3
0 1 2
0 2 1 % This means x with exponent 0, y with exponent 2 and z with exponent 1, i,e, y^2*z
0 3 0
1 0 2
1 1 1
1 2 0
2 0 1
2 1 0 % This means x with exponent 2 and y with exponent 1 and z with exponent 0, i,e, x^2*y
3 0 0
如何按以下形式对它们进行排序(为清晰起见,它们之间的空行):
1 0 0 % x
0 1 0 % y
0 0 1 % z
2 0 0 % x^2
0 2 0 % y^2
0 0 2 % z^2
3 0 0 % x^3
0 3 0 % y^3
0 0 3 % z^3
1 1 0 % x*y
1 0 1 % x*z
0 1 1 % y*z
1 2 0 % x*y^2
1 0 2 % x*z^2
0 1 2 % y*z^2
2 1 0 % x^2*y
2 0 1 % x^2*z
0 2 1 % y^2*z
1 1 1 % x*y*z
更新: 订购如下:
首先是x ^ n,y ^ n,z ^ n,其中n是从1到泰勒级数的阶数,在这个特定的例子中3.
然后,每个两个变量的交叉乘法,其指数加到2,例如xy,xz和yz。
然后,每个两个变量的交叉乘法,其指数加上3,第一个变量具有指数1,即xy ^ 2,xz ^ 2,yz ^ 2。
然后,每个两个变量的交叉乘法,其指数加上3,其中第一个变量具有指数2,即x ^ 2y,x ^ 2z,y ^ 2z。
最后,将指数加到3的所有三个变量相乘,即xyz。
答案 0 :(得分:3)
我相信以下订购规则应该能满足您的需求。
按优先顺序......
实施这些规则有点乱,但这是代码。
% 1.
num_vars = sum(allExponents~=0, 2);
% 2.
order = sum(allExponents, 2);
% 3. Implemented by pushing all zero-elements to end of the row
[~,j] = sort(allExponents == 0, 2);
[i,~] = ndgrid(1:size(allExponents, 1), 1:nTuple);
sub = sub2ind(size(allExponents), i, j);
squeezed = reshape(allExponents(sub), size(allExponents));
% 4.
lex = allExponents == 0;
% Construct a key and sort
sort_term = [num_vars, order, squeezed, lex];
[~, idx] = sortrows(sort_term);
allExponents = allExponents(idx,:);
P.S。我不确定这对于更高阶或更多变量的推广有多好。在构建解决方案时我试图记住这一点,但我没有测试。