我正在尝试使用solveset(equation,variable)解方程,这将使我得到变量的值。结果,我得到一个FiniteSet {value}。此FiniteSet是否可访问,以便我可以将值(希望是float类型)用于下一次计算?
问题如下:
我定义了三个SymPy符号(drift1, drift2, drift3 = symbols('drift1 drift2 drift3')
),它们应作为以下计算的占位符。他们没有价值。它们是两个方程式的一部分(equation1
和equation2
,都是drift1, drift2
和drift3
的函数)。
我的目标是对迭代循环进行编程,以通过求解两个方程来优化所有三个符号drift1,drift2和drift3,并将结果用于下一个迭代步骤。为此,我定义了三个Python变量x, y
和z
,a和y的初始值为0.0188
和0.0099
。 z是x和y的函数,将在每个迭代步骤中重新计算。
在第一步中,使用x和y(以及我在代码中定义的其他变量)计算z,然后用等式1中的y和z代替drift2和drift3(现在,方程是drift1的函数)。通过向漂流1激活equation1=0
,我正在使用solveset(equation1.subs(drift2, y).subs(drift3, z), drift1)
并得到一个FiniteSet
,其中包含结果。我将通过执行solveset(equation2.subs(drift1, result from FiniteSet).subs(drift3, z), drift2)
将这个结果用于求解第二个方程。这不起作用,因为结果不是float
类型,而是sympy.sets.sets.FiniteSet
类型。
谁能告诉我如何将FiniteSet的值(在FiniteSet的“内部”; {value})用于下一次计算?我使用Pyhton 3和SymPy。
import numpy as np
from sympy import *
import scipy as sp
drift1, drift2, drift3 = symbols('drift1 drift2 drift3')
init_printin(use_unicode=True)
equation1 = 0.005*(drift1*(-23.88*drift2*(15.16*drift3 + 1.15)-20.31*drift3
+00.47*drift2*(15.16*drift3+1.15)+1.03*drift3+0.05))/drift1
equation2 = 0.005*(drift1*(35.73*drift2*(-13.79*drift3 + 0.86)+7.91*drift3+2.09)
+1.65*drift2*(-13.79*drift3+0.86)+0.75*drift3+0.07)/drift1
x, y = 0.0188, 0.0099
gesamtlaenge = 1.676
laenge1 = 0.04
laenge2 = 0.02
# the loop for the iteration is not included in this code
# the only thin I wanna know is how to substitute drift1 by the solution of
# the first calculation sol1
z = gesamtlaenge-laenge1-laenge2-x-y
expr1 = equation1.subs(drift2, y).subs(drift3, z)
sol1 = solveset(equation, drift1)
# up to this point, the code is running, but now, I get a FiniteSet {0.047} as
# result for sol1 and I wanna use this value to substitute drift1 in the next calculation
expr2 = equation2.subs(drift1, sol1).subs(drift3, z)
sol2 = solveset(equation, drift2)
print(drift1, drift2, drift3)
当我执行expr2 = equation2.subs(drift1, sol1).subs(drift3, z)
时,我得到的方程式2是drift1和drift2的函数,因为它不能使用FiniteSet {0,047}中的值(0.047是我需要的值)。我知道为什么会这样,但是我没有解决办法。
感谢您的帮助!干杯
答案 0 :(得分:0)
您可以通过转换为列表来访问FiniteSet的元素。在这种情况下,如果有一个解决方案,则list(sol1).pop()
将起作用:
>>> sol1 = FiniteSet(1)
>>> x.subs(x, list(sol1).pop())
1