我有一个程序,可以使用 scipy null_space 计算矩阵的零空间。当矩阵为实数时,我的代码工作绝对完美,但似乎与 MATLAB 中复杂矩阵的结果相矛盾。
举个例子,
[[ 1. +0.j 0. +0.j 0. +0.j -0.28867513+0.5j]
[ 0. +0.j 1. +0.j 0. +0.j -0.28867513-0.5j]
[ 0. +0.j 0. +0.j 1. +0.j 0.57735027-0.j ]]
当插入 scipy.linalg.null_space 时,
[[ 0.24235958-0.32852474j]
[ 0.16333098+0.37415192j]
[-0.40569056-0.04562718j]
[ 0.70267665+0.0790286j ]]
MATLAB 中完全相同的矩阵给出,
0.2235 - 0.3134i
0.1596 + 0.3502i
-0.4151 + 0.2949i
0.6636 + 0.0639i
这些在缩放方面显然不一样,那么发生了什么? scipy 对于复杂矩阵来说不是很准确还是我做错了什么?当矩阵恰好是真实的时,我的代码再次完美地工作。预先感谢!
嗯,你可以试试这个。当乘以矩阵 A 时,你的 scipy.null_space 向量正确地给出 0,而你的 Matlab 答案却没有。
元素的比例是一个常数(复数),除了第三行,这让我认为这是Matlab中错误的元素。
scipy.null_space 向量也正确标准化为 1。
我认为 scipy.null_space 给出了正确的结果,而你在 Matlab 中所做的任何事情都不是。
检查两个代码中的矩阵是否相同。
import numpy as np
A = np.array( [
[ 1.+0.j, 0.+0.j, 0.+0.j, -0.28867513+0.5j],
[ 0.+0.j, 1.+0.j, 0.+0.j, -0.28867513-0.5j],
[ 0.+0.j, 0.+0.j, 1.+0.j, 0.57735027-0.j ]
] )
python = np.array( [
0.24235958-0.32852474j,
0.16333098+0.37415192j,
-0.40569056-0.04562718j,
0.70267665+0.0790286j
] )
matlab = np.array( [
0.2235 - 0.3134j,
0.1596 + 0.3502j,
-0.4151 + 0.2949j,
0.6636 + 0.0639j
] )
print( 'A @ python =\n', A @ python )
print( '\n\nA @ matlab =\n', A @ matlab )
print( '\n\npython / matlab =\n', python / matlab )
print( '\n\nabs(python) =\n', np.linalg.norm( python ) )
输出:
A @ python =
[ 6.71328548e-09-6.37871800e-09j 6.71328548e-09+3.62128200e-09j
-6.39980441e-09+3.54772201e-09j]
A @ matlab =
[-1.48162680e-05-4.63408070e-05j -1.48162680e-05-4.63408070e-05j
-3.19703608e-02+3.31792682e-01j]
python / matlab =
[1.06043801+0.01707621j 1.06065285+0.01698805j 0.59761752+0.53448467j
1.06051995+0.01697013j]
abs(python) =
1.0000000015891697