我有一个输出复数特征值向量的函数。只需一个参数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。
答案 0 :(得分:1)
两个问题:
fzero
仅适用于标量值函数(f:ℝ→ℝ)因此,一种可能的解决方法是采用第一个复杂特征值的实部:
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);