2016-07-17 1 views
6

Я создаю скрипт в библиотеке Symbian Python и пытаюсь получить доступ к результатам, возвращаемым функциями solveset() и linsolve(). Моя проблема заключается в том, что объект, возвращаемый этими функциями, имеет тип finiteset, и я хочу автоматически выбрать некоторые результаты для повторного ввода его в другие уравнения. Любое тело может мне помочь?Получите значение из набора решений, возвращаемого как finiteset by Sympy

пример: создать список уравнений с двумя неизвестными:

>>>lista=[eq2_1,eq2_2] 
>>>str(lista) 
[-3*a1/10 - 3*a2/20 + 1/12, -3*a1/20 - 13*a2/105 + 1/20] 

Затем решить с помощью метода linsolve().

>>>a=linsolve(lista,a1,a2) 
>>>a 
{(71/369, 7/41)} 

Результат верный, но я не могу получить эти результаты в переменной.

O проверенные типы, списки, кортежи, команды индексирования, но всегда возвращайте ошибку. «Объекты Finiteset не имеет атрибута„команда“»

ответ

2

Вы можете использовать iter, чтобы получить итератор на основе набора, а затем next возвращает один элемент из этого набора (если вам нужен только один элемент).

Пример:

from sympy import * 
var('x y') 
sol = linsolve([x+y-2, 2*x-3*y], x, y) 
(x0, y0) = next(iter(sol)) 

Теперь х0 6/5 и 4/5 у0.

2

Несколько более общее решение, чтобы просто преобразовать FiniteSet в стандартный питон list

>>> a=list(linsolve(lista,a1,a2)) 
>>> a 
[(71/369, 7/41)] 

Затем вы можете извлечь элементы, используя стандартную индексацию - в этом случае a[0]. Но тогда, если вы получите несколько решений, вы можете просто вытащить тот, который вы хотите.

4

Я нашел SymPy библиотеки путь в этой ссылке http://docs.sympy.org/latest/tutorial/manipulation.html

Используйте .args atribute в функции или объекта результата. Если у меня есть функция:

>>>func = Eq(u(x),−x+sin(x)) 
>>>func 
u(x) = -x + sin(x) 
>>>func.args[0] 
u(x) 
>>>func.args[1] 
-x+sin(x) 

То же самое относится к результату, который является конечным множеством типа.

+0

Это правильный ответ – shrewmouse

0

Вы можете использовать tuple в сочетании с аргументом распаковке:

var('x y z') 
eqs = [ x + y + z - 1, x + y + 2*z - 3 ] 
sol = linsolve(eqs, x, y, z) 
(x0, y0, z0) = tuple(*sol) 

Теперь вы можете проверить решение с:

eqs[0].subs([(x, x0), (y, y0), (z, z0)]) 
eqs[1].subs([(x, x0), (y, y0), (z, z0)])