Matrix MATLAB对数误差

Matrix MATLAB对数误差,matrix,matlab,Matrix,Matlab,根据BCH公式(),如果我将X和Y作为两个反对称矩阵,那么使用matlab表示法,我应该将logm(expm(X)*expm(Y))作为反对称矩阵,因为线性项根据定义是反对称的,并且换向器是反对称的。现在的问题如下:- x = rand(5); y = rand(5); x = x-x'; y = y-y'; xy = logm(expm(100*1i*x)*expm(1i*y)) 我们可以看到,xy的MATLAB结果不是反对称的,但如果我将公式中的因子100替换为较小的数字,如1到15,则反

根据BCH公式(),如果我将X和Y作为两个反对称矩阵,那么使用matlab表示法,我应该将logm(expm(X)*expm(Y))作为反对称矩阵,因为线性项根据定义是反对称的,并且换向器是反对称的。现在的问题如下:-

x = rand(5);
y = rand(5);
x = x-x';
y = y-y';
xy = logm(expm(100*1i*x)*expm(1i*y))

我们可以看到,xy的MATLAB结果不是反对称的,但如果我将公式中的因子100替换为较小的数字,如1到15,则反对称性质仍然保留。如何更正此错误?如果需要,请随时提问

我在
Mathematica
中测试了您的代码,它比MATLAB更好地处理大量数据。您正在重载,即
expm(100*1i*x)
的组件的顺序为
10^50
。此外,即使对于较小的常数,如
20
expm(100*1i*x)*expm(1i*y)
的最小特征值与另一个相比变得非常小,这使得矩阵对数非常不精确。

计算矩阵指数时,您确定没有溢出吗?vsoftco:是,我想这可能是问题所在。Hi-vsoftco,Mathematica是否能够处理表达式中较大(>20)的常数?不太可能,因为它认为在计算矩阵对数时特征值为零。只要它起作用,你就会得到你想要的,一个反对称矩阵。但是你可以重新缩放矩阵,比如
x=x/1000
y=y/1000
,这样你就不会再溢出了。vsoftco:使用任意精度会没有帮助吗?我无法按您提到的方式重新缩放矩阵,因为我的系统不是线性的,也不可能跟踪缩放的效果。@user56199我不确定任意精度,我不知道如何在MATLAB中使用它。我觉得有点奇怪,你不能重新缩放,你不能用exp(cA)=[exp(a)]^c(这对矩阵也是如此)这个事实吗?vsoftco:作为一个例子,我不知道矩阵M1、M2和M3的缩放将如何改变数量日志(跟踪(exp(M1)*exp(M2)*exp(M3)),因为([exp(M1)]^c)*[exp(M2)]^c)*[exp(M3)]^c)与[exp(M1)*exp(M2)*exp(M3)]^c,因为它们是不通勤的