Алгоритм определения того, является ли символьное выражение линейной функцией

Есть ли простой способ проверить, является ли символическая функция с векторным значением линейной? Если да, то есть ли простой способ представить это выражение в виде A*x, где A — это символьная матрица, а x — аргумент (т. е. есть ли способ «извлечь» A из данных x и A*x)?

syms x1 x2 a b c;
fx1 = [a*(x1+x2); b*x1+c*x1];
fx2 = [a*x1/log(x2); x2^2];
A=checklinearity(fx1, [x1 x2]') % should return [a, a; b+c, 0]
A=checklinearity(fx2, [x1 x2]') % should return false

Ответ: Есть простой способ решить проблему, используя встроенную функцию MATLAB equationsToMatrix.


person Community    schedule 25.08.2014    source источник
comment
Пробовали ли вы делать обычные тесты: f(x+x) = f(x)+f(y) и f(ax)=a*f(x)?   -  person patrik    schedule 26.08.2014
comment
Ну, если предположить, что используется символический набор инструментов, это не должно быть проблемой. Просто сделайте то же самое, если вы проверили это аналитически. В смысле почему нельзя сделать: f(x) = x; q = f(ax)-a*f(x); if q~=0, fprintf('not equal'); else,fprintf('equal'); end. Это, конечно, псевдокод.   -  person patrik    schedule 26.08.2014


Ответы (2)


Ваш вопрос фактически спрашивает, являются ли уравнения полиномами, линейными по рассматриваемой переменной. MuPAD имеет целый набор функций, которые вы можете использовать для полиномиальной алгебры. Например, вы можете использовать функцию degree. Вот пример использования функции map для векторизации этого по списку функций. :

function p = orderOfVars(f,x)
for i = numel(x):-1:1
    p(:,i) = evalin(symengine,['map(' char(f(:)) ',f->degree(f,' char(x(i)) '))']);
end

Затем

syms x1 x2 a b c;
fx1 = [a*(x1+x2); b*x1+c*x1];
fx2 = [a*x1/log(x2); x2^2];

y1 = orderOfVars(fx1,[x1 x2])
y2 = orderOfVars(fx2,[x1 x2])

возвращается

y1 =

[ 1, 1]
[ 1, 0]


y2 =

[ 1, 0]
[ 0, 2]

Отсюда это просто вопрос проверки значений:

all(y1(:)<=1)
all(y2(:)<=1)

которые возвращают true и false соответственно.

person horchler    schedule 26.08.2014
comment
Да, но есть и более простые способы - смотрите комментарии и правки выше. Я чувствую, что не должен был задавать этот вопрос... - person ; 26.08.2014
comment
@ user1391279: Вы можете ответить (и даже принять) свой собственный вопрос. Протестируйте этот equationsToMatrix, чтобы увидеть, насколько хорошо он работает. Это быстро? Что произойдет, если вы дадите ему нелинейное уравнение с одной или несколькими переменными — сможет ли он сказать? Эта функция также, вероятно, является новым дополнением к Matlab, поэтому пользователи более старых версий могут не иметь к ней доступа, что делает ваш общий вопрос все еще ценным. - person horchler; 26.08.2014
comment
Я уже в какой-то степени протестировал эту функцию - в вышеупомянутых случаях она работает хорошо. Если уравнение нелинейное, оно генерирует исключение с идентификатором symbolic:sym:equationsToMatrix:NonlinearSystem. - person ; 26.08.2014

Я решил опубликовать и принять свой собственный ответ.

Как правило, существует несколько подходов, которые приводят к правильному решению:

1). Самое простое решение — использовать встроенную функцию MATLAB equationsToMatrix(). Функция проверяет линейность, и если выражение нелинейно, то функция выдает исключение с идентификатором symbolic:sym:equationsToMatrix:NonlinearSystem. Если система линейна, то функция возвращает интересующую матрицу.

2). Решение, предложенное Патриком, заключалось в использовании определения линейности: f(ax)-a*f(x). Это только тест на линейность, но как только подтверждается, что система линейна, несложно вывести матрицу.

3). Решение, предложенное Хорхлером, заключалось в использовании полиномиальной алгебры.

person Community    schedule 26.08.2014