Решить переопределенную систему линейных уравнений

У меня довольно простая система уравнений вида:

1*A + 0*B + x2*C + y2*D = x1
0*A + 1*B + y2*C + x2*D = y1

где пары (x1,y1) а также (x2,y2) известны поплавки длины N (система переопределена), и мне нужно решить для A, B, C, D параметры.

Я играл с numpy.linalg.lstsq но я не могу понять формы матриц правильно. Это то, что у меня есть

import numpy as np

N = 10000
x1, y1 = np.random.uniform(0., 5000., (2, N))
x2, y2 = np.random.uniform(0., 5000., (2, N))

# 1*A + 0*B + x2*C + y2*D = x1
# 0*A + 1*B + y2*C + x2*D = y1

l1 = np.array([np.ones(N), np.zeros(N), x2, y2])
l2 = np.array([np.zeros(N), np.ones(N), y2, x2])

M1 = np.array([l1, l2])
M2 = np.array([x1, y1])

ABCD = np.linalg.lstsq(M1, M2)[0]
print(ABCD)

который терпит неудачу с:

numpy.linalg.linalg.LinAlgError: 3-dimensional array given. Array must be two-dimensional

Что я делаю неправильно?

2 ответа

Решение

Сохранение всего остального, изменение M1 а также M2 в

M1 = np.vstack([l1.T, l2.T])
M2 = np.concatenate([x1, y1])

должен сделать работу.

Ваша конкатенация является проблемой, а также параметры для lstsq() должны быть транспонированы.

M1 = np.hstack((l1,l2))
M2 = np.hstack((x1,x2))
ABCD = np.linalg.lstsq(M1.T,M2.T)[0]
Другие вопросы по тегам