在使用solveset()中的erf()函数时,sympy和mpmath给出"TypeError:无法创建mpf"

cac*_*moi 1 python sympy mpmath

我有4个输入变量(浮点数):

  • XMAX
  • XMIN
  • 百分比
  • 模式

我想为s解决以下(相当长的)等式:

> (1/2+1/2*erf((log(Xmax)-(log(mode)+s**2))/(sqrt(2)*s))-(1/2+1/2*erf((log(Xmin)-(log(mode)+s**2))/(sqrt(2)*s))) - percentage == 0
Run Code Online (Sandbox Code Playgroud)

我想用mpmath和sympy来解决这个等式,但它给了我以下错误信息:

TypeError:无法从0.707106781186547*( - s**2 - 0.287682072451781)/ s创建mpf

我的代码如下:

from mpmath import erf, log, sqrt
from sympy import Symbol, solveset, S

percentage = 0.95
mode = 2
Xmin = 1.
Xmax = 1.5
s = Symbol('s')

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

solveset(eqn, s, domain=S.Reals)
Run Code Online (Sandbox Code Playgroud)

mpf是mpmath创建的float类型.

我想我把问题缩小到erf()函数,它返回

EmptySet()
Run Code Online (Sandbox Code Playgroud)

当我跑

solveset(log(Xmax) - (log(mode) + s ** 2), s, domain=S.Reals)
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚下一步该尝试什么,任何帮助将不胜感激!

我最初认为这是数学问题,但是方程式在matlab中成功解决,所以问题可能来自于sympy或者mpmath.

Lou*_*dox 6

丢失mpmath导入erf,并使用sympy版本可以解决您的错误.

from sympy import Symbol, solveset, S, erf, log, sqrt

percentage = 0.95
mode = 2
Xmin = 1.
Xmax = 1.5
s = Symbol('s', real=True)

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

solveset(eqn, s)
Run Code Online (Sandbox Code Playgroud)

另请注意:

  • 你不必进口logsqrtmpmath.这样做对你的结果没有任何影响sympy
  • 您可以在变量s上指定Real域,保存您在solveset调用中执行的操作.

如果需要,可以在此处进行包装测试.