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