嗨,我尝试使用sympy在以下等式中求解一个变量(x):

python - 求和求一个变量-LMLPHP

其中s_calc是:

python - 求和求一个变量-LMLPHP

因此给出mkt为3.60 SP,如下所示。

这是在Excel中通过猜测进行手动计算的结果,其中x近似为3.84(这是我要确定的):

python - 求和求一个变量-LMLPHP

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])

10-07 17:33