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

Solve function for real part = 0 instead of imaginary in MATLAB

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

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

Operands to the || and && operators must be convertible to logical scalar values.

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. fzero 仅适用于标量值函数 (f: ℝ → ℝ)
  2. 复数是单个数字,几乎所有函数都将其视为单一实体。您必须强制 MATLAB 将复数拆分为虚部和实部

因此,一个可能的解决方法是取第一个复数特征值的实部:

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);