Мне нравится подход @ jp-sena, и то, что я собираюсь предложить, выглядит очень похоже на него.Разница в том, что вам не нужно знать, сколько символов вам понадобится - вы просто получите доступ к нужному количеству по индексу.Используйте IndexedBase
в качестве символа:
>>> x = IndexedBase('x') # you've got access to a virtual array of x values
>>> solve(x[1]**2 + 1/x[4], x[4])
[-1/x[1]**2]
Для отображения целей вы можете захотеть создать словарь замены.Чтобы создать пронумерованные символы, вы можете сделать
>>> reps = dict(zip([x[i] for i in range(n_used+1)], numbered_symbols('c')))
>>> (x[2]**2 + 1/x[4]).subs(reps)
c2**2 + 1/c4
Или, если вы используете менее 26 символов, вы можете использовать буквы с
>>> reps = dict(zip([x[i] for i in range(n_used+1)], symbols('a:z')))
>>> (x[2]**2 + 1/x[4]).subs(reps)
c**2 + 1/e
BTW, x
- IndexedBase и x[1]
является индексированным объектом, чей .base
равен x
, а чей .indices
является кортежем любых чисел, указанных в скобках.IndexedBase и Indexed будут отображаться в запросе .free_symbols
.
>>> (x[1,2] + 3).free_symbols
{x, x[1, 2]}
>>> x[1, 2].indices
(1, 2)
>>> x[1].base
x