指定矩阵形状

问题描述 投票:0回答:1

在使用函数 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 的吗?

任何帮助将不胜感激。

matrix maple
1个回答
0
投票

您可以将

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;
© www.soinside.com 2019 - 2024. All rights reserved.