RuntimeWarning:在与np.sqrt

时间:2018-04-11 10:50:53

标签: python numpy types sqrt

我已经用np.sqrt(正数)定义了一个数学函数。 它返回RuntimeWarning。

在我将其简化为一个非常简单的数学函数后,任何人都可以手动解决,它仍然会返回错误。 以下是简化功能:

import numpy as np
n=30
def f0(x,k):
    bot = 9.37 * 10**(-4) * k**(0.25)
    x_0 = 2*bot
    #print(x_0)
    E_c = 4730 * np.sqrt(k)
    #print(E_c)
    r = E_c/(E_c - k/bot)
    #print(r)
    top = x/(1+(x/x_0)**n)**(1/n) 

    return (top/bot)**r

a = f0(-0.001,36)

它返回:

RuntimeWarning: invalid value encountered in double_scalars

anan

如果输入x >= 0,或者我将np.sqrt()移除到np.sqrt()内数字的平方根的结果,则效果很好。

这是什么原因。

我注意到np.sqrt的类型与另一个数字有点不同。这是什么原因?

2 个答案:

答案 0 :(得分:1)

您的问题不在于numpy平方根。您尝试返回a的值涉及将负数提升为非整数幂。这在数学上是未定义的。

数学运算,虽然我很确定python使用不同的数值近似,但是:

x = 5
r = 1.234
x**r # 7.2866680501380845
import math
math.exp(r*math.log(x)) # 7.286668050138084

现在想象如果r为负数会发生什么:您尝试采用负数的自然对数。这将导致NaN。根据使用的功能,您将看到一系列错误。

解决方案是强制数量top/bot为正。

答案 1 :(得分:1)

当您使用值f0(-0.001,36)调用函数时,您可以看到变量的值。

(top/bot) # value -0.43569721500945896
r # value 2.2355433614695648

有时候,当你有负数和分数指数时,你会发现它们的根是虚构的,但有时它只会给你一个错误。有关更多信息,请查看this respose