Отобразить решения Linsolve для индексированных символов в Sympy - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь решить систему линейных уравнений с использованием linsolve в Sympy для диапазона значений.Для простоты ниже я покажу, что я пытался сделать, используя простые уравнения.

 from sympy import symbols, linsolve, IndexedBase
 m = 2
 n = symbols('n', integer=True)
 x, y = symbols('x, y', cls=IndexedBase)
 for n in range (0, m+1):
        E1 = 2*x[n] + 5*y[n] - 33 + 2*n
        E2 = x[n] + 3*y[n] - 19 + 4*n
        sol = linsolve([E1, E2], [x[n], y[n]])
        (x[n], y[n]) = tuple(*sol)

Это возвращает ошибку «Объект IndexedBase не поддерживает назначение элементов».Как можно сопоставить значения решения с индексированными символами, чтобы я мог использовать их позже в коде (например, взять сумму всех значений x (x [0] + x [1] + x [2])«Я ищу надежное решение, так как для реальных уравнений значение m может быть около 500.

1 Ответ

0 голосов
/ 07 октября 2018

объекты SymPy неизменны;к ним нельзя прикрепить числовые данные.«х» - это всегда просто символ «х»;и «x [2]» является индексированным символом «x [2]».Они не связаны ни с какими числовыми значениями.Для хранения решений используйте список кортежей или словарь (или список словарей), в зависимости от того, что удобнее.

solutions = {}
for n in range(0, m+1):
    E1 = 2*x[n] + 5*y[n] - 33 + 2*n
    E2 = x[n] + 3*y[n] - 19 + 4*n
    sol = linsolve([E1, E2], [x[n], y[n]])
    solutions.update(dict(zip([x[n], y[n]], *sol)))
print(solutions)

Это печатает {x[0]: 4, y[0]: 5, x[1]: 18, y[1]: -1, x[2]: 32, y[2]: -7}.Затем вы можете использовать этот словарь в subs:

expr = x[0] + 3*y[2]
print(expr.subs(solutions))   # -17
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...