当A是奇异平方和完全(稠密)矩阵时,MATLAB A\B是如何计算的? 您所在的位置:网站首页 matlab怎么01矩阵 当A是奇异平方和完全(稠密)矩阵时,MATLAB A\B是如何计算的?

当A是奇异平方和完全(稠密)矩阵时,MATLAB A\B是如何计算的?

2023-04-24 14:02| 来源: 网络整理| 查看: 265

我正在研究像A*X = B这样的线性方程组。我得到了像A = magic(4)和B = [1;3;2;4]这样的矩阵。我使用了几种方法来解决这个问题,也包括MATLAB A\B。

令人烦恼的是,MATLAB A\B的结果不同于NumPy、SciPy和LAPACK (LAPACKE_dgetrf,LAPACKE_dgels,LAPACKE_dgelsd)。

翻耕就是结果。

MATLAB A\B (UbuntuMatlab2021A和Matlab )

>> A = magic(4) A = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 >> B = [1;3;2;4] B = 1 3 2 4 >> A \ B RCOND = 4.625929e-18。 ans = -0.0098 0.0735 0.1985 0.0319 >> lsqr(A, B) ans = 0.0110 0.1360 0.1360 0.0110 >> x = pinv(A)*B x = 0.0110 0.1360 0.1360 0.0110 >> [L, U, P] = lu(A) %lu decomposition L = 1.0000 0 0 0 0.2500 1.0000 0 0 0.5625 0.4352 1.0000 0 0.3125 0.7685 1.0000 1.0000 U = 16.0000 2.0000 3.0000 13.0000 0 13.5000 14.2500 -2.2500 0 0 -1.8889 5.6667 0 0 0 0.0000 P = 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 >> y = L \ (P * B) % LU tril solver y = 1.0000 3.7500 -0.1944 0.0000 >> x = U \ y % LU triu solver x = -0.0098 0.0735 0.1985 0.0319

Python numpy.linalg.solve(a, b)

import numpy as np a = np.array([[16., 2., 3., 13.], [5., 11., 10., 8.], [9., 7., 6., 12.], [4., 14., 15., 1.]]); b = np.array([[1.],[3.],[2.],[4]]); x = np.linalg.solve(a, b) ''' x = array([[ 0.10799632], [ 0.42693015], [-0.15487132], [-0.0859375 ]]) '''

Python scipy.linalg.solve(a, b)

from scipy import linalg x1 = linalg.solve(a, b) ''' x1 = array([[ 0.10799632], [ 0.42693015], [-0.15487132], [-0.0859375 ]]) '''

八度在线

octave:1> A = magic(4) A = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 octave:2> B = [1;3;2;4] B = 1 3 2 4 octave:3> A\B warning: matrix singular to machine precision, rcond = 1.30614e-17 ans = 0.011029 0.136029 0.136029 0.011029

Lapack LAPACKE_degelsd

a = Matrix(Row = 4, Col = 4, Major = ColMajor) 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 B = Vector(Size = 4) 1 3 2 4 info = 0 X = Vector(Size = 4) 0.107996 0.42693 -0.154871 -0.0859375

我的问题是MATLAB A \ B准确地计算了什么。我知道pinv(A) * B计算最小范数最小二乘解,np.linalg.solve和scipy.linalg.solve也是如此。

MATLAB参考页面上写着:

如果A是方阵,那么A\B大致等于inv(A)*B,但是MATLAB处理A\B的方式不同,而且更加健壮。

如果A的秩小于A中的列数,则x = A\B不一定是最小范数解。您可以使用x = pinv(A)*B.

或x = lsqminnorm(A,B)计算最小范数最小二乘解。

我知道,当A几乎是奇异的时候,解并不是唯一的。有许多可行的解决方案(如numpy,八度和LAPACK。他们解决了这个问题,使||AX - B||的范数通过QR,SVD(pinv)最小化。然而,是什么使matlab得到了它的解,它的神奇之处是什么?

所以,我想问一下,当A\B是一个奇异的平方矩阵时,A精确地计算了什么,以及A\B的结果是什么。

附注:

当线性方程组的系数矩阵是奇异的或几乎奇异的.aka时,我知道它没有唯一的解。病态的。根据\的参考页面,x = A\B不一定是最小范数的解决方案。我想知道A\B的基本细节。如果它不一定是最小范数解,那又是什么呢?据我所知,get,numpy,LAPACK和Octave得到了一个最小范数解。对于这个问题,还有什么我不知道的原因吗?



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有