0

我编写了一个算法来检查 Nyquist 标准的封闭系统的稳定性(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”。

如果 answear==1 则稳定性错误(第 87 行)

所以算法写得不好?

4

1 回答 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))不能同时是正数和负数(除非它是您正在处理的向量,在这种情况下您不应该使用 operator &&)。

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

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

我实际上并没有运行你的代码,但是这些建议应该让你更容易调试它。

PS
请修复烦人的拼写错误(它是“answer”而不是“answear”):)

于 2013-09-23T12:37:11.063 回答