@Nikidze

Почему сумма ряда Тейлора не верна?

Необходимо разложить функцию cos^2(x) в ряд Тейлора и сравнить со значением, полученным через стандартные функции. Делаю:
#include <iostream>
#include <math.h>

using namespace std;

double p(int n, double x) {
    return (-4 * x * x) / ((2*n + 1) * (2*n + 2));
}

int main()
{
        double x = 20;
        double s = 1;
        double st = -x*x;
        double eps = pow(10, -15);
        int k;
        for(k = 1; abs(st) > eps; ++k) {
                s += st;
                st *= p(k, x);
        }
        cout << s << endl;
        cout << cos(x)*cos(x)<<endl;
        return 0;
}


При x до 20 значения выходят такие же, или близкие. При x больше 20, значения абсолютно разные. Это из-за погрешности в вычислениях? Или я что-то не так делаю? Спасибо.
  • Вопрос задан
  • 295 просмотров
Решения вопроса 1
shurshur
@shurshur
Сисадмин, просто сисадмин...
Формула Тейлора имеет смысл лишь в небольшой окрестности рассматриваемой точки, и чем меньше окрестность, тем выше точность величины, которая рождает формула. Естественно, x=20 находится в очень даже большой, просто огромной окрестности точки x=0, в которой было взято разложение исходного квадратного косинуса.

Можно улучшить точность, если перевести аргумент в интервал периодичности значения (0,2pi), затем в (0,pi) с учётом знака, затем в (0,pi/2) с учётом симметрии относительно pi/2, затем в (0,pi/4) с заменой синуса на косинус, если аргумент превышает pi/4. Это уже будет намного лучше, но если аргумент заметно отличается от нуля, то точность просядет очень быстро.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы