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

Я пытаюсь построить приближение для ln (1.9) с точностью до десяти цифр (так что 0,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 цифр?

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


person BigD4J    schedule 26.08.2015    source источник
comment
Обратите внимание, что r, используемый в определении функции, никогда не используется. Также будет ошибка в обеих строках print taylor_two(x, 12), потому что x не был объявлен. Чтобы вернуться из функции до того, как все n попытаются, вы должны отправить меньшие (и, возможно, верхние) числа для сравнения вычисленных чисел с if .6418538 ‹ taySum*2 ‹ .6418539: например.   -  person    schedule 26.08.2015
comment
Привет Джо, спасибо за ваш комментарий. Теперь я вижу, что есть проблема с тем, что x не объявлен. Не могли бы вы привести закодированный пример того, что вы имеете в виду под нижними и верхними числами? Я не уверен, что вы имеете в виду здесь.   -  person BigD4J    schedule 27.08.2015
comment
Я поставил оператор if в предыдущем посте. Числа с плавающей запятой могут быть не точными на 100%, поэтому вам нужно определить равенство как нижнее и верхнее число, а все, что между ними, равно   -  person    schedule 27.08.2015


Ответы (1)


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

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

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

ln формула

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

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
person Roland Smith    schedule 26.08.2015
comment
Спасибо за ответ, Роланд. На самом деле я использую 2 * sum k = 1 до бесконечности для (x ^ (2k - 1))/(2k - 1) для аппроксимации. Я пробовал ваш код, и это не совсем то, что я хочу сделать. Возможно, я неправильно сформулировал вопросы. Мне нужно, чтобы система работала до требуемого значения и останавливалась, как только она была в пределах 10-значной точности, а затем давала мне это значение. Код, который вы дали, требует, чтобы я сам вводил значения. Имеет ли это смысл? - person BigD4J; 27.08.2015
comment
Я предполагаю, что нужен какой-то цикл while, который повторяется до тех пор, пока разница между ln (1.9) и результирующим значением не станет очень маленькой. Я просто не уверен, как это построить. - person BigD4J; 27.08.2015
comment
@ BigD4J Смотрите обновленный ответ. Алгоритм работает до тех пор, пока сложение на следующем шаге не составит ‹1e-10. Если вы хотите посмотреть, как это работает, раскомментируйте print() в цикле. - person Roland Smith; 27.08.2015