我是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))
我收到此错误?
答案 0 :(得分: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 :(得分:1)
我注意到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)
。
答案 2 :(得分:1)
原因是numpy
float64
类似于c
浮点数,并且会使所有操作(包括)的权限超载。这是exp
返回的类型,随后在所有操作中返回。请注意,您正在尝试计算:
(-4)**(1/4)
这是一个虚数。 Python可以处理它,并输出结果,但numpy
float64
是&#34; real&#34;,所以上面是无效的表达式。因此,此处的所有答案都建议转换为float
工作:
>>> (-4)**(1/4)
(1.0000000000000002+1j)
>>> np.float64(-4)**(1/4)
__main__:1: RuntimeWarning: invalid value encountered in double_scalars
nan
答案 3 :(得分: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))