如何在Matlab中随机创建一个实数平方矩阵A且其所有特征值都是复数λ=a+bi?
我首先采用一个随机的 n X 2 数据矩阵 A,其中 n > 2。我们希望 A 的列具有相似的方差,并且列之间存在一定的相关性。您可以使用 2x2 协方差矩阵的 choleski 分解来实现此目的。然后我们将获取 A 的样本协方差矩阵,我们称之为 B。如果我们更改 B(1,2) = -B(1,2),则 B 将具有高概率的复特征值。
其原因是协方差矩阵的形式为 [a,b;b,c],矩阵的基本方程为 (a-lam)*(c-lam) - b^2。为了使其具有复杂的特征值,我们需要 4*a*c -4*b^2 > (a+c)^2。可以写成 -4*b^2 > (a-c)^2。这是不可能发生的,除非我们改变 B(1,2) = -B(1,2) 然后要求变成 4*b^2 > (a-c)^2。因此,由于 a 和 c 是 A 列的方差,如果它们具有相似的方差 (a-c)^2 将接近于零。如果 A 的列具有良好的相关性,则 4b^2 将远离零并且为正值。因此你会得到复杂的特征值。
这应该不难扩展到一般的 nxn 矩阵。
我尝试扩展到一般的 nxn 矩阵。一个问题是,如果 n 为奇数,Matlab 总是生成至少一个实数特征值 例如:n = 3 random_matrix = cov(rand(3));
for i = 1: length(random_matrix)
for j = 1: length(random_matrix)
if j > i
random_matrix(i,j) = - random_matrix(i,j);
end
end
end
随机矩阵=
0.1390 -0.1389 0.0578
0.1389 0.1661 0.0257
-0.0578 -0.0257 0.0614
eig(随机矩阵) =
0.1457 + 0.1483i
0.1457 - 0.1483i
0.0752 + 0.0000i
有没有更好的方法来随机生成一个只有特征值虚部的实数稳定矩阵?
请注意,特征值是彼此共轭的,特征向量也是如此。请注意,生成的矩阵 A 具有所有实数条目。
>> syms a b c d e real
>> D=diag([a+b*i,a-b*i])
D =
[ a + b*i, 0]
[ 0, a - b*i]
>> V=[c, c;d+e*i, d-e*i]
V =
[ c, c]
[ d + e*i, d - e*i]
>> A=simplify(V*D*inv(V))
A =
[ (a*e - b*d)/e, (b*c)/e]
[ -(b*(d^2 + e^2))/(c*e), (a*e + b*d)/e]
因此,假设您想要一个具有特征值 1+i 和 1-i 以及特征向量 (1,1+i) 和 (1,1-i) 的实数矩阵。
>> D=sym(diag([1+i,1-i]))
D =
[ 1 + i, 0]
[ 0, 1 - i]
>> V=sym([1,1;1+i,1-i])
V =
[ 1, 1]
[ 1 + i, 1 - i]
>> A=simplify(V*D*inv(V))
A =
[ 0, 1]
[ -2, 2]
我们可以检查我们的答案。
>> [v,d]=eig(A)
v =
[ 1/2 + i/2, 1/2 - i/2]
[ 1, 1]
d =
[ 1 - i, 0]
[ 0, 1 + i]
起初,我们认为它没有返回与我们输入的相同的特征向量。然而,特征向量的任何倍数仍然是特征向量,看看当我们将矩阵 v 乘以 1+i 时会发生什么。
>> (1+i)*v
ans =
[ i, 1]
[ 1 + i, 1 + i]
这些是我们输入的特征向量。
如果你没有 Matlab 的符号工具箱,我是在编辑器中完成的。
%%
clear
D=diag([1+i,1-i]);
V=[1,1;1+i,1-i];
A=V*D*inv(V)
这就是输出。
A =
0 1
-2 2
具有实系数的实多项式的非实根可以分为复共轭对,即每对的两个成员具有仅符号不同且实部相同的虚部。如果次数是奇数,则根据中间值定理,至少有一个根是实数。因此,任何奇数阶实数矩阵都至少有一个实数特征值,而偶数数阶实数矩阵可能不具有任何实数特征值。与这些复特征值相关的特征向量也是复数并且也出现在复共轭空气中。 https://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors#:~:text=The%20non%2Dreal,complex%20conjugate%20pairs.
假设 A 是我们正在寻找的大小为 n×n 的随机实数方阵。由于所有特征值都被要求是复数,因此它们将以共轭对
x±yi
出现,并且 n 必须是偶数。对于每个特征值对 x±yi
,我们放入 2×2 矩阵
[x,-y;y,x] 在 n×n 零矩阵 (M) 的对角线上。
那么对于任何大小为 n×n 的可逆随机矩阵 B:
A=B * M * inv(B)
以下代码创建随机复特征值并根据它们生成矩阵 A:
re = rand(n/2, 1); % real part of random eigenvalues
im = rand(n/2, 1); % imaginary part of random eigenvalues
M = zeros(n);
% Place 2x2 blocks along the diagonal
for i = 1:n/2
x = re(i);
y = im(i);
M(2*i-1:2*i, 2*i-1:2*i) = [x, -y; y, x];
end
B = rand(n);
A = B*M/B;