Runtimewarning: в double_scalars обнаружено недопустимое значение, связанное с np.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

И a - это nan

Он хорошо работает, если вводить x >= 0, или я удаляю np.sqrt() в результате квадратного корня из числа внутри np.sqrt().

В чем причина этого.

Я заметил, что тип np.sqrt немного отличается от другого числа. Это причина?

2
0
3 460
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваша проблема не в квадратном корне 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 быть положительным.

Спасибо за ответ. Исключая решение в другом ответе, есть ли другое решение? Поскольку значение r будет изменяться при изменении ввода, и я не могу избежать отрицательного значения базы. Грязное исправление может быть запрещено, поскольку функция будет применена к более сложному алгоритму, который, вероятно, вызовет непредвиденную ошибку.

Zhidong Li 12.04.2018 07:54

Это полностью зависит от приложения. Если вам нужно, чтобы он углубился в сложную математику, вам нужно будет добавить для этого условия. Если вы этого не сделаете, это может быть решено просто обработкой исключений. (заключая его в try .... except 'AssertionError', с assert top/bot >=0

Uvar 12.04.2018 14:23

если вы хотите, чтобы он был сложным, return complex(top/bot)**r сделает свое дело. См. Страницу документации для получения дополнительной информации о том, как работать с комплексными числами в python: docs.python.org/3/library/cmath.html

Uvar 12.04.2018 14:26

Когда вы вызываете свою функцию со значениями f0(-0.001,36), вы можете видеть значения ваших переменных.

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

Иногда корни, которые вы найдете, являются воображаемыми, когда у вас есть отрицательное число и дробная экспонента, однако иногда это просто вызывает ошибку. Для получения дополнительной информации вы можете проверить это ответ.

Другие вопросы по теме