Matlab象征性功能

时间:2016-02-27 08:57:21

标签: matlab function substitution symbolic-math

我正在定义一个符号函数

Items.CalcItems(new Item1(), 30);
Items.CalcItems(new Item2(), 12);

当我尝试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))并在符号函数的定义中进行替换。 可以这样做吗?

2 个答案:

答案 0 :(得分:2)

我认为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的符号版本。

答案 1 :(得分:0)

我认为最简单的方法是使用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)

这两个都返回一个双精度数组([0 1 1])。您可以使用logical将其转换为逻辑数组。您可能还会发现sym/isequaln在某些情况下很有用。