在 MATLAB 中评估符号表达式时除以零错误
Division by zero error when evaluating symbolic expression in MATLAB
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
这是显示的错误,任何专家都可以帮助我吗?
错误是因为您正在使用数组 W
计算 G_w
,而此数组包含值 0
,导致被零除,因此出现错误。
Error using symengine (line 59)
Division by zero.
要解决此问题,您可以将 W
中的 0
替换为 eps
。
% Replace zeros with epsilon
W(W == 0) = eps;
nyq = eval(subs(G_w,w,W));
x = real(nyq)
y = imag(nyq)
plot(x,y)
作为 side-note,错误不是抱怨 您的 代码的第 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
@Suever 的答案在必须计算大量值的这种情况下绝对是一个更好的解决方案,但如果您希望仅以一个值 (0) 评估函数并希望避免除法,则另一种解决方案零错误,你可以这样做:
>> limit(G_w,w,0)
ans =
NaN
不过这需要大量的计算,所以只有当您期望被零除时才值得使用它(例如 w = 0
)。
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
这是显示的错误,任何专家都可以帮助我吗?
错误是因为您正在使用数组 W
计算 G_w
,而此数组包含值 0
,导致被零除,因此出现错误。
Error using symengine (line 59)
Division by zero.
要解决此问题,您可以将 W
中的 0
替换为 eps
。
% Replace zeros with epsilon
W(W == 0) = eps;
nyq = eval(subs(G_w,w,W));
x = real(nyq)
y = imag(nyq)
plot(x,y)
作为 side-note,错误不是抱怨 您的 代码的第 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
@Suever 的答案在必须计算大量值的这种情况下绝对是一个更好的解决方案,但如果您希望仅以一个值 (0) 评估函数并希望避免除法,则另一种解决方案零错误,你可以这样做:
>> limit(G_w,w,0)
ans =
NaN
不过这需要大量的计算,所以只有当您期望被零除时才值得使用它(例如 w = 0
)。