Я тестирую некоторые функции, чтобы соответствовать данным, и одна из них (в 2-D)
f(x) = (1/(1-x)) / (1 + 1/(1-x))
Что, согласно плоттерам Вольфрам и 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
?
Есть ли причина сохранить его в таком виде, вы можете упростить его до:
def f(x):
return 1/(2-x)
Wolfram и Google, вероятно, тоже к какому-то алгебраическому упрощению.
В этом случае еще один способ избежать жесткого кодирования случая x = 1 — вместо этого построить график x_range = np.linspace(0, 1 - 10**-6, 50)?
Это также интересный обходной путь, на самом деле это было мое решение до того, как я пришел и задал этот вопрос. В любом случае, я адаптировал свою модель на основе ваших предложений. Реальное дело в трехмерности, и когда я смотрю на слишком много переменных одновременно, кажется, что я теряю основы. Приятно знать, что свежая пара глаз может легко разобраться в таких вещах!
Просто упростите уравнение для f(x) = (1/(1-x))/(1 + 1/(1-x)). Упрощенное уравнение будет (1/(2-x)). Теперь обновите программу как:
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. ]
Достаточно справедливо, это, вероятно, лучшее решение. Предположим, что я сохранил его в "сломанном" виде, просто для интереса.