2017-01-06 9 views
1

복잡한 고유 값의 벡터를 출력하는 함수가 있습니다. 단일 인수 인 rho이 필요합니다. 나는 복잡한 고유치가 허수 축에 놓이는 rho을 찾아야합니다. 즉, 실제 부품 나는 그것이에 다음과 같은 오류를MATLAB에서 실수 대신 Solve 함수를 0으로 가정합니다.

피연산자가 발생합니다 fzero()을 실행하면 0

을해야 || & & 연산자는 논리 스칼라 값으로 변환 할 수 있어야합니다.

반면에 fsolve()은 단순히 허수 부분 = 0을 해결합니다. 이것은 정확히 내가 원하는 것의 오포입니다.

들은 (복잡 부분 = 0) I 그것은 3 고유치 2 켤레 복소수와 고유 한 실제 출력

function lambda = eigLorenz(rho) 
beta = 8/3; 
sigma = 10; 
eta = sqrt(beta*(rho-1)); 
A = [ -beta 0 eta;0 -sigma sigma;-eta rho -1]; 
y = [rho-1; eta; eta]; 

% Calculate eigenvalues of jacobian 
J = A + [0 y(3) 0; 0 0 0; 0 -y(1) 0] 

lambda = eig(J) 

쓴 함수이다. 는 I 복소 고유치 허수 축에 놓여있는 rho을 찾아야하므로 실제 부분은 0

+0

ρ의 유효한 범위는 무엇입니까? 임의의 값을 채우는 것만으로도 1-real-and-2-conjugate를 설명 할 수는 없으므로 실제로 요구 사항입니까? –

+0

@RodyOldenhuis 유효한 범위는 rho> 0입니다. 솔루션은 rho = 24.737이지만, 이제는 MATLAB에서 작동하도록하는 방법이 필요합니다. – Ortix92

+0

2 공액 + 실제 값은 ρ> 1.34561에서 시작됩니다 ... –

답변

1

두 가지 문제점이 있음 :

  1. fzero 스칼라 값 함수 (F에만 적합하다 : ℝ → ℝ)
  2. 복소수는 거의 모든 기능에 의해 signle entity로 취급되는 단일 숫자입니다.

    function [output, lambda] = eigLorenz(rho) 
    
        % Constants 
        beta = 8/3; 
        sigma = 10; 
    
        eta = sqrt(beta*(rho-1)); 
        A = [-beta  0  eta 
          0 -sigma sigma 
          -eta  rho  -1]; 
    
        y = [rho-1 
         eta 
         eta]; 
    
        % Calculate eigenvalues of jacobian 
        J = A + [0 y(3) 0 
          0 0 0 
          0 -y(1) 0]; 
    
        lambda = eig(J); 
    
        % Make it all work for all rho with FZERO(). Check whether: 
        % - the complex eigenvalues are indeed each other's conjugates 
        % - there are exactly 2 eigenvalues with nonzero imaginary part 
        complex = lambda(imag(lambda) ~= 0); 
        if numel(complex) == 2 && ... 
          (abs(complex(1) - conj(complex(2))) < sqrt(eps)) 
    
         output = real(complex(1)); 
    
        else 
         % Help FZERO() get out of this hopeless valley 
         output = -norm(lambda); 
        end 
    
    end 
    

    전화 : 당신은

그래서 그 가상 및 실제 부분으로 복소수를 분할 MATLAB을 강제해야합니다, 하나의 가능한 해결 방법은 첫째 복잡한 고유치의 실제 참여하는 것입니다 like :

rho = fzero(@eigLorenz, 0); 
[~, lambda] = eigLorenz(rho); 
+0

당신이'lambda (1)'을 얻을 필요가 있다고 말하려고했으나 당신은 나를 때렸다;) – Ortix92

+0

... 그렇지만 매우 견고하지는 않다; 이것은 ρ> 1.34561만큼 오래 작동합니다 ... 나는 여전히 행복하지 않습니다! 몇 가지 추가 사항이 있습니다. –

+0

@ Ortix92 거기에 있습니다. 이것은 -∞ <ρ <+ ∞에서 유효합니다. –