Правильно ли я вычислил y=ln(x)?
Я проверял функцию при x=2. Подскажите пожалуйста. Мой код
def compute_ln(x, eps):
if x <= 0:
return float('-inf') # Логарифм от неположительного числа равен минус бесконечности.
if x == 1:
return 0 # Логарифм от 1 равен 0.
if x < 0:
return float('nan') # Логарифм от отрицательного числа является комплексным числом.
term = x - 1
result = term
n = 2
while abs(term) > eps:
term *= -(x - 1)
term /= n
result += term
n += 1
return result
x = 2.0 # Замените x на ваше значение
eps = 1e-6 # Замените eps на вашу желаемую точность
result = compute_ln(x, eps)
print(f"ln({x}) = {result}")
Результат этого кода: ln(2.0) = 0.6321205357142857
Ещё есть такой вариант:
x = 2
eps = 1e-6
result = 0
term = x - 1
n = 1
while abs(term) > eps:
result += term
n += 1
term = ((-1)**(n-1) * (x-1)**n) / n
print(result)
Результат: 0.6931476805602526
Ответы (1 шт):
Проверить истинное значение логарифма легко:
import math
print(math.log(2))
# 0.6931471805599453
То есть правильный второй код (с учётом точности eps). Что же не так в первом коде? А то, что вы делите на каждом шаге term на n. И следующее слагаемое вычисляете через уже поделенный term, а это неправильно. Каждое слагаемое должно делиться на своё значение n, соответствующее текущему шагу. Т.е. ваш код можно исправить, например, так:
while abs(term/n) > eps:
term *= -(x - 1)
# term /= n
result += term/n
n += 1
Тут проверка на эпсилон не совсем правильная, она как бы для n+1 на самом деле получается, но это не существенно.
В таком виде код выдаёт правильный ответ:
ln(2.0) = 0.6931476805602526
P.S. Проверка if x < 0: у вас никогда не сработает, потому что она истинна тогда же, когда истинна проверка if x <= 0:, которая сделает return в случае истинности и до проверки условия if x < 0: просто не дойдёт ход.
