Симпи неизвестное назначение - PullRequest
0 голосов
/ 29 февраля 2020

Я пытаюсь создать python программу для решения уравнений:

from sympy import symbols, Eq, solve

list1 = ['x', 'y']                 #<--- Letters of the user input
list1[0] = symbols(list1[0])       #<--- Assignment of the unknown x
list1[1] = symbols(list1[1])       #<--- Assignment of the unknown y
eq1 = Eq(x*2 - 5*x + 6 + y, 0)     #<--- Equation
res = solve(eq1, dict=True)        #<--- Solving
print(res)

Я хочу присвоить значение первому и второму объекту 'list1', в этом регистр 'x = символы (' x ')' и 'y = символы (' y ')'. Поэтому я попытался заменить 'x' на list1 [0], а 'y' на list1 [1], потому что это может быть любая буква, основанная на вводе пользователем. Но сценарий все еще говорит «х не определено» в шестой строке. Итак, есть ли способ присвоить значение элементу массива?

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Когда вы начинаете работать с SymPy, требуется некоторое время, чтобы исправить разницу между объектами SymPy и Python переменными. Постарайтесь помнить, что каждая переменная является переменной Python и что вы присваиваете ей, зависит только от вас.

В строке 6 вы хотите использовать переменные x и y. Вы можете посмотреть в предыдущих строках, чтобы увидеть, что вы никогда не определяли x (что должно быть в lhs =). Это исправит ситуацию:

>>> x, y = map(Symbol, list1)

Не имеет значения, что находится в list1 в терминах строк. Они могут даже быть ['a', 'b']. Чем бы они ни были, они будут использоваться для создания символов SymPy, и они будут назначены Python переменным x и y. Затем они появятся в результатах уравнения, которое вы решаете:

>>> list1 = list('ab')
>>> x, y = map(Symbol, list1)
>>> solve(Eq(x*2 - 5*x + 6 + y, 0), dict=True)
[{a: b/3 + 2}]
0 голосов
/ 01 марта 2020

Проблема заключается в том, что вы создаете символы в контексте списка.

Когда вы выполняете уравнение, Python не находит переменную 'x' или 'y', потому что они не отображается / не виден вне списка.

Вы можете попробовать:

eq1 = Eq(list1[0]*2 - 5*list1[0] + 6 + list1[1], 0)

, чтобы получить результаты, но это не очень красиво

Или может работать следующее:

x = Symbol('a')
y = Symbol('y')
eq1 = Eq(x*2 - 5*x + 6 + y, 0)

Но если вы действительно хотите, чтобы символы отображались в модуле, вы можете сделать что-то вроде:

def symbol_references(in_list):
    for e in in_list:
       globals()[e] = Symbol(e)

symbol_references(['x', 'y'])
print(type(x))
print(type(y))
...