我们如何在Matlab中随机创建一个实平方矩阵A及其所有特征值都是复数λ= a + bi?
答案 0 :(得分:0)
我将首先采用随机的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矩阵。
答案 1 :(得分:0)
我试图扩展到一般的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
random_matrix =
0.1390 -0.1389 0.0578
0.1389 0.1661 0.0257
-0.0578 -0.0257 0.0614
eig(random_matrix)=
0.1457 + 0.1483i
0.1457 - 0.1483i
0.0752 + 0.0000i
有没有更好的方法来随机生成一个只有虚部的特征值的真实稳定矩阵?
答案 2 :(得分:0)
注意特征值是彼此的共轭,特征向量也是如此。请注意,生成的矩阵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的Symbolic Toolbox,我在编辑器中做了这个。
%%
clear
D=diag([1+i,1-i]);
V=[1,1;1+i,1-i];
A=V*D*inv(V)
这是输出。
A =
0 1
-2 2