функция детей разбивает выражения в Matlab неоднозначно - PullRequest
0 голосов
/ 27 апреля 2018

Набор символов Matlab дает неоднозначные ответы относительно функции children . Предположим следующие примеры:

>> syms a b
>> children(a+b)
  ans = [ a, b]
>> children(a*b)
  ans = [ a, b]
>> children(a^b)
  ans = [ a, b]

Функция разбивает различные выражения на один и тот же ответ, и, что еще хуже, Matlab не дает никаких намеков на то, какой тип разделения он сделал. Таким образом, нужно точно знать конкатенацию входных данных, чтобы сделать вывод о том, как была применена функция детей. Есть ли способ применить что-то вроде функции children, которая позволяет узнать, как был разделен термин?

1 Ответ

0 голосов
/ 27 апреля 2018

Наивным обходным решением будет функция, которая улучшает функцию детей в matlab. Следующее может работать, но есть вероятность, что не все случаи покрыты. Я открыт для улучшений в этом:

function [childs, issum, isprod, ispow, isfun] = children2(parent)
%CHILDREN2 Returns the children plus meta info. of math. concatenation
% Author: tkorthals@cit-ec.uni-bielefeld.de
% Input
%  parent                   Symbolic expression
% Output
%  childs                   Vector of symbolic expression
%  issum                    True if parent is sum of children
%  isprod                   True if parent is product of children
%  ispow                    True if parent is power of children
%  isfun                    True if parent is some function's argument

childs = children(parent);
issum = false; isprod = false; ispow = false; isfun = false;

if numel(childs) == 1
    if ~isequaln(childs,parent) % functions were removed
        isfun = true;
    end
    return
end

if numel(childs) == 2
    if isequaln(childs(1)^childs(2),parent) % pow
        ispow = true;
        return
    elseif isequaln(childs(1)/childs(2),parent) % div
        childs = parent;
        return
    end
end

if isequaln(prod(childs),parent) % prod
    isprod = true;
    return
end

if isequaln(sum(childs),parent) % sum
    issum = true;
    return
end

error('children2: Undefined behaviour for more than two children')

end
...