求解求和中的一个变量

时间:2017-04-28 08:36:42

标签: python math scipy sympy

大家好我在尝试使用sympy来解决以下等式中的一个变量(x):

enter image description here

其中s_calc是:

enter image description here

所以mkt给出为3.60 SP如下。

以下是猜测中的手动计算在Excel中看起来像是近似为3.84(这是我想要确定的):

enter image description here

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。另外,求解在计算上非常重,并且需要15秒才能产生这些结果。

我希望有人能指导我朝正确的方向发展。

1 个答案:

答案 0 :(得分:3)

SymPy中的函数 solve()目前正在被重写为 solveset(),将来, solve 可能会被弃用。< / p>

无论如何,使用 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)。

否则,因为你的等式只有一个符号变量而其余的是数字变量,你可以试着lambdify你的表达式并使用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])