刚接触Python,不知道代码哪里出了问题。

5

我是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 + 1j。如果我去掉 的四次方根,它就可以工作并且我会得到 -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))

我遇到了这个错误?

检查您的第二次尝试:您漏掉了一个左括号(我认为这只是打字错误)。 - Giacomo Catenazzi
请查看 https://dev59.com/aG865IYBdhLWcg3wivGi 以获取更好的错误描述。 - Giacomo Catenazzi
1
可能是['invalid value encountered in double_scalars' warning, possibly numpy]的重复问题,请参考(https://dev59.com/aG865IYBdhLWcg3wivGi)。 - Patrick Artner
4个回答

3

问题可能是由于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))

1
原因是numpyfloat64类似于c中的浮点型,并且重载了所有操作(包括)幂运算,以便能够像此类操作一样工作。这是exp函数返回的类型,随后在所有操作中都使用。请注意,您正在尝试计算的内容:
(-4)**(1/4)

这是一个虚数。Python可以处理并输出结果,但是numpy float64是“实数”,所以上述表达式是无效的。因此,所有建议转换为float的答案都有效:

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

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

混合操作数类型时,二元算术运算符的强制转换规则适用。 内置函数:pow()

我通过将epsilon()的结果转换为float来解决了这个问题。 r = pow( float((epsilon(t) - 16) / 4), 1/4).

什么是强制转换规则? - Smart Manoj

0
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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接