2015-03-13 12 views
5

Chciałbym użyć numpy.linalg.solve do rozwiązania równania algebry liniowej, ale mam komunikat o błędzie "Ostatnie 2 wymiary tablicy muszą być kwadratowe". Proszę rzucić trochę światła, dziękuję bardzo! oto mój kod:Algebra liniowa na pytonie

import numpy as np 
from numpy. linalg import solve 

A = np.array([[3,-1,-1,0,0,0], [-1,4,-1,-1,0,0], [0,0,-1,-1,4,-1], [0,0,0,-1,-1,3]],float) 

w = np.array([5,5,0,0],float) 

v = solve(A,w) 

print(v) 
+0

Aby wykonać operację rozwiązywania, musisz odwrócić macierz A, a tylko macierze kwadratowe są odwracalne. Jeśli chcesz rozwiązać problem niedokładnie, możesz użyć operacji zwanej [pseudoinwersja] (http://en.wikipedia.org/wiki/Moore%E2%80%93Penrose_pseudoinverse), a następnie pomnożyć ją przez v, aby uzyskać v. –

+3

@ castle-bravo lub mógłby użyć 'numpy.linalg.lstsq (A, w)' – jandob

+0

@jandob Właśnie miałem zaimplementować dla niego funkcję pseudo-odwrotną, ale widzę, że już zostało zrobione dla mnie. :) –

Odpowiedz

2

Co ten błąd w zasadzie mówi, że system liniowy nie może być rozwiązany w sposób jawny. Dzieje się tak dlatego, że masz 6 zmiennych i tylko 4 równania. Innymi słowy, macierz współczynników musi być kwadratową macierzą. Błąd jest podniesione, gdy:

max(a.shape[-2:]) != min(a.shape[-2:]): 
4

jako igavriil pisał już numpy.linalg.solve mogą być stosowane tylko do stwierdzenia (dokładne) w ciągu dobrze określonym układzie (tzn sqare macierzy współczynników). Jeśli twój system jest niedostatecznie lub nadmiernie zdeterminowany, zwykle nie ma dokładnego rozwiązania.

Jeśli chcesz znaleźć przybliżone rozwiązanie, możesz użyć numpy.linalg.lstsq. Używa metody zwanej "dopasowywaniem najmniejszych kwadratów", aby znaleźć rozwiązanie, które minimalizuje ogólny błąd.