Matlab 符号函数替换

Matlab symbolic function susbstitution

我正在定义一个符号函数

syms x(n);
x(n) = (n==0);
n=-1:1;

当我尝试时 x(n)+x(n-1) 我得到

 [ -1 == 0, 0 == 0, 1 == 0]
+[ -2 == 0, -1 == 0, 0 == 0]
=[ -3 == 0, -1 == 0, 1 == 0]

我想强制符号函数替换值,所以我得到以下结果。

 [ 0, 1, 0]
+[ 0, 0, 1]
=[ 0, 1, 1]

我尝试了 x(n) = logical(n==0);x(n) = double(n==0); 之类的方法,但得到了相同的结果。 我知道 double(x(n))+double(x(n-1)) 有效,但我想直接使用 x(n) 并在符号函数的定义中进行替换。 这能做到吗?

我认为 piecewise 是在 Mupad 中将布尔值转换为整数的唯一方法。不幸的是,它只在 Mupad 本身可用,所以你必须使用 evalin 来获取它:

syms asinteger(fun) x(n)
asinteger(fun) = evalin(symengine,'piecewise([fun,1],[Otherwise,0])');
x(n) = asinteger(n==0);
n=-1:1;

>> x(n)+x(n-1)

ans =

[ 0, 1, 1]

asinteger 函数视为 doubleint64 的符号版本。

我认为最简单的方法是使用 isAlways,它会计算表达式(相等或不等)是否为真:

syms x(n);
x(n) = (n==0);
m = -1:1; % Use a different variable to not overwrite symbolic n
isAlways(x(m))+isAlways(x(m-1))

或者您可以使用匿名函数来避免多次调用 isAlways:

m = -1:1;
x = @(n)isAlways(sym(n)==0);
x(m)+x(m-1)

这两个 return 双精度数组 ([0 1 1])。您可以使用 logical to convert this to a logical array. You might also find sym/isequaln 在某些情况下很有用。