ortho-polys 0.1.3
Классические ортогональные полиномы: Лежандра, Чебышёва, Лагерра, Эрмита и Якоби и их свойства
Requires Python: >=3.8

# ortho_polys

Библиотека классических ортогональных полиномов для Python: Лежандра, Чебышёва, Лагерра, Эрмита и Якоби.

## Описание

`ortho_polys` - это Python-библиотека, предоставляющая инструменты для работы с классическими ортогональными полиномами. Библиотека включает реализации полиномов Лежандра, Чебышёва (первого и второго рода), Лагерра, Эрмита и Якоби, а также методы для вычисления их значений, свойств и визуализации.

Ортогональные полиномы играют важную роль в математической физике, теории аппроксимации, численном анализе и других областях математики. Данная библиотека предоставляет удобный интерфейс для работы с этими полиномами, позволяя вычислять их значения, исследовать их свойства и визуализировать их поведение.

## Установка

```bash
pip install ortho_polys
```

Или установка из исходного кода:

```bash
git clone https://github.com/username/ortho_polys.git
cd ortho_polys
pip install -e .
```

## Зависимости

- numpy
- scipy
- sympy
- matplotlib

## Использование

### Полиномы Чебышёва первого рода

```python
from ortho_polys.polynomials import ChebyshevFirstKind
import numpy as np
import matplotlib.pyplot as plt

# Создание полинома Чебышёва первого рода степени 5
cheb = ChebyshevFirstKind(5)

# Вычисление значения в точке
x = 0.5
value = cheb.evaluate(x)
print(f"T_5({x}) = {value}")

# Вычисление с помощью рекуррентной формулы
value_rec = cheb.recurrent(x)
print(f"T_5({x}) (рекуррентно) = {value_rec}")

# Нахождение корней
roots = cheb.roots()
print("Корни T_5(x):", roots)

# Построение графика
cheb.plot()
plt.show()
```

### Полиномы Лежандра

```python
from ortho_polys.polynomials import LegendrePolynomial
import numpy as np

# Создание полинома Лежандра степени 3
legendre = LegendrePolynomial(3)

# Вычисление значения в точке
x = 0.7
value = legendre.evaluate(x)
print(f"P_3({x}) = {value}")

# Формула Родрига (символьно)
rodrigues = legendre.rodrigues()
print("Формула Родрига для P_3(x):", rodrigues)

# Проверка ортогональности с другим полиномом
other = LegendrePolynomial(4)
ortho = legendre.orthogonal_with(other)
print(f"Интеграл P_3(x)·P_4(x) = {ortho}")

# Построение графика
legendre.plot()
```

### Полиномы Якоби

```python
from ortho_polys.polynomials import JacobiPolynomial

# Создание полинома Якоби степени 2 с параметрами alpha=1, beta=2
jacobi = JacobiPolynomial(2, 1, 2)

# Вычисление значения в точке
x = 0.3
value = jacobi.evaluate(x)
print(f"P_2^(1,2)({x}) = {value}")

# Формула Родрига (символьно)
rodrigues = jacobi.rodrigues()
print("Формула Родрига для P_2^(1,2)(x):", rodrigues)

# Построение графиков нескольких полиномов Якоби
jacobi.plot(n_max=3)
```

### Полиномы Эрмита

```python
from ortho_polys.polynomials import HermitePolynomial
import numpy as np

# Создание полинома Эрмита степени 4
hermite = HermitePolynomial(4)

# Вычисление значения в точке
x = 1.0
value = hermite.evaluate(x)
print(f"H_4({x}) = {value}")

# Проверка дифференциального уравнения
diff_eq = hermite.diff_eq()
print("Дифференциальное уравнение:", diff_eq)

# Построение графика
hermite.plot()
```

### Полиномы Лагерра

```python
from ortho_polys.polynomials import LaguerrePolynomial

# Создание обобщённого полинома Лагерра степени 3 с параметром alpha=0.5
laguerre = LaguerrePolynomial(3, 0.5)

# Вычисление значения в точке
x = 2.0
value = laguerre.evaluate(x)
print(f"L_3^0.5({x}) = {value}")

# Проверка ортогональности с другим полиномом
other = LaguerrePolynomial(2, 0.5)
ortho = laguerre.orthogonal_with(other)
print(f"Интеграл L_3^0.5(x)·L_2^0.5(x) = {ortho}")

# Построение графика
laguerre.plot()
```

## Теоретические основы

### Общие свойства ортогональных полиномов

Система полиномов {p_n(x)} называется ортогональной на интервале [a,b] с весовой функцией h(x), если:

∫[a,b] h(x)p_n(x)p_m(x)dx = 0 при n ≠ m

Основные свойства ортогональных полиномов:
1. Рекуррентная формула: λ_n p̂_n+1(x) = (x - α)p̂_n(x) - λ_{n-1}p̂_{n-1}(x)
2. Все корни ортогональных полиномов действительные, различные и расположены на интервале (a,b)
3. Корни двух соседних ортогональных полиномов перемежаются

### Полиномы Чебышёва

#### Первого рода (T_n)
- Определение: T_n(x) = cos(n·arccos(x))
- Весовая функция: h(x) = 1/√(1-x²)
- Интервал ортогональности: [-1, 1]
- Рекуррентная формула: T_{n+1}(x) = 2xT_n(x) - T_{n-1}(x)
- Экстремальное свойство: среди всех многочленов степени n со старшим коэффициентом 1, T_n(x)/2^{n-1} наименее уклоняется от нуля на [-1, 1]

#### Второго рода (U_n)
- Определение: U_n(x) = sin((n+1)·arccos(x))/sin(arccos(x))
- Весовая функция: h(x) = √(1-x²)
- Интервал ортогональности: [-1, 1]
- Рекуррентная формула: U_{n+1}(x) = 2xU_n(x) - U_{n-1}(x)

### Полиномы Лежандра (P_n)

- Весовая функция: h(x) = 1
- Интервал ортогональности: [-1, 1]
- Формула Родрига: P_n(x) = (1/(2^n·n!))·d^n/dx^n[(x²-1)^n]
- Рекуррентная формула: (n+1)P_{n+1}(x) = (2n+1)xP_n(x) - nP_{n-1}(x)
- Дифференциальное уравнение: (1-x²)y'' - 2xy' + n(n+1)y = 0

### Полиномы Якоби (P_n^(α,β))

- Весовая функция: h(x) = (1-x)^α·(1+x)^β, α,β > -1
- Интервал ортогональности: [-1, 1]
- Формула Родрига: P_n^(α,β)(x) = ((-1)^n/(2^n·n!))·(1-x)^{-α}·(1+x)^{-β}·d^n/dx^n[(1-x)^{n+α}·(1+x)^{n+β}]
- Частные случаи:
  - α = β = 0: полиномы Лежандра
  - α = β = -1/2: полиномы Чебышёва первого рода
  - α = β = 1/2: полиномы Чебышёва второго рода

### Полиномы Эрмита (H_n)

- Весовая функция: h(x) = e^{-x²}
- Интервал ортогональности: (-∞, ∞)
- Формула Родрига: H_n(x) = (-1)^n·e^{x²}·d^n/dx^n[e^{-x²}]
- Рекуррентная формула: H_{n+1}(x) = 2xH_n(x) - 2nH_{n-1}(x)
- Дифференциальное уравнение: y'' - 2xy' + 2ny = 0

### Полиномы Лагерра (L_n^α)

- Весовая функция: h(x) = x^α·e^{-x}, α > -1
- Интервал ортогональности: [0, ∞)
- Формула Родрига: L_n^α(x) = (1/n!)·x^{-α}·e^x·d^n/dx^n[e^{-x}·x^{n+α}]
- Рекуррентная формула: (n+1)L_{n+1}^α(x) = (2n+1+α-x)L_n^α(x) - (n+α)L_{n-1}^α(x)
- Дифференциальное уравнение: xy'' + (1+α-x)y' + ny = 0

## Автор

-  Рудаковский Евгений Александрович (alex.rudakovskii@gmail.com)