Серийные показатели сортировки Тейлора - PullRequest
0 голосов
/ 01 мая 2018

У меня есть код MATLAB, который генерирует показатель общего ряда Тейлора функции с тремя переменными 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.

1 Ответ

0 голосов
/ 01 мая 2018

Я считаю, что следующие правила заказа должны дать вам то, что вы хотите.

В порядке старшинства ...

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

P.S. Я не уверен, насколько хорошо это обобщает на более высокий порядок или больше переменных. Я пытался помнить об этом при создании решения, но не тестировал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...