1

有没有一种简单的方法来检查向量值符号函数是否是线性的?如果是这样,是否有一种简单的方法可以以形式表示此表达式,符号矩阵A*x在哪里,参数是哪里(即有没有一种方法可以“提取”给定的和)?AxAxA*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来解决问题。

4

2 回答 2

1

您的问题实际上是在询问方程是否是所讨论变量中线性的多项式。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)

分别返回真和假。

于 2014-08-26T12:58:33.603 回答
0

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

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

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

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

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

于 2014-08-26T11:23:26.650 回答