在使用函数 Eigenvalues 查找矩阵的特征值之前,有没有办法指定矩阵是 Hermitian 矩阵?
我有以下过程,它创建一个矩阵,该矩阵是另一个实数矩阵的总和,并将其转置除以二。
GOE := proc(N::integer)
local R, eigenSequence, i;
global H;
R := Matrix(N, N, Generate(distribution(Normal(0, 1)), makeproc = true));
H := 1/2*R + 1/2*R^%T;
print(IsMatrixShape(H, Symmetric));
return (eigenSequence := ([seq(Eigenvalues(H)[i], i = 1 .. N)])/(2*N)^0.5); end proc;
GOE(5);
false
[-0.994570000000000 + 0. I, 0.468840000000000 + 0. I,
0.391240000000000 + 0. I, -0.0636860000000000 + 0. I,
-0.286700000000000 + 0. I]
尽管 H 是 Hermitian,
IsMatrixShape(H, Symmetric)
返回 false
。有什么方法可以明确告诉 Maple H 是 Hermitian 的吗?
任何帮助将不胜感激。
您可以将
H
的构造包装在对 Matrix
命令的调用中,并给出选项,
shape=symmetric (or hermitian)
Eigenvalues
命令知道这种情况下的结果将是纯真实的。
为了安全起见,我引用了一些名称,以防您也分配了更高级别的关键字。
您可以通过在除以 2 之前添加
H+H^%T
来保存矩阵标量乘法。
例如,
GOE := proc(N::posint)
local R, i;
global H;
R := Statistics:-Sample(Normal(0, 1), [N,N]);
H := Matrix((R + R^%T)/2, 'shape'=':-symmetric');
print(IsMatrixShape(H, ':-symmetric'));
return [seq(LinearAlgebra:-Eigenvalues(H)/(2*N)^0.5)];
end proc:
GOE(5);
true
[-0.6534952738123082, -0.48271907292646454,
-0.08120522250873016, 0.46015902976640316),
0.9573556811378775]
您的代码片段省略了
LinearAlgebra
和 RandomTools
包的任何加载,因此不会像您给出的那样独立运行。最好在过程中使用长格式名称,或者在其中使用 uses
命令,而不是让过程的功能依赖于首先在顶层调用 with
。
如果您的 Maple 版本非常旧,那么我给出的
seq
命令用法(直接在 Eigenvalues
结果向量上)可能需要调整。
对于较大的示例,我相信
Statistics:-Sample
命令可能优于您使用 RandomTools
包(而且更简单,IMO)。
例如,
GOE := proc(N::posint)
local R, i;
global H;
uses LinearAlgebra, Statistics;
R := Sample(Normal(0, 1), [N,N]);
H := Matrix((R + R^%T)/2, 'shape'=':-symmetric');
print(IsMatrixShape(H, ':-symmetric'));
return convert(Eigenvalues(H)/(2*N)^0.5, list);
end proc:
我还建议您让程序返回
H
以及结果,而不是写入 global
,如果您不在顶层操作,这会更笨拙。
GOE := proc(N::posint)
local H, R, i;
uses LinearAlgebra, Statistics;
R := Sample(Normal(0, 1), [N,N]);
H := Matrix((R + R^%T)/2, 'shape'=':-symmetric');
print(IsMatrixShape(H, ':-symmetric'));
return H, convert(Eigenvalues(H)/(2*N)^0.5, list);
end proc:
H,res := GOE(5):
res;
H;