Использование рядов Тейлора, чтобы избежать потери точности

StackOverflow https://stackoverflow.com/questions/543104

Вопрос

Я пытаюсь использовать ряды Тейлора для разработки численно обоснованного алгоритма решения функции.Я занимаюсь этим уже довольно давно, но мне пока не везло.Я не уверен, что я делаю неправильно.

Функция

f(x)=1 + x - sin(x)/ln(1+x)   x~0

Также:почему в этой функции вообще происходит потеря точности?когда x близко к нулю, sin(x)/ln(1+x) даже близко не совпадает с числом x.Я не вижу, где теряется значение.

Я считаю, что чтобы решить эту проблему, мне нужно будет использовать разложения Тейлора для sin(x) и ln(1+x), которые

x - x^3/3! + x^5/5! - x^7/7! + ...

и

x - x^2/2 + x^3/3 - x^4/4 + ...

соответственно.Я пытался использовать одинаковые знаменатели для объединения компонентов x и sin(x)/ln(1+x) и даже для объединения всех трех, но в итоге ничего не получилось правильно.Любая помощь приветствуется.

Это было полезно?

Решение 6

Используемый метод верен — просто убедитесь, что ваш калькулятор находится в режиме радиан.

Другие советы

Потеря точности может произойти, потому что, когда x ~ 0, ln(1+x) также близко к 0, поэтому вам придется делить на очень маленькое число.Компьютеры в этом не очень хороши ;-)

Если вы используете ряд Тейлора для ln(1+x) На самом деле, это будет своего рода болью, потому что вам придется делить на бесконечный ряд членов.В подобных случаях я обычно предпочитаю просто вычислять ряд Тейлора для всей функции в целом из определения:

f(x) = f(0) + f'(0) x + f''(0) x/2 + f'''(0) x/6 + ...

откуда ты получишь

f(x) = 2 + 3x/2 - x^2/4 - x^3/24 - x^4/240 - 23x^5/1440 + 31x^6/2880 ...

(Я схитрил и подключил его к Mathematica ;-) Как говорит Стив, этот ряд не сходится так быстро, хотя на данный момент я не могу придумать лучшего метода.

РЕДАКТИРОВАТЬ:Думаю, я неправильно понял вопрос: если все, что вы пытаетесь сделать, это найти нули функции, определенно есть способы получше, чем использование ряда Тейлора.

Поскольку это домашнее задание, я просто попытаюсь дать несколько указаний в правильном направлении.

Решение 1

Вместо того, чтобы использовать приближение ряда Талиора, попробуйте просто использовать алгоритм поиска корня такие как метод Ньютона-Рафсона, линейная интерполяция или интервальное деление пополам (или даже объединить их).Их очень просто реализовать, и при правильном выборе начального значения корень может довольно быстро прийти к точному значению.

Решение 2

Если вам действительно нужно использовать приближение ряда Тейлора по какой-либо причине, просто разверните sin(x), ln(x) и что-то еще.(Умножение на ln(x) для удаления знаменателя в вашем случае будет работать).Тогда вам нужно будет использовать какой-нибудь решатель полиномиальных уравнений.Если вам нужна разумная степень точности, вам придется выйти за рамки 3-й или 4-й степени, как я полагаю, а это означает, что простое аналитическое решение не будет легким.Однако вы можете захотеть изучить что-то вроде Метод Дюрана-Кернера для решения общих полиномов любого порядка.Тем не менее, если вам нужно использовать термины высокого порядка, этот подход просто приведет к осложнениям, поэтому я определенно рекомендую решение 1.

Надеюсь, это поможет...

Я думаю, вам нужно посмотреть, что происходит с ln(x+1) при x -->0, и вы поймете, почему эта функция плохо себя ведет вблизи x = 0.

Я не особо вникал в это, но вы должны знать, что некоторые ряды Тейлора сходятся очень и очень медленно.

Просто вычислите ряд Тейлора для f напрямую.

Максима дает мне (первые 4 условия о x=0):

(%i1) f(x):=1 + x - sin(x)/log(1+x);
                                           - sin(x)
(%o1)                     f(x) := 1 + x + ----------
                                          log(1 + x)


(%i2) taylor(f(x),x,0,4);
                                2    3    4
                           x   x    x    x
(%o2)/T/                   - + -- + -- + --- + . . .
                           2   4    24   240
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top