Get a value from solution set returned as finiteset by Sympy Get a value from solution set returned as finiteset by Sympy python python

Get a value from solution set returned as finiteset by Sympy


I found the sympy library way in this link http://docs.sympy.org/latest/tutorial/manipulation.html

Use .args atribute in the function or result object. If I have a function:

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

The same applies for a result that is a finite set type.


A slightly more general solution is to simply convert the FiniteSet into a standard python list

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

Then you can extract elements using standard indexing — in this case a[0]. But then if you get multiple solutions, you can just pull out the one you want.


Weird. There's no description anywhere how to use the results of linsolve.

Even the specs only test the result set as a whole, without checking the elements separately.

Sequence unpacking

If you know that the system of equation admits at least one solution, you can use sequence unpacking with a trailing comma before the assignment :

>>> from sympy import linsolve, symbols, solve, Rational>>> a1, a2 = symbols('a1 a2')>>> equations = [-3*a1/10 - 3*a2/20 + Rational(1, 12), -3*a1/20 - 13*a2/105 + Rational(1, 20)]>>> equations[-3*a1/10 - 3*a2/20 + 1/12, -3*a1/20 - 13*a2/105 + 1/20]>>> linsolve(equations, a1, a2){(71/369, 7/41)}>>> solution, = linsolve(equations, a1, a2)>>> solution(71/369, 7/41)

This syntax will also work if there is an infinity of solution:

>>> solution, = linsolve([a1, a1], a1, a2)>>> solution(0, a2)

But it will fail if there are no solution:

>>> solution, = linsolve([a1 - 1, a1 - 2], a1, a2)ValueError: not enough values to unpack (expected 1, got 0)

which might be the desired behaviour.

Iterate over the solutions:

Another possibility is to simply iterate over the solutions:

>>> for solution in linsolve(equations, a1, a2):...     print(solution)... (71/369, 7/41)

Nothing happens if there's no solution:

>>> for solution in linsolve([a1 - 1, a1 - 2], a1, a2):...     print(solution)... 

solve instead of linsolve

You could also use solve instead of linsolve, even though it's not recommended by the project because it can output different types:

>>> solve(equations, a1, a2){a1: 71/369, a2: 7/41}>>> solve([a1 - 1, a1 - 2], a1, a2)[]