Как исправить 'RuntimeWarning: деление на ноль, встречающееся в double_scalars' - PullRequest
0 голосов
/ 12 апреля 2019

После выполнения для цикла в моем коде ошибка в одной строке:

RuntimeWarning: divide by zero encountered in double_scalars

и в другой строке две ошибки:

RuntimeWarning: divide by zero encountered in double_scalars

RuntimeWarning: invalid value encountered in arcsin

Я обнаружил, что это может быть проблема с плавающими значениями, но я не уверен в этом, и я набираю его здесь, чтобы посмотреть вашу помощь :)

Вот код:

T_max = 0.5 * v_PM(Me) * RTOD 
DT = (90 - T_max) - np.fix(90 - T_max) 
n = int(T_max * 2)

P = np.zeros((n+1))    
T = np.zeros((n+1))
M = np.zeros((n+1))
RR = np.zeros((n+1))
LR = np.zeros((n+1))
SL = np.zeros((n+1))

for m in range(n+1):
    T[m] = (DT + m) * DTOR
    #Mach from T[i] using T[i] = v_PM (FALSE POSITION)
    func = lambda x: T[m] - v_PM(x) 
    M[m] = brentq(func, 1, Me+1) 
    M[0] = 0
    P[m] = TR * np.tan(T[m]) #X-AXIS POINTS
    P[0] = 0
    #RR SLOPES
    RR[m] = -TR / P[m]
    RR[0] = 0
    #LR slopes
    LR[m] = (np.tan(T[m] + np.arcsin(1 / M[m]))) 
    LR[0] = 0
    SL[m] = -RR[m] 
    SL[0] = 0 

Я определил ранее (до цикла) v_PM и он равен

v_PM = lambda x : (A * np.arctan(np.sqrt(B * (x ** 2 - 1))) - np.arctan(np.sqrt(x ** 2 - 1)))

Как я уже говорил, ошибка RuntimeWarning: divide by zero encountered in double_scalars см. RR[m] = -TR / P[m]

и две ошибки RuntimeWarning: divide by zero encountered in double_scalars и

RuntimeWarning: invalid value encountered in arcsin относится к:

LR[m] = (np.tan(T[m] + np.arcsin(1 / M[m])))

Я также поставил туда P[0] = 0 и M[0] = 0 и т. Д., Потому что я хочу, чтобы первый элемент был равен 0.

Я не знаю, смогу ли я забыть об этой ошибке и перейти к своему коду или это серьезная проблема. Спасибо за вашу помощь.

1 Ответ

0 голосов
/ 12 апреля 2019

Это не фактические ошибки, а предупреждения. Они там, потому что вы пытаетесь разделить что-то на ноль.

А именно, вы устанавливаете M[0] = 0, а затем делите на M[0] (на первой итерации, где m = 0) и то же самое для P[0].

Вопрос в том, что вы хотите, чтобы первые значения были?

Возможно, решением было бы инициализировать нулевые значения по вашему желанию (перед циклом) и запустить цикл с m=1 (таким образом, используя for m in range(1,n+1):). Это то, что вам нужно?

Однако, предупреждение все еще может быть там, если на разных итерациях P[m] или M[m] будут равны нулю.

T_max = 0.5 * v_PM(Me) * RTOD 
DT = (90 - T_max) - np.fix(90 - T_max) 
n = int(T_max * 2)

P = np.zeros((n+1))    
T = np.zeros((n+1))
M = np.zeros((n+1))
RR = np.zeros((n+1))
LR = np.zeros((n+1))
SL = np.zeros((n+1))

# initialize your values
M[0] = 0 # actually not needed
P[0] = 0 # actually not needed
RR[0] = 0 # actually not needed
LR[0] = 0 # actually not needed
SL[0] = 0 # actually not needed
T[m] = (DT) * DTOR

for m in range(1,n+1):
    T[m] = (DT + m) * DTOR
    #Mach from T[i] using T[i] = v_PM (FALSE POSITION)
    func = lambda x: T[m] - v_PM(x) 
    M[m] = brentq(func, 1, Me+1) 
    P[m] = TR * np.tan(T[m]) #X-AXIS POINTS

    #RR SLOPES
    RR[m] = -TR / P[m]

    #LR slopes
    LR[m] = (np.tan(T[m] + np.arcsin(1 / M[m]))) 
    SL[m] = -RR[m] 

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...