【问题标题】:Algorithm to determine if a symbolic expression is a linear function确定符号表达式是否为线性函数的算法
【发布时间】:2014-08-25 23:43:20
【问题描述】:

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

【问题讨论】:

  • 您是否尝试过进行常规测试:f(x+x) = f(x)+f(y)f(ax)=a*f(x)
  • 好吧,假设使用了符号工具箱,这应该不是问题。如果您已经进行了分析测试,请按照完全相同的方式进行操作。我的意思是为什么不能这样做:f(x) = x; q = f(ax)-a*f(x); if q~=0, fprintf('not equal'); else,fprintf('equal'); end。这当然是伪代码。

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


【解决方案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)

分别返回真和假。

【讨论】:

  • 是的,但有更简单的方法 - 请参阅上面的 cmets 和编辑。我觉得我不应该问这个问题......
  • @user1391279:欢迎您回答(甚至接受)您自己的问题。测试这个equationsToMatrix 看看它的效果如何。快吗?如果你给它一个包含一个或多个变量的非线性方程会发生什么——它可以告诉你吗?此功能也可能是 Matlab 的新增功能,因此旧版本的用户可能无法访问它,因此您的一般问题仍然很有价值。
  • 我已经在一定程度上测试了这个功能——它在上述情况下运行良好。如果方程是非线性的,它会抛出一个异常,标识符为 symbolic:sym:equationsToMatrix:NonlinearSystem。
【解决方案2】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多