<p>我怀疑这是一个相当微妙的问题</p>
<p>首先,在数学上,A和B是同时对角化的,当它们通勤时,也就是当它们通勤时</p>
<pre><code>A*B - B*A == 0 (often A*B-B*A is written [A,B])
(for if A*X = X*a and B*X = X*b with a, b diagonal then
A = X*a*inv(X), B = X*b*inv(X)
[A,B] = X*[a,b]*inv(X) = 0 since a and b, being diagonal, commute)
</code></pre>
<p>所以我想说,首先要检查的是,你的A和B确实通勤,这是第一个棘手的问题:由于舍入误差,计算出的[A,B]不可能都是零,你需要确定[A,B]非零是因为舍入误差,还是实际上,A和B不通勤</p>
<p>现在假设x是A的特征向量,特征值为e。然后</p>
<pre><code>A*B*x = B*A*x = B*e*x = e*B*x
</code></pre>
<p>从数学上讲,我们有两种可能性:要么Bx是0,要么Bx也是A的特征向量,特征值为e</p>
<p>一个很好的例子是A的所有元素都不同,即A的每个特征空间都是一维的。在这种情况下:
如果AX=Xa表示对角线a,那么BX=Xb表示对角线b(需要进行计算)。如果你对角化A,并且所有的特征值都是完全不同的,那么你可以假设每个特征空间的维数都是1,但是“足够”是什么意思呢?唉,又是一个微妙的问题。如果两个计算的特征值非常接近,那么特征值是不同的还是差异舍入误差?
总之,为了计算b的每个特征向量x,来计算b的特征值。如果| | Bx | |与| | x | |相比足够小,那么B的本征值为0,否则为</p>
<pre><code>x'*B*x/(x'*x)
</code></pre>
<p>在一般情况下,一些特征空间的维数可能大于1。一维本征空间可以如上所述处理,但高维本征空间需要更多的计算</p>
<p>假设m个特征向量x[1]。。A的x[m]对应于特征值e。由于A和B通勤,很容易看出B将xs跨越的空间映射到了它自己。设C为mxm矩阵</p>
<pre><code>C[i,j] = x[j]'*B*x[i]
</code></pre>
<p>然后C是对称的,所以我们可以对它进行对角化,即用</p>
<pre><code>C = V'*c*V
</code></pre>
<p>如果我们定义</p>
<pre><code>y[l] = Sum{ k | V[l,k]*x[k] } l=1..m
</code></pre>
<p>然后一点代数表明y[l]是B的特征向量,特征值为c[l]。此外,由于每个x[i]是具有相同特征值e的A的特征向量,因此每个y[l]也是具有特征向量e的A的特征向量</p>
<p>总而言之,我认为一种方法是:</p>
<ol>
<li>计算[A,B],如果真的不是0,就放弃</li>
<li>对A进行对角化,对要增加的特征值进行排序(对特征向量进行排序!)</li>
<li>识别A的特征空间。对于一维空间,A的对应特征向量是B的特征向量,您需要计算的只是B的特征值。对于高维空间,请按照上一段进行</李>
</ol>
<p>测试换向器是否为零的一种相对昂贵(在计算工作中)但合理可靠的方法是计算换向器的奇异值,取最大奇异值,比如c,并取A和b的最大奇异值(或特征值的最大绝对值)。除非c小得多(例如1e-10倍)a和b中的较小者,你应该得出换向器不为零的结论</p>