在MATLAB中计算符号表达式时的零误差除法
我似乎无法运行这段代码,它一直在第100++行显示错误,而我只有不到20行在MATLAB中计算符号表达式时的零误差除法,matlab,nyquist,Matlab,Nyquist,我似乎无法运行这段代码,它一直在第100++行显示错误,而我只有不到20行 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) 这是
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)
这是显示的错误,任何专家都可以在这方面帮助我?错误是因为您正在使用数组
w
计算G\u w
,并且此数组包含值0
,结果是被零除,因此产生错误
使用符号引擎时出错(第59行)除以零 要解决此问题,您可以将
W
中的0
替换为
作为旁注,错误并不是抱怨代码的第100+行有问题,而是堆栈跟踪说明错误实际上起源于您正在调用的函数
堆栈跟踪是从发生错误的代码开始排序的,您调用该代码来创建堆栈跟踪
% Replace zeros with epsilon
W(W == 0) = eps;
nyq = eval(subs(G_w,w,W));
x = real(nyq)
y = imag(nyq)
plot(x,y)
使用符号引擎出错(第59行)该错误是因为您正在使用数组w
计算G_w
,并且该数组包含值0
,导致被零除,从而产生错误
使用符号引擎时出错(第59行)
除以零
要解决此问题,您可以将W
中的0
替换为
作为旁注,错误并不是抱怨代码的第100+行有问题,而是堆栈跟踪说明错误实际上起源于您正在调用的函数
堆栈跟踪是从发生错误的代码开始排序的,您调用该代码来创建堆栈跟踪
% Replace zeros with epsilon
W(W == 0) = eps;
nyq = eval(subs(G_w,w,W));
x = real(nyq)
y = imag(nyq)
plot(x,y)
使用SYMEGINE(第59行)出错在这种情况下,Suever的答案肯定是一个更好的解决方案,在这种情况下,必须计算大量的值,但另一个解决方案是如果您希望仅以一个值(0)计算函数,并希望避免被零除的错误,则可以执行以下操作:
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
这是一个计算量很大的问题,因此只有当你期望除以0时(例如,在w=0
)才值得使用。在这种情况下,Suever的答案肯定是一个更好的解决方案,在这种情况下,必须计算大量的值,但是如果你只想在一个值(0)上计算函数,那么另一个解决方案是要避免被零除的错误,可以执行以下操作:
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
不过,这需要大量计算,因此只有当您希望除以0时(例如在w=0
)才值得使用。Hi@Suever,感谢您的及时回复!请问:[~,ind]=min(abs(W));W(ind)=每股收益;我似乎得到了一个直角的2直线图,它离我的奈奎斯特图(通常是包围图)很远。抱歉占用你的时间!希望收到你的来信@尼亚姆,我把它更新得更清楚了。基本上,它用一个非常小的ε来替换W
中的零值,这样就可以避免被零除。至于为什么你的图看起来不像你所期望的,你展示的方法是好的(比如尝试传递函数1/(s+1)
)!请问:[~,ind]=min(abs(W));W(ind)=每股收益;我似乎得到了一个直角的2直线图,它离我的奈奎斯特图(通常是包围图)很远。抱歉占用你的时间!希望收到你的来信@尼亚姆,我把它更新得更清楚了。基本上,它用一个非常小的ε来替换W
中的零值,这样就可以避免被零除。至于为什么你的图看起来不像你所期望的,你所展示的方法是好的(比如尝试传递函数1/(s+1)
)。