Python: ряд Тейлора

Розв’язок задачі «Ряд Тейлора», написаний на 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$.





 

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *