2013-09-23 45 views
0

未定义变量I写检查奈奎斯特准则的封闭系​​统的稳定性的算法(http://en.wikipedia.org/wiki/Nyquist_stability_criterion奈奎斯特准则 - 在算法

function answear=stability(re,im) 
%% Function check stability of system 
%re is real part of transmitation 
%im is imagine part of transmitation 

%% Check number of vectors elements 
re(end +1:5) = 0; 
im(end +1:5) = 0; 

if(length(re) > length(im)) 
    root = length(re); 
else 
    root = length(im); 
end 

for w=1:root 
    tran(w) = re(1) + re(2)*w.^1 + re(3)*w.^2 + re(4)*w.^3 + re(5)*w.^4 +1i*(... 
    im(1) + im(2)*w.^1 + im(3)*w.^2 + im(4)*w.^3 +im(5)*w.^4); 
end 

%% Algorithm 
switch root 
    case 0 
     exist('Write nonzero numbers', 'var') 
    case 1 
    for w=1:length(w) 
     if(real(tran(w)) > 0 && imag(tran(w)) > 0) 
      answear=1; 
     else 
      answear=0; 
     end 
    end 
    case 2 
    for w=1:length(w) 
     if(real(tran(w)) > 0 && imag(tran(w)) > 0) 
      if(real(tran(w)) < 0 && imag(tran(w)) > 0) 
       answear=1; 
      else 
       answear=0; 
      end 
     end 
     end 
    case 3 
    for w=1:length(w) 
     if(real(tran(w)) > 0 && imag(tran(w)) > 0) 
      if(real(tran(w)) < 0 && imag(tran(w)) > 0) 
       if(real(tran(w)) < 0 && imag(tran(w)) < 0) 
        answear=1; 
       else 
        answear=0; 
       end 
      end 
     end 
    end 
    case 4 
    for w=1:length(w) 
     if(real(tran(w)) > 0 && imag(tran(w)) > 0) 
      if(real(tran(w)) < 0 && imag(tran(w)) > 0) 
       if(real(tran(w)) < 0 && imag(tran(w)) < 0) 
        if(real(tran(w)) > 0 && imag(tran(w)) < 0) 
         answear=1; 
        else 
         answear=0; 
        end 
       end 
      end 
     end 
    end 
end 

%% Answear 
if answear==1 
    disp('System unstable') 
else 
    disp('System stable') 
end 
plot(real(tran),imag(tran)) 
grid on 

end 

函数返回

未定义的函数或变量“answear ”。

错误稳定性(线87)如果answear == 1

所以算法写的不好?

回答

2

您的代码可以用大量的清理:

  1. 相反的if语句像这样的:

    if(real(tran(w)) > 0 && imag(tran(w)) > 0) 
        answear=1; 
    else 
        answear=0; 
    end 
    

    你可以写一个布尔值赋值:

    answear = real(tran(w)) > 0 & imag(tran(w)) > 0); 
    
  2. 为什么你有三个(几乎)相同的嵌套if语句呢?

    if(real(tran(w)) > 0 && imag(tran(w)) > 0) 
        if(real(tran(w)) < 0 && imag(tran(w)) > 0) 
         if(real(tran(w)) < 0 && imag(tran(w)) < 0) 
    

    首先,你可以用一个if语句替换所有的东西。但是你真的用这个测试了什么?看起来那些嵌套的if语句永远不会被执行。例如,real(tran(w))不能同时为正数和负数(除非它是您正在处理的矢量,在这种情况下,您不应该使用运算符&&)。

    此外,这可能是您的代码触发有关变量answear的错误。访问它是不可能的,因为它没有被赋值(没有一个if语句已经被执行)。

  3. 什么是tran,什么是w?他们是全球变数吗?如果是,请将它们作为输入参数传递。如果它依赖于外部状态和变量,你的函数可能设计得不好。

我没有真正运行你的代码,但这些建议应该会让你更容易调试它。

PS
请修正恼人的拼写错误(这是“答案”,而不是“answear”):)

+1

2.To检查奈奎斯特准则的稳定性 - 图必须经过许多坐标系的象限,它是行传递函数(方程)。例如,如果表达式是三度,则图形会先后通过I,II,III季度系统。这就是为什么我试图检查一个循环中每个字符表达式的真实和虚构部分。 Tran是透射率,w是脉动(频率)。 – Kulis

+0

@Kulis再一次,请仔细阅读我的评论:表达式'tran(w)> 0'和'tran(w)<0'不能同时为真。 –