2015-12-16 6 views
2

Я пытаюсь перебрать функцию для того, чтобы извлечь дискретные значения символической функции:перебрать функции в 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, похоже, что линейная выборка из символической функции несколько сложнее, чем ожидалось, или есть функция для этого, которую я здесь отсутствует?

+0

Связанные вопросы и ответы, которые могут быть полезны: htt p: //stackoverflow.com/questions/20054047/subscript-indices-must-either-be-real-positive-integers-or-logicals-generic-sol/20054048#20054048 – mikkola

+0

Спасибо, но это то, что я хочу do, вы знаете, что его невозможно индексировать сим-объект вообще правильно? – lkn2993

+0

Как насчет 'y = @ (x) sinc (x)' (но тогда ни 'y', ни' x' не являются символическими, а могут быть там) – Steve

ответ

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); 

Или:

1

Вы назначили y символическому объекту, но это не функция. Вы можете оценить его на каждом x(i) с subs:

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 
Смежные вопросы