确定符号表达式是否为线性函数的算法

时间:2014-08-25 23:43:21

标签: string matlab linear-algebra symbolic-math mupad

有没有一种简单的方法来检查矢量值符号函数是否是线性的?如果是这样,有没有一种简单的方法可以用A*x形式表示这个表达式,其中A是一个符号矩阵,x是参数(即有没有办法去&#34 ;提取" A给定xA*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 可以轻松解决问题。

2 个答案:

答案 0 :(得分:1)

你的问题是有效地询问方程式是否是所讨论变量中线性的多项式。 MuPAD有一整套功能可供polynomial algebra使用。例如,您可以使用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。

答案 1 :(得分:0)

我决定发布并接受我自己的回答。

通常,有几种方法可以找到正确的解决方案:

1)。最简单的解决方案是使用内置的MATLAB函数equationsToMatrix()。函数测试线性度,如果表达式是非线性的,则函数抛出标识符为symbolic:sym:equationsToMatrix:NonlinearSystem的异常。如果系统是线性的,则函数返回感兴趣的矩阵。

2)。 patrik提出的解决方案是使用线性的定义:f(ax)-a * f(x)。这仅测试线性,但一旦确认系统是线性的,就不难推断矩阵。

3)。 horchler提出的解决方案是使用多项式代数。