Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MATLAB中计算符号表达式时的零误差除法_Matlab_Nyquist - Fatal编程技术网

在MATLAB中计算符号表达式时的零误差除法

在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) 这是

我似乎无法运行这段代码,它一直在第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)

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

错误是因为您正在使用数组
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)
)。