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

2024-09-29 02:17:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在Python Sympy库中创建一个脚本,并试图访问solveset()和linsolve()函数返回的结果。我的问题是,这些函数返回的对象是finiteset类型,我想自动选择一些结果,将其重新输入到其他方程中。 有人能帮我吗?

例如:I create a list of equations with two unknown variables:

>>> a1, a2 = symbols('a1, a2')
>>> eq2_1 = Eq(-3*a1/10 - 3*a2/20 + 1/12)
>>> eq2_2 = Eq(-3*a1/20 - 13*a2/105 + 1/20)
>>> 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尝试了DIC、列表、元组、索引命令,但始终返回错误信息。“Finiteset对象没有属性“command”


Tags: 对象函数脚本a2类型a1createeq
3条回答

可以使用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。

我在这个链接中找到了sympy库方法http://docs.sympy.org/latest/tutorial/manipulation.html

在函数或结果对象中使用.args属性。 如果我有一个函数:

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

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

更一般的解决方案是简单地将FiniteSet转换为标准pythonlist

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

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

相关问题 更多 >