Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从Symphy返回为finiteset的解决方案集中获取值_Python_Sympy - Fatal编程技术网

Python 从Symphy返回为finiteset的解决方案集中获取值

Python 从Symphy返回为finiteset的解决方案集中获取值,python,sympy,Python,Sympy,我正在Python Symphy库中创建一个脚本,并尝试访问solveset()和linsolve()函数返回的结果。我的问题是这些函数返回的对象是finiteset类型,我想自动选择一些结果,以便在其他等式中重新输入它。 有人能帮我吗 例如: 然后使用linsolve()方法解决它 结果是正确的,但我无法将这些结果输入到变量中 O尝试了DIC、列表、元组和索引命令,但始终返回错误。“Finiteset对象没有属性'command'”您可以使用iter获取基于集合的迭代器,然后next返回该集合

我正在Python Symphy库中创建一个脚本,并尝试访问solveset()和linsolve()函数返回的结果。我的问题是这些函数返回的对象是finiteset类型,我想自动选择一些结果,以便在其他等式中重新输入它。 有人能帮我吗

例如:

然后使用linsolve()方法解决它

结果是正确的,但我无法将这些结果输入到变量中


O尝试了DIC、列表、元组和索引命令,但始终返回错误。“Finiteset对象没有属性'command'”

您可以使用
iter
获取基于集合的迭代器,然后
next
返回该集合的一个元素(如果您只需要一个元素)

例如:

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

现在x0是6/5,y0是4/5。

更一般的解决方案是简单地将
FiniteSet
转换成标准的python
list

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

然后,您可以使用标准索引提取元素—在本例中为
a[0]
。但是如果你有多个解决方案,你只需要拿出你想要的一个就可以了。

我在这个链接中找到了sympy库的方法

在函数或结果对象中使用.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)

这同样适用于有限集类型的结果。

您可以将
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)] )

奇怪。没有任何地方描述如何使用的结果

即使是唯一的测试,也会将结果集作为一个整体进行测试,而不会单独检查元素

序列解包 如果您知道方程组至少允许一个解,则可以在赋值前用逗号结尾:

>>> 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)
如果有无穷多个解决方案,此语法也会起作用:

>>> solution, = linsolve([a1, a1], a1, a2)
>>> solution
(0, a2)
>>> solution, = linsolve([a1 - 1, a1 - 2], a1, a2)
ValueError: not enough values to unpack (expected 1, got 0)
>>> for solution in linsolve([a1 - 1, a1 - 2], a1, a2):
...     print(solution)
... 
但如果没有解决方案,它将失败:

>>> solution, = linsolve([a1, a1], a1, a2)
>>> solution
(0, a2)
>>> solution, = linsolve([a1 - 1, a1 - 2], a1, a2)
ValueError: not enough values to unpack (expected 1, got 0)
>>> for solution in linsolve([a1 - 1, a1 - 2], a1, a2):
...     print(solution)
... 
这可能是理想的行为

迭代解决方案: 另一种可能是简单地迭代解决方案:

>>> for solution in linsolve(equations, a1, a2):
...     print(solution)
... 
(71/369, 7/41)
如果没有解决方案,则不会发生任何事情:

>>> solution, = linsolve([a1, a1], a1, a2)
>>> solution
(0, a2)
>>> solution, = linsolve([a1 - 1, a1 - 2], a1, a2)
ValueError: not enough values to unpack (expected 1, got 0)
>>> for solution in linsolve([a1 - 1, a1 - 2], a1, a2):
...     print(solution)
... 
求解而不是linsolve 您也可以使用
solve
代替,即使它是由项目提供的,因为它可以输出不同的类型:

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

FiniteSet有一个返回元组的
args()
方法


FiniteSet
是无序的。可能不可能知道哪一个是“你想要的”。