Numpy: деление на ноль ошибок, но математически функция определенно определена - PullRequest
0 голосов
/ 29 мая 2019

Я тестирую некоторые функции для соответствия с данными, и одна из них (в 2-D) -

f(x) = (1/(1-x)) / (1 + 1/(1-x))

Что, согласно Wolfram и Google плоттерам, дает результат

f(1) = 1

Я пытался заставить это работать без жесткого кодирования случая

if x == 1:
    return 1

но я получаю nan и RunTimeWarning, информирующие меня, что я действительно разделил на ноль.

import numpy as np


def f(x):
    return 1/(1-x) / (1 + 1/(1-x))


x_range = np.linspace(0, 1, 50)
y = f(x_range)
print(y)

Есть ли более элегантное решение, чем просто ввести жестко закодированный if?

Ответы [ 2 ]

1 голос
/ 29 мая 2019

Есть ли причина сохранить его в этой форме, вы можете упростить его до:

def f(x):
    return 1/(2-x)

Вольфрам и Google, вероятно, тоже до некоторой степени алгебраического упрощения.

0 голосов
/ 29 мая 2019

Просто упростите уравнение для f (x) = (1 / (1-x)) / (1 + 1 / (1-x)). Упрощенное уравнение будет (1 / (2-х)). Теперь обновите программу как:

import numpy as np
def f(x):
    return 1/(2-x)
x_range = np.linspace(0, 1, 50)
y = f(x_range)
print(y)

выход:

[0.5        0.50515464 0.51041667 0.51578947 0.5212766  0.52688172
 0.5326087  0.53846154 0.54444444 0.5505618  0.55681818 0.56321839
 0.56976744 0.57647059 0.58333333 0.59036145 0.59756098 0.60493827
 0.6125     0.62025316 0.62820513 0.63636364 0.64473684 0.65333333
 0.66216216 0.67123288 0.68055556 0.69014085 0.7        0.71014493
 0.72058824 0.73134328 0.74242424 0.75384615 0.765625   0.77777778
 0.79032258 0.80327869 0.81666667 0.83050847 0.84482759 0.85964912
 0.875      0.89090909 0.90740741 0.9245283  0.94230769 0.96078431
 0.98       1.        ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...