在MATLAB中求解实部= 0而不是虚数的函数

时间:2017-01-06 13:30:06

标签: matlab math mathematical-optimization eigenvalue

我有一个输出复数特征值向量的函数。只需一个参数rho。我需要找到一个rho,其复数特征值位于虚轴上。换句话说,实部必须为0。

当我运行fzero()时,它会抛出以下错误

  

操作数到||和&&运算符必须可转换为逻辑标量值。

fsolve()只是为假想的部分= 0解决,这正是我想要的对立面。

这是我写的功能

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)

它输出3个特征值,2个复共轭和1个实特征值(复数部分= 0)。 我需要找到复数特征值位于虚轴上的rho,以便实部为0。

1 个答案:

答案 0 :(得分:1)

两个问题:

  1. fzero仅适用于标量值函数(f:ℝ→ℝ)
  2. 复数是单个数字,几乎所有函数都被视为单元格实体。您必须强制MATLAB将复数分解为其虚部和实部
  3. 因此,一种可能的解决方法是采用第一个复杂特征值的实部:

    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
    

    这样打电话:

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