在MATLAB中评估符号表达式时除以零误差

时间:2017-01-15 17:56:09

标签: matlab nyquist

clear all

syms s w 

G = 1/((s)*(s+1)*(s+2)); %transfer function
G_w = subs(G,s,j*w); 
W= [-100:0.01:100]; %[min_range:step size:max_range]
nyq = eval(subs(G_w,w,W)); 

x = real(nyq)
y = imag(nyq)

plot(x,y)

我似乎无法运行此代码并且它在第100行++中继续显示错误,其中我只有不到20行。

Error using symengine (line 59)
Division by zero.
Error in sym/subs>mupadsubs (line 139)
G = mupadmex('symobj::fullsubs',F.s,X2,Y2);
Error in sym/subs (line 124)
    G = mupadsubs(F,X,Y);
Error in nyquist2 (line 8)
nyq = eval(subs(G_w,w,W)); %replace W with w in equation G_w

这是显示的错误,任何专家都可以帮助我吗?

2 个答案:

答案 0 :(得分:4)

该错误是因为您使用数组G_w计算W,并且此数组包含值0,导致除以零,从而导致错误。

  

使用symengine时出错(第59行)
  被零除。

如何解决这个问题,就是用eps替换0中的W

% Replace zeros with epsilon
W(W == 0) = eps;

nyq = eval(subs(G_w,w,W)); 

x = real(nyq)
y = imag(nyq)

plot(x,y)

作为旁注,错误并不是抱怨您的代码的第100行的问题,而是堆栈跟踪声明错误实际上来自 你正在调用的函数

堆栈跟踪从发生错误的位置开始排序到您调用以创建它的代码

Error using symengine (line 59)             <--- WHERE THE ERROR HAPPENED
Division by zero.                           <--- THIS IS THE ERROR MESSAGE

Error in sym/subs>mupadsubs (line 139)      <--- THIS FUNCTION CALLED symengine
G = mupadmex('symobj::fullsubs',F.s,X2,Y2); <--- THIS IS THE LINE THAT CALLED symengine

Error in sym/subs (line 124)                <--- THIS FUNCTION CALLED mupadsubs
G = mupadsubs(F,X,Y);                       <--- THIS IS THE LINE THAT CALLED mupadsubs

Error in nyquist2 (line 8)                  <--- THIS FUNCTION (YOURS) CALLED subs
nyq = eval(subs(G_w,w,W))                   <--- THIS IS THE LINE THAT CALLED subs

答案 1 :(得分:0)

@Suever's answer 在这种必须计算大量值的情况下绝对是更好的解决方案,但如果您只想在一个值 (0) 处评估函数并希望避免除法,则是另一种解决方案-零错误,你可以这样做:

>> limit(G_w,w,0)
 
ans =
 
NaN

虽然这需要大量计算,因此只有在您期望被零除时才值得使用(例如在 w = 0 处)。