在 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。
两个问题:
fzero
仅适用于标量值函数 (f: ℝ → ℝ)
- 复数是单个数字,几乎所有函数都将其视为单一实体。您必须强制 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);
我有一个输出复特征值向量的函数。它只有一个参数,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。
两个问题:
fzero
仅适用于标量值函数 (f: ℝ → ℝ)- 复数是单个数字,几乎所有函数都将其视为单一实体。您必须强制 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);