Python-Интерполированный полином, где коэффициенты являются матрицами - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть многочлен вида:

p(y) = A + By + Cy^2 ... + Dy^n

Здесь каждый из коэффициентов A,B,..,D является матрицей (и, следовательно, p(y) также является матрицей). Скажем, я интерполирую многочлен в n+1 точках. Теперь я должен быть в состоянии решить эту систему. Я пытаюсь сделать это в Numpy. У меня есть следующий код прямо сейчас:

a = np.vander([0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2]) #polynomial degree is 12, a -> (12x12)
b = np.random.rand(12,60,60) #p(x) is a 60x60 matrix that I have evaluated at 12 points
x = np.linalg.solve(a,b)

Я получаю следующую ошибку:

ValueError: solve: Input operand 1 has a mismatch in its core dimension 0, with gufunc signature (m,m),(m,n)->(m,n) (size 60 is different from 12)

Как я могу решить эту систему в Numpy, чтобы получить x? Есть ли в этом общий математический трюк?

1 Ответ

0 голосов
/ 10 сентября 2018

По сути, вы просто делаете 3600 12d полиномиальных регрессий и объединяете коэффициенты в матрицы. Например, компонент p(y)[0,0] просто:

p(y)[0, 0] = A[0, 0] + B[0, 0] * y + C[0, 0] * y**2 ... + D[0, 0] * y**n

Проблема в том, что np.linalg.solve может принимать только одно измерение коэффициентов. Но поскольку все элементы вашей матрицы независимы (y является скалярным), вы можете ravel их и вы можете выполнить вычисление с помощью формы (m,m),(m,n**2) -> (m,n**2) и изменить форму матрицы. Так что попробуйте:

a = np.vander([0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2]) #polynomial degree is 12, a -> (12x12)
b = np.random.rand(12,60,60) #p(x) is a 60x60 matrix that I have evaluated at 12 points
s = b.shape
x = np.linalg.solve(a, b.reshape(s[0], -1))
x = x.reshape(s)
...