奈奎斯特准则 - 算法中未定义的变量



我编写了一个算法来检查奈奎斯特准则(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

所以算法写得不好?

您的代码可能需要大量清理:

  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?它们是全局变量吗?如果是,请将它们作为输入参数传递。如果函数依赖于外部状态和变量,则函数可能设计不佳。

我实际上还没有运行您的代码,但这些建议应该可以让您更轻松地调试它。

附言
请修复烦人的拼写错误(它是"答案"而不是"answear"):)

最新更新