迭代matlab中的函数

时间:2015-12-16 19:40:43

标签: matlab

我试图迭代一个函数,以便提取符号函数的离散值:

syms x;
y =  sinc(x);
x = -100:1:100;
for i = 1:length(x)
    t(i) = y(x(i));
end

但它给了我错误:

Subscript indices must either be real positive integers or logicals.

如果我使用:

t(i) = y{i}(x);

它说:

SYM objects do not allow nested indexing. Assign intermediate values to variables instead.

那么在matlab中如何做到这一点,看起来像符号函数的线性采样比预期的要复杂一些,或者是否存在我在这里缺少的函数?

2 个答案:

答案 0 :(得分:2)

您的y变量不是symbolic function,而是symbolic expression。如果你想留下一个符号表达式,你可以这样做:

syms x;
y = sinc(x);
x2 = -100:1:100;               % Don't overwrite your symbolic variable x
t = zeros(length(x2),1,'sym'); % Pre-allocate
for i = 1:length(x2)
    t(i) = subs(y,x,x2(i));
end

或者更简单:

syms x;
y = sinc(x);
x2 = -100:1:100;
t = subs(y,x,x2);

您还可以将y转换为symbolic function

syms x;
y(x) = sinc(x);
x2 = -100:1:100;
t = y(x2);

请注意,在所有情况下,由于x2向量包含0,您将获得被零除错误。这是因为sinc是一个尚未因符号数学而过载的数字函数。

你有什么理由不用数字进行评估吗?:

y = @(x)sinc(x);
x = -100:1:100;
t = y(x);

如果您确实需要符号sinc功能,可以使用MuPAD piecewise创建自己的矢量化版本:

sinc_sym = @(x)subs(evalin(symengine,'piecewise([x~=0, sin(x)/x],[Otherwise, 1])'),'x',x);

或者:

sinc_sym = @(x)subs(evalin(symengine,'piecewise([x~=0, sin(pi*x)/(pi*x)],[Otherwise, 1])'),'x',x);

答案 1 :(得分:1)

您已将y指定给符号对象,但它不是函数。您可以使用subs

在每个x(i)对其进行评估
t(i) = subs(y,'x',x(i));

这还有一个问题,即您x=0收到错误,但正如您的建议,可以使用t(i)语句设置if,例如

 if (x(i) ~= 0)
   subs(y,'x',x(i));
 else 
   t(i) = NaN; % or = 1 (limit of sinc(x) as x -> 0)
 end