<a href="https://colab.research.google.com/github/GalinaZh/Appl_alg2021/blob/main/Applied_Alg_sem_5_Interpolation_task.ipynb" target="_parent"></a>

# Занятие 5
# Прикладная алгебра и численные методы
## Интерполяция: полиномы Лагранжа, сплайны и кривые Безье


```
import numpy as np
import scipy.linalg
import sympy
from sympy import S
import matplotlib.pyplot as plt
from copy import deepcopy
from scipy.interpolate import interp1d, splrep, splev, InterpolatedUnivariateSpline, BPoly, CubicSpline
%matplotlib inline
```


```
#sympy.init_printing(use_unicode=False, wrap_line=False, no_global=True)
```

## Многочлен Лагранжа
$$
f(x) = L(x) = \sum_{i=1}^n y_i 
\frac{(x - x_0)(x - x_1)...(x - x_{i-1})(x - x_{i+1})...(x - x_n)}{(x_i - x_0)(x_i - x_1)...(x_i - x_{i-1})(x_i - x_{i+1})...(x_i - x_n)}, 
\quad y_i = f(x_i), \quad i = 0, ..., n.
$$
## Задача 1
Приблизить параболой косинус на отрезке от $-\frac{\pi}{4}$ до $\frac{\pi}{4}$, выбрать промежуточную точку на середине отрезка.


```

```

## Задача 2 Линейная регрессия
Для косинуса построить параболу методом линейной регрессии
на отрезке от $-\frac{\pi}{4}$ до $\frac{\pi}{4}$, выбрать 10 промежуточных точек равномерно распределенных на отрезке. 
Изобразить на графике точки косинуса и полученную параболу.

## Задача 3
Построить по определению и с помощью scipy.interpolate.lagrange полином Лагранжа для косинуса 
на отрезке от $-\frac{\pi}{4}$ до $\frac{\pi}{4}$, выбрать 3 промежуточных точки равномерно распределенных на отрезке. 
Изобразить на графике точки косинуса и полиномы Лагранжа.


```

```

## Сплайны

## Задача 4
Аппроксимировать $f(x) = \tan(x^2)$ на отрезке $[-0.75, 0.75]$ квадратичным и кубическим сплайном с узлами на концах и в трех равномерно распределенных промежуточных точках. 

Построить на графике исходную функцию и сплайны.


```

```

## Сплайны scipy.interpolate: interp1d, splrep, InterpolatedUnivariateSpline
https://docs.scipy.org/doc/scipy/reference/interpolate.html#module-scipy.interpolate
#### Кубический сплайн:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.CubicSpline.html#scipy.interpolate.CubicSpline
####  interp1d
https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.interp1d.html#scipy.interpolate.interp1d
####  Полиномы Бернштейна
https://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.BPoly.html#scipy.interpolate.BPoly

Теперь будем строить сплайны средствами scipy.interpolate, вначале подключим необходимые функции:

## interp1d
Параметры $x$ и  $y$ - координаты узлов сплайна, 
kind - str или int, необязательный параметр, определяющий тип сплайна, по умолчанию линейный (‘linear’), можно сделать ‘nearest’, ‘nearest-up’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘previous’ или ‘next’. 

‘zero’, ‘slinear’, ‘quadratic’ и ‘cubic’ обозначают интерполяцию нулевого, первого, второго или третьего порядка,

‘previous’ и ‘next’ просто возвращают предыдущее или следующее значение функции

‘nearest-up’ и ‘nearest’ различаются обработкой полуцелых чисел, таких как 0.5, 1.5.


## Кривые Безье
#### Линейная кривая Безье
$P_0$ и $P_1$ две различные точки, тогда линейная кривая Безье - отрезок, соединяющий эти точки:
$$
B(t) = P_0 + t(P_1 - P_0) = (1 - t)P_0 + tP_1,\quad 1\le t \le 1 
$$
#### Квадратичная кривая Безье
$P_0$, $P_1$ и $P_2$ три различные точки, тогда квадратичная кривая Безье - отрезок, соединяющий эти точки:
$$
B(t) = (1 - t)^2P_0 + 2(1 - t)tP_1 + t^2P_2 = P_1 + (1 - t)^2(P_0 - P_1) + t^2(P_2 - P_1),\quad 1\le t \le 1 
$$
#### Кубическая кривая Безье
$P_0$, $P_1$, $P_2$ и $P_3$ четыре различные точки, тогда кубическая кривая Безье - отрезок, соединяющий эти точки:
$$
B(t) = (1 - t)^3P_0 + 3(1 - t)^2tP_1 + 3(1 - t)t^2P_2 +t^3P_3,\quad 1\le t \le 1 
$$
#### Общий вид кривой Безье
$P_0$, $P_1$, ...  и $P_n$ - $n$ различных точек, тогда линейная кривая Безье - отрезок, соединяющий эти точки:
$$
B(t) = \sum_{k=0}^n C_n^k(1 - t)^{n - k}t^kP_k,\quad 1\le t \le 1 
$$

https://bezier.readthedocs.io/en/stable/python/reference/bezier.curve.html

## Задача 5
Построим кривую Безье по точкам на графике $\sin x^2$ на отрезке .

Для каждой точки построим полином Бернштейна $C_n^k(1 - t)^{n - k}t^k$, $1\le t \le 1$ и составим сумму произведений соответствующих координат точки на полиномы  Бернштейна.


```

```

## Задача 6
Построить кривую Безье Задачи 5 с помощью модуля bezier:

https://bezier.readthedocs.io/en/stable/python/reference/bezier.curve.html


```
!pip install bezier #--user
```

    Requirement already satisfied: bezier in /root/.local/lib/python3.6/site-packages (2020.5.19)
    Requirement already satisfied: numpy>=1.18.1 in /usr/local/lib/python3.6/dist-packages (from bezier) (1.19.5)



```
import bezier
```


```

```

af75fd01224ff22a3c969c126dabc83c0c27b844
ipynb
Jupyter Notebook
Applied_Alg_sem_5_Interpolation_task.ipynb
GalinaZh/Appl_alg2021
09761b56eb2bdfee4cd5f12cd96562ca146fcb15
MIT
Applied_Alg_sem_5_Interpolation_task.ipynb
GalinaZh/Appl_alg2021
09761b56eb2bdfee4cd5f12cd96562ca146fcb15
MIT
Applied_Alg_sem_5_Interpolation_task.ipynb
GalinaZh/Appl_alg2021
09761b56eb2bdfee4cd5f12cd96562ca146fcb15
MIT
Qwen/Qwen-72B
1. YES
2. YES