Документация Engee
Notebook

Создание и вычисление многочленов

В этом демонстрационном примере рассмотрены базовые операции с многочленами: создание, вычисление и нахождение корней.

Для работы с многочленами - их созданием, вычислением, нахождением корней и математическими операциями над ними в Engee можно воспользоваться библиотекой Polynomials.jl. Загрузим и подключим её для данного примера.

In [ ]:
import Pkg
Pkg.add("Polynomials")
using Polynomials;
   Resolving package versions...
  No Changes to `/user/.project/Project.toml`
  No Changes to `/user/.project/Manifest.toml`

Создание многочлена

Для того, чтобы создать многочлен вида $4 \cdot x^2 - 4 \cdot x + 1$ воспользуемся функцией Polynomial(), которой передадим вектор его коэффициентов, начиная со свободного члена.

In [ ]:
Polynomial([1, -4, 4])
Out[0]:
1 - 4∙x + 4∙x2

Также создать многочлен можно, передав в функцию переменную коэффициентов - в виде вектора или матрицы $1 \times (n+1)$. Результат работы функции (многочлен) можно передать переменной для дальнейших операций.

In [ ]:
p = [4 0 0 -3 2 33];
y = Polynomial(p)
Out[0]:
4 - 3∙x3 + 2∙x4 + 33∙x5

Функция создания многочлена может быть рассчитана поэлементно. Результатом такого вызова будет вектор многочленов, а в функцию необходимо будет передать вектор, состоящий из векторов коэффициентов.

In [ ]:
P1 = [1, 2, 3, 0, 1];
P2 = [1, 0, -1];
P3 = [0, -1, 4, -2];
P = [P1, P2, P3];

Y = Polynomial.(P)
Out[0]:
3-element Vector{Polynomial{Int64, :x}}:
 Polynomial(1 + 2*x + 3*x^2 + x^4)
 Polynomial(1 - x^2)
 Polynomial(-x + 4*x^2 - 2*x^3)

По умолчанию, переменной многочленов является x. Для изменения переменной необходимо задать её явно:

In [ ]:
Polynomial([1,2,3], :t)
Out[0]:
1 + 2∙t + 3∙t2

Создать многочлен можно по значениям его корней, используя при этом функцию fromroots(). Форма задания многочлена $(x-4) \cdot (x-1) \cdot (x-2)$ будет воспроизведиться в следующем виде.

In [ ]:
u = fromroots([4,1,2])
Out[0]:
-8 + 14∙x - 7∙x2 + x3

Вычисление многочлена

Вычисление многочленов производится при помощи нотации вызова. Рассчитаем ранее созданный многочлен $y=4-3 \cdot x^3 + 2 \cdot x^4 + 33 \cdot x^5$ в точке $x = 1$.

In [ ]:
y(1)
Out[0]:
36

Для вычисления многочлена, созданного при помощи поэлементного вызова, необходимо обращаться к элементу созданного вектора. Например, вычислим многочлен $Y_2 = -x^2+1$ в точке $x = 0,1$.

In [ ]:
Y[2](0.1)
Out[0]:
0.99

Нахождение корней многочлена

Для нахождения корней многочлена используется функция roots(). Ей необходимо передать многочлен - например, через функцию создания:

In [ ]:
roots(Polynomial([1, 0, -1]))
Out[0]:
2-element Vector{Float64}:
 -1.0
  1.0

Вычислим корни функции, созданной ранее по значениям корней: $u = (x-4) \cdot (x-1) \cdot (x-2)$.

In [ ]:
roots(u)
Out[0]:
3-element Vector{Float64}:
 0.9999999999999991
 2.0000000000000018
 3.9999999999999982

Как видно из результата вычисления функции, полученные значения корней не равны заданным, что объясняется погрешностью при расчёте чисел с плавающей точкой.

Результатом вычисления функции нахождения корней может быть вектор комплексных чисел. Например, вычислим корни для ранее заданного многочлена $y=4-3 \cdot x^3 + 2 \cdot x^4 + 33 \cdot x^5$.

In [ ]:
roots(y)
Out[0]:
5-element Vector{ComplexF64}:
  -0.6988527464788102 + 0.0im
 -0.22121608146338845 - 0.5967022127055316im
 -0.22121608146338845 + 0.5967022127055316im
   0.5403394243997632 - 0.3691905470638564im
   0.5403394243997632 + 0.3691905470638564im

Также корни можно вычислить поэлементно, для вектора многочленов $Y$:

In [ ]:
roots.(Y)
Out[0]:
3-element Vector{Vector}:
 ComplexF64[-0.34974582621172073 - 0.43899033747531147im, -0.34974582621172073 + 0.43899033747531147im, 0.34974582621172157 - 1.746977896113271im, 0.34974582621172157 + 1.746977896113271im]
 [-1.0, 1.0]
 [0.2928932188134525, 1.7071067811865475, 0.0]

Вывод

В этом примере мы рассмотрели основные подходы базовых операций с многочленами: создания, вычисления и нахождения корней. Для более детального изучения темы и улучшения навыков работы с многочленами в Engee рекомендуем обратиться к соответствующим разделам документации: Библиотека Polynomials.jl.