【问题标题】:Taylor Series Sorting Exponents泰勒级数排序指数
【发布时间】:2018-05-01 11:33:57
【问题描述】:

我有一个 MATLAB 代码,它生成一个 3 变量函数 f(x, y, z) 的一般泰勒级数的指数。在下面的示例中,我正在计算三阶泰勒级数。

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。

【问题讨论】:

    标签: matlab sorting


    【解决方案1】:

    我相信以下订购规则应该可以满足您的需求。

    按优先顺序...

    1. 按存在的变量数(非零幂数)降序。
    2. 按项的顺序(幂和)降序。
    3. 非零幂的字典顺序。
    4. 存在的变量的字典顺序。

    实现这些规则有点混乱,但这里是代码。

    % 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,:);
    

    附:我不确定这对更高阶或更多变量的推广效果如何。我在构建解决方案时试图牢记这一点,但我没有进行测试。

    【讨论】:

    • 太棒了。我学到了一些非常有用的东西!谢谢@jodag!
    • 您能否向我推荐一个文档(或任何其他在线材料),以便我可以了解更多关于您巧妙提出的方法的信息?谢谢。
    • 我不确定是否有任何文档,但主要思想是创建与每一行关联的sort_term 或“键”。构造键以便按键排序产生所需的顺序。由于我们有多个规则,因此我们用多个子密钥构造密钥,其中优先级通过从左到右连接子密钥来形成最终密钥。在比较两行时,sortrows 只会在较高优先级(更左)列相同时考虑较低优先级列(子键)。
    猜你喜欢
    • 2014-04-03
    • 2017-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2017-08-21
    • 2011-11-04
    相关资源
    最近更新 更多