Решить систему линейных уравнений AX = B в Python, np.linalg.solve не работает - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь решить линейное уравнение AX = B, где A, X, B. Матрицы.
Я пытался использовать функцию np.linalg.solve для numpy но результат кажется неправильным.
Пример:

Matrix A  
[9 1 8]  
[3 2 5]  
[1 6 5]  

Matrix B  
[7 0 5]  
[7 8 4]  
[5 6 7]  

Итак, для решения X я использовал:

X = np.linalg.solve(A,B)

Результат:

X  
[ 1.17521368 -0.17948718  0.40598291]  
[ 0.20512821 -0.30769231  0.74358974]  
[-0.56410256 -0.15384615  1.20512821]  

Но если я попытаюсь проверить результат, умножив A на X, результат будет отличным от B:

B
[ 5.40598291 -2.02564103  8.86752137]  
[ 7.61111111 -4.33333333 13.61111111]  
[ 3.15811966 -3.82051282 14.92735043]  

Если я использую это:

np.matmul(B, np.linalg.inv(A))

Вместо функции решения я получаю те же результаты.

Что-то мне здесь не хватает?

РЕДАКТИРОВАТЬ 1: Я напечатал

np.allclose(np.dot(A, X), B)

И возвращается Ложь

РЕДАКТИРОВАТЬ 2
Вот код, который я использую:

B = np.array([7,0,5,7,8,4,5,6,7]).reshape(3,3)
A = np.array([9,1,8,3,2,5,1,6,5]).reshape(3,3)
X = np.linalg.solve(A,B)
print(x)
#[[-1.70967742 -4.48387097  0.08064516]
# [-1.35483871 -2.74193548  0.79032258]
# [ 2.96774194  5.38709677  0.43548387]]

Мои извинения, если это очень простой вопрос, я ценю любую помощь.Спасибо.

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Мои результаты с вашими массивами выглядят правильно:

In [582]: A=np.array([9,1,8,3,2,5,1,6,5]).reshape(3,3)                                                
In [583]: B=np.array([7,0,5,7,8,4,5,6,7]).reshape(3,3)                                                
In [584]: x=np.linalg.solve(A,B)                                                                      
In [585]: x                                                                                           
Out[585]: 
array([[-1.70967742, -4.48387097,  0.08064516],
       [-1.35483871, -2.74193548,  0.79032258],
       [ 2.96774194,  5.38709677,  0.43548387]])
In [586]: A@x                                                                                         
Out[586]: 
array([[7., 0., 5.],
       [7., 8., 4.],
       [5., 6., 7.]])

Другой подход: AX=B => X=1/A B:

In [591]: np.linalg.inv(A)@B                                                                          
Out[591]: 
array([[-1.70967742, -4.48387097,  0.08064516],
       [-1.35483871, -2.74193548,  0.79032258],
       [ 2.96774194,  5.38709677,  0.43548387]])

И формально проверка на равенство:

In [602]: np.allclose(A@np.linalg.solve(A, B), B)                                                       
Out[602]: True
0 голосов
/ 28 мая 2019

Результат X правильный. Чтобы проверить правильность вашего решения, согласно официальным документам вы можете использовать allclose(), который должен возвращать True, если два массива (AX и B) одинаково поэлементно, в пределах допуска.

import numpy as np

A = np.array([[9, 1, 8], [3, 2, 5], [1, 6, 5]])  
B = np.array([[7, 0, 5], [7, 8, 4], [5, 6, 7]])  

X = np.linalg.solve(A,B)

np.allclose(np.dot(A, X), B)
# True

В вашем случае это действительно возвращает True.

...