ill conditioned matrix in solving Ax=b

import numpy as np
from scipy.stats import ortho_group
from scipy.sparse import diags
from scipy import linalg
m = ortho_group.rvs(dim=5)
n = ortho_group.rvs(dim=5)
diags([5,4,3,2,1], 0).toarray()
array([[5., 0., 0., 0., 0.],
       [0., 4., 0., 0., 0.],
       [0., 0., 3., 0., 0.],
       [0., 0., 0., 2., 0.],
       [0., 0., 0., 0., 1.]])

A_2(A_4?) is ill-conditioned matrix

A_1 =  m.dot(diags([5,4,3,2,1], 0).toarray()).dot(n)
A_2 =  m.dot(diags([5,4,3,2,0.0001], 0).toarray()).dot(n)
A_3 =  m.dot(diags([5,4,3,2,0], 0).toarray()).dot(n)
A_4 =  m.dot(diags([5,4,3,2,0.1], 0).toarray()).dot(n)
A_1, A_2, A_3, A_4
(array([[-0.55566913,  2.04645047, -1.57075981, -1.03585735,  0.28237642],
        [ 0.37827036,  1.23656925,  2.69465746,  0.00738389, -0.46622797],
        [ 2.61288533,  1.06003315, -1.78241794,  1.14530535, -1.99268424],
        [ 0.89961978, -1.76338331,  0.31624842, -1.53316259,  1.95653327],
        [-0.88055263,  1.93268915,  1.01707394, -0.17647025, -2.35550117]]),
 array([[-0.55940083,  1.97018217, -1.58348281, -1.16246037,  0.16925816],
        [ 0.36988933,  1.06527827,  2.66608288, -0.27695382, -0.72028023],
        [ 2.6142239 ,  1.08739079, -1.77785416,  1.19071819, -1.95210843],
        [ 0.91032536, -1.54458322,  0.35274842, -1.16996123,  2.28104925],
        [-0.86643455,  2.22123367,  1.06520863,  0.30250471, -1.9275429 ]]),
 array([[-0.55940121,  1.97017454, -1.58348408, -1.16247303,  0.16924685],
        [ 0.36988849,  1.06526114,  2.66608002, -0.27698225, -0.72030564],
        [ 2.61422403,  1.08739352, -1.77785371,  1.19072273, -1.95210437],
        [ 0.91032643, -1.54456134,  0.35275207, -1.1699249 ,  2.2810817 ],
        [-0.86643314,  2.22126253,  1.06521344,  0.30255261, -1.9275001 ]]),
 array([[-0.559028  ,  1.97780213, -1.58221165, -1.14981147,  0.18055981],
        [ 0.37072668,  1.08239195,  2.66893777, -0.24854564, -0.69489787],
        [ 2.61409016,  1.08465749, -1.77831013,  1.18618099, -1.95616236],
        [ 0.90925577, -1.56644353,  0.3491017 , -1.20624867,  2.24862686],
        [-0.86784509,  2.19240519,  1.06039949,  0.25465032, -1.97030021]]))
b = np.array([7,5,3,1,1])
x_1 = linalg.inv(A_1.T.dot(A_1)).dot(b)
x_2 = linalg.inv(A_2.T.dot(A_2)).dot(b)
x_3 = linalg.inv(A_3.T.dot(A_3)).dot(b)
x_4 = linalg.inv(A_4.T.dot(A_4)).dot(b)

x_2,3,4 is not very good

x_1, x_2, x_3, x_4
(array([1.3766838 , 2.17441668, 0.71923842, 1.74497268, 2.51336606]),
 array([7.34571152e+06, 1.50131205e+08, 2.50447280e+07, 2.49213142e+08,
        2.22668895e+08]),
 array([-3.50631225e+14, -7.16618086e+15, -1.19545466e+15, -1.18956380e+16,
        -1.06286070e+16]),
 array([  8.64893787, 150.80432815,  25.51352194, 248.46601644,
        222.95560073]))
sigma_plus = linalg.inv(diags([5,4,3,2,1], 0).toarray())
sigma_plus[-1,-1] = 0
sigma_plus
array([[ 0.2       ,  0.        ,  0.        ,  0.        , -0.        ],
       [ 0.        ,  0.25      ,  0.        ,  0.        , -0.        ],
       [ 0.        ,  0.        ,  0.33333333,  0.        , -0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.5       , -0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ,  0.        ]])

pseudoinverse

x_pseudo = n.dot(sigma_plus).dot(m).dot(b)
x_pseudo
array([-0.16978402, -0.07097868,  0.99297169, -1.85485295,  1.44494874])
Written on January 4, 2022