Решить неквадратную матрицу с помощью Python: как использовать numpy.linalg.lstsq ()? - PullRequest
0 голосов
/ 13 апреля 2019

Запрошенное поведение
Я хотел бы решить неквадратную матрицу с помощью python.Матрица имеет два линейно зависимых вектора.

Текущее состояние
Сначала я попытался использовать numpy.linalg.solve(), но это работает только для квадратных матриц.В других сообщениях StackOverflow рекомендуется использовать numpy.linalg.lstsq().

выпуск
Однако я не понимаю, как правильно реализовать numpy.linalg.lstsq().Функция правильно решает последний параметр, но не остальные параметры.Один пост рекомендует это решение , которое я тоже не понимаю.

Должен ли я каким-то образом реализовать цикл?

Может ли кто-нибудь предоставить мне пример кода?Как решить эту матричную проблему, используя python?

Мой текущий код

import numpy as np

# defining a linear equation system E=F with
#   | -2 * x1 - 4 * x2 + 1 * x3 -  9 * x4 + 0 * x5 =  +5  |
#   |  3 * x1 + 6 * x2 + 0 * x3 + 12 * x4 + 3 * x5 = +15  |
#   |  1 * x1 + 2 * x2 + 1 * x3 +  3 * x4 + 1 * x5 = -17  |
#   | -5 * x1 - 4 * x2 + 1 * x3 -  9 * x4 + 0 * x5 = +14  |


E=np.array(
    [
        [-2,-4,1,-9,0],
        [3,6,0,12,3],
        [1,2,1,3,1],
        [-5,-10,3,-23,1]
    ]
)

F=np.array(
    [3,15,-17,14]
)

solutionNonSquare = np.linalg.lstsq(E, F)
print('the solution vector is: {x1, x2, x3, x4, x5}=')
print(solutionNonSquare)

Письменное матричное решение enter image description here

1 Ответ

1 голос
/ 15 апреля 2019

Это недоопределенная система уравнений. Это означает, что существует много решений, и не существует такого понятия, как «решение». Тот факт, что исключение Гаусса и lstsq дают разные решения, не означает, что что-то не так.

Давайте сгенерируем и проверим различные решения:

import scipy.linalg as sla

E_null = sla.null_space(E)

def check_solution(coeffs):
    x = solutionNonSquare[0] + E_null @ coeffs
    check = E @ x - F
    with np.printoptions(precision=2, suppress=True):
        print('x = {}'.format(x))
    with np.printoptions(precision=5, suppress=True):
        print('E . x - F = {}'.format(check))
    print('|x| = {}'.format(np.linalg.norm(x)))

Мы можем проверить минимальное решение нормы, произведенное lstsq:

>>> check_solution([0, 0])
x = [ -4.35  -8.69 -19.69   2.31  17.5 ]
E . x - F = [ 0. -0. -0.  0.]
|x| = 28.174593028253167

Мы можем сгенерировать и протестировать множество других решений

>>> check_solution(100 * np.random.randn(2))
x = [ -88.93 -139.06   66.64   88.64   17.5 ]
E . x - F = [ 0.  0. -0.  0.]
|x| = 199.62363490542995
>>> check_solution(100 * np.random.randn(2))
x = [-25.2  -26.99  -5.33  16.67  17.5 ]
E . x - F = [ 0. -0. -0.  0.]
|x| = 44.455362582961335
>>> check_solution(100 * np.random.randn(2))
x = [ 93.34  14.57 -55.74 -33.74  17.5 ]
E . x - F = [ 0. -0. -0. -0.]
|x| = 116.09338153741933

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

>>> my_favourite_solution = np.array([-12.5, 0, -22, 0, 17.5 ])
>>> my_favourite_coeffs = my_favourite_solution @ E_null
>>> check_solution(my_favourite_coeffs)
x = [-12.5   0.  -22.   -0.   17.5]
E . x - F = [ 0. -0. -0.  0.]
|x| = 30.765240125830324
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...