【问题标题】:sympy and mpmath give "TypeError: cannot create mpf" when using the erf() function within solveset()sympy 和 mpmath 在 solveset() 中使用 erf() 函数时给出“TypeError: cannot create mpf”
【发布时间】:2016-06-12 21:43:25
【问题描述】:

我有 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

我想使用 mpmath 和 sympy 来求解方程,但它给了我以下错误消息:

TypeError: cannot create mpf from 0.707106781186547*(-s**2 - 0.287682072451781)/s

我的代码如下:

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)

mpf 是 mpmath 创建的浮点类型。

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

EmptySet()

当我跑步时

solveset(log(Xmax) - (log(mode) + s ** 2), s, domain=S.Reals)

我不知道接下来要尝试什么,任何帮助将不胜感激!

我最初认为这是数学问题,但方程在 matlab 中已成功求解,因此问题可能来自 sympy 或 mpmath。

【问题讨论】:

    标签: python sympy mpmath


    【解决方案1】:

    丢失 erfmpmath 导入,并使用 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)
    

    另请注意:

    • 您不必从mpmath 导入logsqrt。从sympy 获取它们不会对您的结果产生影响
    • 您可以在变量 s 上指定 Real 域,而无需在调用 solveset 时这样做。

    如果你需要的话,进一步使用的例子在包测试here

    【讨论】:

    • 不幸的是,这并没有给我正确的答案。它返回一个“条件集”对象而不是单个浮点数,这是我从 matlab 得到的正确答案
    • 这个matlab代码给出了一种情况的正确答案:function sigma = Test() %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 ))) syms eqn =(1/2+1/2*erf((log(4)-(log(2)+s^2))/(sqrt(2)*s))-(1/2 +1/2*erf((log(1)-(log(2)+s^2))/(sqrt(2)*s)))) - 0.95 == 0; sigma = 求解(eqn,s); %sigma = 双(sigma);结束
    • 听起来你应该为此打开第二个问题,因为它不相关。您在此处的问题标题要求解决上述问题的TypeError。抱歉,我无法提供更多帮助
    • 好的,你确实解决了我最初的问题,所以我会接受你的回答。