Sympy solveset()在应该返回数字答案时返回ConditionSet()

时间:2016-06-29 15:30:08

标签: python math sympy

我使用sympy来解决以下相当复杂的等式:

eqn

我想要一个单一的数值解决方案,必须是积极的。

我的脚本如下:

from sympy import *

def CalcScaleParam_solveset(mode, percentage, Xmin, Xmax):

    s = Symbol('s', positive=True)

    eqn = (1 / 2 * erf((log(Xmax) - (log(mode) + s ** 2)) / (sqrt(2) * s)) - (1 / 2 * erf((log(Xmin) - (log(mode) + s ** 2)) / (sqrt(2) * s)))) - 0.95

    sigma = solveset(eqn, s, domain=S.Reals)

    print(sigma)


CalcScaleParam_solveset(2, 0.95, 1, 4)

我使用modepercentageXminXmax

的任意数字

返回

ConditionSet(s, Eq(0.5*erf(-sqrt(2)*(-s**2 - log(2))/(2*s)) + 0.5*erf(sqrt(2)*(-s**2 - log(2) + log(4))/(2*s)) - 0.95, 0), (-oo, oo))

这意味着只有部分解决方案。

但是我知道这不是真的,因为用plot(eqn, (s, 0, 1))绘制等式表明存在一个正解,如下图所示:

The plotted function

我寻找更大的范围,并且似乎没有任何其他点,函数等于0. matlab能够找到相同方程的单个数值解。

值得一提的是,使用sympy solve()函数(根据文档过时)而不是solveset()会返回NotImplementedError: multiple generators

如何获得等于0的值,如图所示?它是否超出了同情1.0的能力?

正如您所看到的,我在代码中指定答案应该是正实数,所以我不明白为什么它只能找到部分解决方案。

1 个答案:

答案 0 :(得分:2)

我认为solveset正试图找到符号解决方案。如果您只想要一个数值解,我认为findroot是要使用的函数。