Розв’язок задачі «Ряд Тейлора», написаний на Python 3 з використанням бібліотек NumPy и Matplotlib:
# coding: utf-8
# # Ряд Тейлора
# Постройте график функции
# $$ y = x - \dfrac{x^3}{3!} + \dfrac{x^5}{5!} - \dfrac{x^7}{7!} + \ldots $$
# для 100 слагаемых в интервале $−10<x<10$. Примечание: компьютеру может оказаться сложным посчитать 100! Поэтому вычисляйте следующее слагаемое, исходя из предыдущего.
#
# 1. Поверх полученного графика постройте (другим цветом) $y=\sin x$.
# 2. Исследуйте как изменяется график в зависимости от количества слагаемых.
# # Решение
import matplotlib.pyplot as plt; # Импорт библиотеки для построения графиков
import numpy as np; # Подключение библиотеки для численных расчетов
get_ipython().magic('matplotlib inline')
# Функция `taylor(x,n)` вычисляет сумму первых $n$ слагаемых ряда Тейлора для функции $f_n(x) = \sin x$:
def taylor(x, n):
y = 0; # Начало суммы
sign = 1; # Знак первого члена ряда
term = x; # Первый член ряда
for i in range(1, n):
# Прибавляем член к ряду
y = y + sign*term;
# Вычисляем следующий член ряда
sign = - sign;
denom = (2*i)*(2*i+1);
term = term * x*x/denom;
return y;
# Самопроверка для нескольких значений синуса, посмотрим на разницу между счетом функцией `taylor(x, n)` и встроенной функцией синуса для нескольких разных значений $x$:
x1 = 0.25;
print(np.abs(np.sin(x1) - taylor(x1, 5)))
x1 = -1.1;
print(np.abs(np.sin(x1) - taylor(x1, 5)))
# Написанная нами функция показывает правильный счет, строим график.
x = np.linspace(-10, 10, 501); # Интервал между -10 и 10 заполнен 501 точкой
realsin = np.sin(x); # массив значений синуса
taylor3 = taylor(x, 3);
taylor10 = taylor(x, 10);
taylor100 = taylor(x, 100);
plt.plot(x, realsin, 'r-',
x, taylor3, 'b-',
x, taylor10, 'g-',
x, taylor100, 'k--',
linewidth=3.0);
plt.title('Sine and It\'s Taylor Expansion') # Заголовок графика
plt.legend(['sin x', '3 terms', '10 terms', '100 terms'])
plt.xlim(-10,10) # Интервал графика по иксу
plt.ylim(-2,4) # Интервал графика по игреку
plt.show() # показ графика
plt.plot(x, np.abs(realsin-taylor3), 'b-',
x, np.abs(realsin-taylor10), 'g-',
x, np.abs(realsin-taylor100), 'k--',
linewidth=3.0);
plt.title('Accuracy of the Taylor Expansion: |sin(x) - taylor(x, n)|') # Заголовок графика
plt.legend(['3 terms', '10 terms', '100 terms'])
plt.xlim(-10,10) # Интервал графика по иксу
plt.ylim(0,0.01) # Интервал графика по игреку
plt.show() # показ графика
# # Выводы
# Функция $\sin x$ на интервале $-10 < x < 10$ отлично описывается рядом из сотни слагаемых в ряде Тейлора $f_n(x)$. Как видно из графика
# $$ g_n(x) = |\sin(x) - f_n(x)|$$
# погрешность расчетов при $ n = 100$ практически нулевая на всем интервале его построения. При этом погрешность расчетов 0.002 набегает для 10 слагаемых уже после $|x| = 5$.