大家好我在尝试使用sympy来解决以下等式中的一个变量(x):
其中s_calc是:
所以mkt给出为3.60 SP如下。
以下是猜测中的手动计算在Excel中看起来像是近似为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。另外,求解在计算上非常重,并且需要15秒才能产生这些结果。
我希望有人能指导我朝正确的方向发展。
答案 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])