【问题标题】:New to Python, don't know what is wrong with my codePython新手,不知道我的代码有什么问题
【发布时间】:2018-08-19 11:51:53
【问题描述】:

我是 Python 新手,所以请温柔一点。

我真的不知道我的代码有什么问题。

这里是:

import numpy as np

def epsilon(t):
    epsilon = (1 - np.exp(-pow(t, 4)))
    return epsilon

def r(t):
    r = pow( (epsilon(t) - 16) / 4, 1/4)
    return r

print(r(0))

由于epsilon(0) = 0,我希望(从分析上)得到 r = (-16/4)^(1/4) = (-1)^(1/4)*sqrt(2) = exp( i pi /4)*sqrt(2) = 1 + 1 i

但是我得到了:

RuntimeWarning: invalid value encountered in double_scalars
  r = pow((4 * epsilon(t) - 16) / 4, 1/4)
nan

我试图找出错误。如果我打印epsilon(0),我会得到预期的0,如果我手动设置epsilon(0)

def r(t):
    r = pow( 0 - 16) / 4, 1/4)
    return r
print(r(0))

我收到1 + 1 j。如果我删除to the power of 1/4,它会起作用,我会得到-4

import numpy as np

def epsilon(t):
    epsilon = (1 - np.exp(-pow(t, 4)))
    return epsilon

def r(t):
    r = (epsilon(t) - 16) / 4
    return r

print(r(0))

为什么要这样做

import numpy as np

def epsilon(t):
    epsilon = (1 - np.exp(-pow(t, 4)))
    return epsilon

def r(t):
    r = pow( (epsilon(t) - 16) / 4, 1/4)
    return r

print(r(0))

我收到此错误?

【问题讨论】:

标签: python python-3.x numpy


【解决方案1】:

问题可能是由 numpy 浮点数引起的。 (正如 Schomes 所说)。通过转换为“正常”浮点数来修复。

import numpy as np

def epsilon(t):
    epsilon = (1 - np.exp(-pow(t, 4)))
    return epsilon

def r(t):
    epsi_boy = epsilon(t)
    print(type(epsi_boy)) # numpy float
    epsi_boy = float(epsi_boy) # Convert to non numpy float
    r = pow( (epsi_boy - 16) / 4,  1/4)
    return r

print(r(0))

【讨论】:

    【解决方案2】:

    原因是 numpy float64 就像 c 浮动,并且超载所有操作(包括)功率以这样工作。这是exp 以及随后在所有操作中返回的类型。请注意,您正在尝试计算:

    (-4)**(1/4)
    

    这是一个虚数。 Python 可以处理,并输出结果,但 numpy float64s 是“真实的”,所以上面的表达式是无效的。出于这个原因,这里的所有答案都建议转换为float 工作:

    >>> (-4)**(1/4)
    (1.0000000000000002+1j)
    >>> np.float64(-4)**(1/4)
    __main__:1: RuntimeWarning: invalid value encountered in double_scalars
    nan
    

    【讨论】:

      【解决方案3】:

      我注意到epsilon() 返回的值是<class 'numpy.float64'> 类型。当我们将此值包含在 Python 的内置 pow() 函数中时,就会出现问题。例如,试试pow(np.float64(-4.0), 1/4);它也坏了。可能是因为这个:

      对于混合操作数类型,适用二元算术运算符的强制规则。 Built-in Functions: pow()

      我设法通过将epsilon() 的结果转换为float 来解决此问题。

      r = pow( float((epsilon(t) - 16) / 4), 1/4)

      【讨论】:

      • 强制规则是什么
      【解决方案4】:
      from math import exp
      def epsilon(t):
          epsilon = (1 - exp(-pow(t, 4)))
          return epsilon
      
      
      def r(t):
          print(2)
          t=epsilon(t)
          r = pow( ( t- 16) / 4, 1/4)
          return r
      
      print(r(0))
      

      或者

      from numpy import exp
      def epsilon(t):
          epsilon = (1 - exp(-pow(t, 4)))
          return epsilon
      
      
      def r(t):
          print(2)
          t=epsilon(t)
          r = pow( float( t- 16) / 4, 1/4)
          return r
      
      print(r(0))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-12
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多