我使用sympy来解决以下相当复杂的等式:
我想要一个单一的数值解决方案,必须是积极的。
我的脚本如下:
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)
我使用mode
,percentage
,Xmin
和Xmax
返回
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))
绘制等式表明存在一个正解,如下图所示:
我寻找更大的范围,并且似乎没有任何其他点,函数等于0. matlab能够找到相同方程的单个数值解。
值得一提的是,使用sympy solve()
函数(根据文档过时)而不是solveset()
会返回NotImplementedError: multiple generators
如何获得等于0的值,如图所示?它是否超出了同情1.0的能力?
正如您所看到的,我在代码中指定答案应该是正实数,所以我不明白为什么它只能找到部分解决方案。
答案 0 :(得分:2)
我认为solveset
正试图找到符号解决方案。如果您只想要一个数值解,我认为findroot
是要使用的函数。