Python numpy матрица обратная дает неверные значения - PullRequest
0 голосов
/ 13 января 2020

Что я получаю:

>>> Pp
matrix([[ 0.01011  ,  0.0050535,  0.0010005],
        [ 0.0050535,  0.002526 ,  0.0005001],
        [ 0.0010005,  0.0005001,  0.0001   ]])
>>> Pp.I
matrix([[  4.73894021e+17,  -9.47740572e+17,  -1.65931645e+15],
        [ -9.47740572e+17,   1.89538621e+18,   3.31846669e+15],
        [ -1.65931645e+15,   3.31846669e+15,   5.81001542e+12]])

Что я думаю, что я должен получить:

matrix([[ -1.11110667e+09,   2.22220000e+09,   3.40000000e+06],
        [  2.22220000e+09,  -4.44433334e+09,  -7.00000001e+06],
        [  3.40000000e+06,  -7.00000001e+06,   1.00000000e+06]])

Я неправильно использую обратное?

Кстати , это тоже неправильно:

>>> np.linalg.inv(Pp)
matrix([[  4.73894021e+17,  -9.47740572e+17,  -1.65931645e+15],
        [ -9.47740572e+17,   1.89538621e+18,   3.31846669e+15],
        [ -1.65931645e+15,   3.31846669e+15,   5.81001542e+12]])

Я видел еще один пост по этому поводу, но у него не было четкого решения.

Ответы [ 3 ]

1 голос
/ 13 января 2020

С помощью простого копирования и вставки я получаю правильное значение - оба способа:

In [82]: [[ 0.01011  ,  0.0050535,  0.0010005], 
    ...:         [ 0.0050535,  0.002526 ,  0.0005001], 
    ...:         [ 0.0010005,  0.0005001,  0.0001   ]]                                                    
Out[82]: 
[[0.01011, 0.0050535, 0.0010005],
 [0.0050535, 0.002526, 0.0005001],
 [0.0010005, 0.0005001, 0.0001]]
In [83]: np.linalg.inv(_)                                                                                 
Out[83]: 
array([[-1.11110667e+09,  2.22220000e+09,  3.40000000e+06],
       [ 2.22220000e+09, -4.44433333e+09, -7.00000000e+06],
       [ 3.40000000e+06, -7.00000000e+06,  1.00000000e+06]])
In [84]: mm = np.matrix(_82)                                                                              
In [85]: mm.I                                                                                             
Out[85]: 
matrix([[-1.11110667e+09,  2.22220000e+09,  3.40000000e+06],
        [ 2.22220000e+09, -4.44433333e+09, -7.00000000e+06],
        [ 3.40000000e+06, -7.00000000e+06,  1.00000000e+06]])

Попробуйте Pp в чистом сеансе; что-то не так с вашей сессией. Или Pp, который вы показываете, не тот, который вы на самом деле используете.

0 голосов
/ 13 января 2020

Я сделал глупость в определении матрицы.

Я определил ее так:

Pp=np.matrix([(x11,x12,x13),(x21,x22,x23),(x31,x32,x33)])

вместо правильного пути, который:

Pp=np.matrix([[x11,x12,x13],[x21,x22,x23],[x31,x32,x33]])

Интересно, что все в значительной степени работало правильно, кроме обратного.

0 голосов
/ 13 января 2020

Сначала посмотрите на определитель матрицы с np.linalg.det(m). Результат равен -2.249999999256419e-18, что близко к 0.
Теоретически можно сказать, что эта матрица обратима, но из-за большого числа условий (используйте np.linalg.cond(m)) вы можете получить очень плохие результаты.
Попробуйте построение вашей матрицы следующим образом:

m = np.matrix([[ 0.01011  ,  0.0050535,  0.0010005],
        [ 0.0050535,  0.002526 ,  0.0005001],
        [ 0.0010005,  0.0005001,  0.0001   ]], dtype=np.float64)

Это действительно даст лучшие результаты для m.I:

matrix([[-1.11110667e+09,  2.22220000e+09,  3.40000000e+06],
        [ 2.22220000e+09, -4.44433333e+09, -7.00000000e+06],
        [ 3.40000000e+06, -7.00000000e+06,  1.00000000e+06]])

Проверка результатов с помощью m * m.I:

matrix([[ 1.00000000e+00,  8.19379276e-10,  6.10730759e-12],
        [-1.18821050e-10,  1.00000000e+00,  3.87522234e-12],
        [ 1.48254137e-11, -6.72848576e-11,  1.00000000e+00]])
...