Как решить уравнение AX = B с помощью Python (NumPy, SciPy и т. Д.), Где A, X, B - матрицы, и все элементы X должны быть неотрицательными - PullRequest
2 голосов

Мне нужно решить уравнение AX = B, используя Python, где A, X, B - матрицы, и все значения X должны быть неотрицательными.

Лучшее решение, которое я нашел, это

X = np.linalg.lstsq(A, B, rcond=None)

но в результате X содержит отрицательные значения. Можно ли получить решение без отрицательных значений? Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 20 мая 2019

Как правило, это невозможно математически.Учитывая базовые требования, согласно которым A и B являются обратимыми, X является уникальной матрицей.Если вам не нравятся элементы, которые есть у X, вы не можете просто попросить другое решение: его нет.Вам придется изменить A или B, чтобы получить другой результат.

2 голосов
/ 20 мая 2019

Вы можете решить это с помощью cvxpy:

import cvxpy

def solve(A, B):
    """
    Minimizes |AX - B|**2, assuming A and B are 
    square matrices for simplicity. If this optimized 
    error is zero, this corresponds to solving AX = B.
    """
    n = A.shape[0]
    X = cvxpy.Variable((n,n))
    # Set objective
    obj_fun = cvxpy.sum_squares(A*X - B)
    objective = cvxpy.Minimize(obj_fun)
    # Set constraints
    constraints = [X >= 0]
    prob = cvxpy.Problem(objective, constraints)
    result = prob.solve(solver = "ECOS")
    return X.value

РЕДАКТИРОВАТЬ: Ответ Чернослив , я верю.Вы можете проверить, является ли ошибка в числовом решателе ненулевой, проверив results.

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