Критерий Найквиста - неопределенная переменная в алгоритме

Пишу алгоритм, проверяющий устойчивость замкнутой системы по критерию Найквиста (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

Функция возвращает

Неопределенная функция или переменная.

Ошибка в стабильности (строка 87), если ответ==1

Значит алгоритм плохо написан?


person Kulis    schedule 23.09.2013    source источник


Ответы (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? Это глобальные переменные? Если они есть, передайте их как входные параметры. Ваша функция, вероятно, плохо спроектирована, если она опирается на внешние состояния и переменные.

На самом деле я не запускал ваш код, но эти предложения должны облегчить вам его отладку.

P.S:
Пожалуйста, исправьте досадную орфографическую ошибку (это "ответ", а не "ответ") :)

person Eitan T    schedule 23.09.2013
comment
2. Для проверки устойчивости критерия Найквиста график должен пройти столько квадрантов системы координат, сколько строк передаточной функции (уравнения). Например, если выражение трехстепенное, то граф последовательно проходит через систему I, II, III четвертей. Поэтому я стараюсь в цикле проверять реальную и мнимую части выражения каждого символа. Tran — коэффициент пропускания, w — пульсация (частота). - person Kulis; 23.09.2013
comment
@Kulis Опять же, внимательно прочитайте мой комментарий: выражения tran(w) > 0 и tran(w) < 0 не могут быть истинными одновременно. - person Eitan T; 23.09.2013