嗨,我尝试使用sympy在以下等式中求解一个变量(x):
其中s_calc是:
因此给出mkt为3.60 SP,如下所示。
这是在Excel中通过猜测进行手动计算的结果,其中x近似为3.84(这是我要确定的):
s_calc为8.5 => 3.84 /(((8.5-1)+3.84)= 0.34
s_calc = (x/((SP-1)+x))
from sympy import *
SPs = [8.5,10,4.6,8,7,19,13,5,5.5,21,31,61]
mkt = 3.6
x = Symbol('x', real=True)
eqn = Eq((sum([(x/((SP-1)+x)) for SP in SPs])),mkt)
print solve(eqn)
结果是:
[-56.0760097663833,
-28.2321104629407,
-19.2596055912120,
-16.2599057021677,
-11.1953370291770,
-8.53265746170317,
-7.27171869196792,
-6.44292213715154,
-5.20607622713613,
-4.24324047973505,
-3.74708311709209,
0.0]
它不仅为我提供了一个值列表,该值列表与3.84(我计算出的x值)相似。另外,solve在计算上非常繁琐,花费了15秒钟才能得出这些结果。
我希望有人能够引导我朝正确的方向发展。
最佳答案
目前,SymPy中的功能solve()被重写为solveset(),将来,不建议使用solve。
无论如何,使用solveset():
In [13]: solveset(eqn, x)
Out[13]:
{-54.9173331680142, -27.8044066980778, -19.1811507147424, -15.7703025652324,
-11.0087893729661, -8.45970674653321, -7.25698321320126, -6.38855281836353,
-5.07892647766187, -4.21937087225829, -3.73292307178124, 3.83749333787992}
值3.83749333787992是解决方案之一(看起来有点像您的3.84)。
否则,由于您的方程式只有一个符号变量,其余的都是数字变量,因此您可以尝试对表达式进行lambd化并使用
scipy
中的工具:In [25]: eqfunc = lambdify(x, eqn.lhs - eqn.rhs)
In [26]: import scipy.optimize
In [28]: scipy.optimize.broyden1(eqfunc, [3.84])
Out[28]: array([ 3.83749334])