Python: аппроксимация ln(x) с использованием ряда Тейлора

Я пытаюсь построить приближение для ln(1.9) с точностью до десяти цифр (т.641853861).

Я использую простую функцию, которую я построил из ln[(1 + x)/(1 - x)]

Вот мой код до сих пор:

# function for ln[(1 + x)/(1 - x)]

def taylor_two(r, n):
    x = 0.9 / 2.9
    i = 1
    taySum = 0
    while i <= n:
        taySum += (pow(x,i))/(i)
        i += 2
    return 2 * taySum

print taylor_two(x, 12)

print taylor_two(x, 17)

Теперь мне нужно переформатировать это так, чтобы оно сообщало мне количество терминов, необходимых для приближения ln(1.9) к 10 вышеприведенным цифрам, чтобы оно отображало значение, которое дает серия, а также отображало ошибку.

Я предполагаю, что мне нужно как-то встроить свою функцию в цикл for, но как мне заставить ее прекратить итерации, когда она достигнет требуемых 10 цифр?

Спасибо за помощь!

1 ответ

Принцип таков;

  • Посмотрите, сколько каждая итерация добавляет к результату.
  • Остановитесь, если разница меньше 1e-10.

Вы используете следующую формулу, верно;

https://upload.wikimedia.org/math/5/4/e/54ed0cacb65c1570301eb072934a6b71.png

(Обратите внимание на диапазон действия!)

def taylor_two():
    x = 1.9 - 1
    i = 1
    taySum = 0
    while True:
        addition = pow(-1,i+1)*pow(x,i)/i
        if abs(addition) < 1e-10:
            break
        taySum += addition
        # print('value: {}, addition: {}'.format(taySum, addition))
        i += 1
    return taySum

Тестовое задание:

In [2]: print(taylor_two())
0.6418538862240631

In [3]: print('{:.10f}'.format(taylor_two()))
0.6418538862
Другие вопросы по тегам