2013-09-23 1 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를 반환 ". answear == 1

그래서 알고리즘 심하게 작성된 경우 안정성 (라인 87)에

오류?

답변

2

에 코드를 정리를 많이 사용할 수 있습니다

  1. 대신의 경우 문 같은 일이 같이

    answear = real(tran(w)) > 0 & imag(tran(w)) > 0); 
    
  2. :

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

    부울 할당을 쓸 수를

  3. 3 가지 (거의) 동일한 중첩 된 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 문이 실행되지 않았습니다).

  4. tran은 무엇이며 w은 무엇인가요? 그들은 전역 변수입니까? 일치하는 경우 입력 매개 변수로 전달하십시오. 함수가 외부 상태와 변수에 의존하는 경우 함수가 잘못 설계되었을 수 있습니다.

실제로 코드를 실행하지는 않았지만 이러한 제안을 통해 디버깅이 더 쉬워졌습니다.

PS :
이 짜증나는 맞춤법 오류를 수정주십시오

+1

2.To는 나이 퀴 스트 기준의 안정성을 확인 :) (그것은 "답"이 아니라 "answear"입니다) - 그래프는 많은 통과해야 행 전달 함수 (방정식) 인 좌표계의 사분면. 예를 들어, 표현식이 3 도인 경우 그래프는 I, II, III 분기 시스템을 차례로 통과합니다. 그래서 내가 표현의 실제와 허수의 각 부분을 루프에 체크인하려고합니다. Tran은 투과율, w는 맥동 (주파수)입니다. – Kulis

+0

@Kulis 다시 말해, 'tran (w)> 0'과 'tran (w) <0'은 동시에 참일 수 없습니다. –