我试图迭代一个函数,以便提取符号函数的离散值:
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中如何做到这一点,看起来像符号函数的线性采样比预期的要复杂一些,或者是否存在我在这里缺少的函数?
答案 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