Использование рядов Тейлора, чтобы избежать потери точности
-
23-08-2019 - |
Вопрос
Я пытаюсь использовать ряды Тейлора для разработки численно обоснованного алгоритма решения функции.Я занимаюсь этим уже довольно давно, но мне пока не везло.Я не уверен, что я делаю неправильно.
Функция
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