【问题标题】:Solve function for real part = 0 instead of imaginary in MATLAB在 MATLAB 中求解实部 = 0 而不是虚部的函数
【发布时间】:2017-01-06 13:30:06
【问题描述】:

我有一个输出复特征值向量的函数。它需要一个参数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-real-and-2-conjugates...这实际上是一个要求吗?
  • @RodyOldenhuis 有效范围是 rho > 0。解决方案是 rho = 24.737,但现在我需要一种方法让它在 MATLAB 中工作
  • 2 个共轭 + 实数值仅在 ρ > 1.34561 时开始发生...

标签: matlab math mathematical-optimization eigenvalue


【解决方案1】:

两个问题:

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

【讨论】:

  • 我正要评论说你需要得到lambda(1),但你打败了我;)
  • ...是的,但它不是很健壮;这只适用于 ρ > 1.34561...我还是不开心!将会有更多的编辑:)
  • 这是一个绝妙的解决方案!
猜你喜欢
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
相关资源
最近更新 更多