Правильно ли я вычислил 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 шт):

Автор решения: CrazyElf

Проверить истинное значение логарифма легко:

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: просто не дойдёт ход.

→ Ссылка