我在Python Sympy库中创建一个脚本,并尝试访问solveset()和linsolve()函数返回的结果.我的问题是这些函数返回的对象是有限集类型,我想自动选择一些结果,以便在其他方程中重新输入它.任何人都可以帮助我?
一个例子: 我创建了一个包含两个未知变量的方程列表:
>>> 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]
Run Code Online (Sandbox Code Playgroud)
然后使用linsolve()方法解决它.
>>> a = linsolve(lista,a1,a2)
>>> a
{(71/369, 7/41)}
Run Code Online (Sandbox Code Playgroud)
结果是正确的,但我无法将这些结果输入变量.
我尝试了dics,list,tuples,indexing命令,但总是返回错误."Finiteset对象没有属性'命令'"
Pli*_*lva 12
我在这个链接http://docs.sympy.org/latest/tutorial/manipulation.html找到了sympy library方式
在函数或结果对象中使用.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)
Run Code Online (Sandbox Code Playgroud)
这同样适用于有限集类型的结果.
一个稍微更通用的解决方案是简单地将其FiniteSet转换为标准的pythonlist
>>> a=list(linsolve(lista,a1,a2))
>>> a
[(71/369, 7/41)]
Run Code Online (Sandbox Code Playgroud)
然后您可以使用标准索引提取元素 - 在本例中为a[0]。但是,如果您有多种解决方案,则可以只取出您想要的一种。
奇怪的。任何地方都没有描述如何使用linsolve.
甚至规范也只测试整个结果集,而不单独检查元素。
如果您知道方程组至少有一个解,您可以在赋值之前使用带有尾随逗号的序列解包:
>>> 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)
Run Code Online (Sandbox Code Playgroud)
如果有无限的解决方案,此语法也将起作用:
>>> solution, = linsolve([a1, a1], a1, a2)
>>> solution
(0, a2)
Run Code Online (Sandbox Code Playgroud)
但是如果没有解决方案就会失败:
>>> solution, = linsolve([a1 - 1, a1 - 2], a1, a2)
ValueError: not enough values to unpack (expected 1, got 0)
Run Code Online (Sandbox Code Playgroud)
这可能是所需的行为。
另一种可能性是简单地迭代解决方案:
>>> for solution in linsolve(equations, a1, a2):
... print(solution)
...
(71/369, 7/41)
Run Code Online (Sandbox Code Playgroud)
如果没有解决方案,则不会发生任何事情:
>>> for solution in linsolve([a1 - 1, a1 - 2], a1, a2):
... print(solution)
...
Run Code Online (Sandbox Code Playgroud)
您也可以使用solve代替linsolve,即使项目不推荐使用它,因为它可以输出不同的类型:
>>> solve(equations, a1, a2)
{a1: 71/369, a2: 7/41}
>>> solve([a1 - 1, a1 - 2], a1, a2)
[]
Run Code Online (Sandbox Code Playgroud)
小智 5
您可以使用iter基于集合的迭代器,然后next返回该集合的一个元素(如果您只需要一个元素)。
例子:
from sympy import *
var('x y')
sol = linsolve([x+y-2, 2*x-3*y], x, y)
(x0, y0) = next(iter(sol))
Run Code Online (Sandbox Code Playgroud)
现在 x0 是 6/5,y0 是 4/5。
| 归档时间: |
|
| 查看次数: |
5729 次 |
| 最近记录: |