eig (a, b) в Python, выдавая ошибку «принимает 1 позиционный аргумент, но 2 даны» - PullRequest
0 голосов
/ 15 января 2019

Согласно https://docs.scipy.org/doc/numpy-1.15.0/user/numpy-for-matlab-users.html, эквивалентное числовое выражение для MATLAB [V,D]=eig(a,b) равно V,D = np.linalg.eig(a,b).

Но когда я пытаюсь это сделать, я получаю ошибку:

TypeError: eig() takes 1 positional argument but 2 were given

Я в замешательстве, документация гласит: np.linalg.eig может принимать два аргумента?

Любопытно, что когда я смотрю документацию linalg на https://docs.scipy.org/doc/numpy-1.15.1/reference/routines.linalg.html, под заголовком «Собственные значения матрицы», нет упоминания о том, что linalg.eig принимает два аргумента?

Как я могу заставить eig принять два аргумента, как в MATLAB?

Это работает в MATLAB

a = diag(ones(3,1));
b = diag(2*ones(3,1));
[V,D] = eig(a,b)

Вывод:

V =

    0.7071         0         0
         0    0.7071         0
         0         0    0.7071


D =

    0.5000         0         0
         0    0.5000         0
         0         0    0.5000

Это не работает в Python

import numpy as np

a = np.diag(np.ones(3))
b = np.diag(2*np.ones(3))

V,D = np.linalg.eig(a,b)

Ошибка:

TypeError: eig() takes 1 positional argument but 2 were given

1 Ответ

0 голосов
/ 15 января 2019

Как вы видели в документах numpy.linalg.eig, он принимает только один аргумент массива и, соответственно, не вычисляет обобщенные задачи на собственные значения.

К счастью, у нас есть scipy.linalg.eig:

scipy.linalg.eig(a, b=None, left=False, right=True, overwrite_a=False, overwrite_b=False, check_finite=True, homogeneous_eigvals=False)

    Solve an ordinary or generalized eigenvalue problem of a square matrix.

Вот ваш пример:

import numpy as np 
import scipy.linalg 

a = np.diag(np.ones(3)) 
b = np.diag(2*np.ones(3)) 
eigvals,eigvects = scipy.linalg.eig(a, b) 

Теперь у нас есть

>>> eigvals
array([0.5+0.j, 0.5+0.j, 0.5+0.j])

>>> eigvects
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

Разница в собственных векторах может быть связана с другим выбором нормализации для собственных значений. Я бы проверил с двумя нетривиальными матрицами и посмотрел бы, соответствуют ли результаты друг другу (конечно, сравнивая соответствующие пары собственных значений и собственных векторов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...