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

Построение комплексных чисел

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

Комплексное число $z$ - это число вида $z=x+y\cdot i$, где $x, y$ - вещественные числа, $i$ - мнимая единица $i=\sqrt{-1}$. Число $x$ - действительная часть комплексного числа $z$ и обозначается как $Re(z)$. Число $y$ - мнимая часть комплексного числа $z$ и носит обозначение $Im(z)$.

Комплексное число $z$ можно построить в декартовой системе координат, где по оси абсцисс откладывается его действительная часть $Re(z) = x$, а по оси ординат - мнимая $Im(z) = y$.

Также $z$ может быть построено в полярных координатах. Для этого следует обратиться к его показательной или тригонометрической записи $z=r \cdot e^{i \cdot \varphi} = r \cdot (cos{\varphi} + i \cdot sin{\varphi})$.
Отсюда: модуль $r = \sqrt{Re(z)^2+Im(z)^2}$ и аргумент $\varphi = arctg(\frac{Im(z)}{Re(z)})$ - соответственно расстояние от начала координат и радиус-вектор с осью абсцисс для комплексного числа $z$.

Построение вектора комплексных чисел

Зададим вектор комплексных чисел.

In [ ]:
z = [
    3 + 4im,
    -4 - 3im,
    1 - 2im,
    -1 - 1im
    ];

Загрузим библиотеку и подключим бэкенд для построения графиков.

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

Построим заданный вектор на комплексной плоскости, подставив в качестве координат поэлементно извлеченные из z действительные и мнимые части.

In [ ]:
scatter(
    real.(z), imag.(z),
    title="Комплексные числа",
    xlabel="Re(z)",
    ylabel="Im(z)",
    markersize=4,
    markercolor=:red,
    legend=:topleft,
    label="z"
    )
Out[0]:

При отображении комплексных чисел не обязательно извлекать действительную и мнимую части. При передаче комплексных чисел в функции scatter(z) или plot(z) их координаты на комплексной плоскости будут определены автоматически, в чём мы убедимся далее.

Корни n-ной степени из единицы на комплексной плоскости

Для многочлена вида $z^n-1$, где $n \in \mathbb N$, можно найти комплексные корни $z$ согласно формуле Муавра:

$z_k = cos\frac{2\pi k}{n}+i \cdot sin\frac{2\pi k}{n}$, где $k=0,1,\dots,n-1$

Определим функцию для расчета корней:

In [ ]:
nthroots(n::Integer) = [ cospi(2k/n) + sinpi(2k/n)im for k = 0:n-1 ]
Out[0]:
nthroots (generic function with 1 method)

Найдём комплексные корни многочлена степени n = 5:

In [ ]:
z = nthroots(5)
Out[0]:
5-element Vector{ComplexF64}:
                 1.0 + 0.0im
 0.30901699437494734 + 0.9510565162951536im
 -0.8090169943749475 + 0.587785252292473im
 -0.8090169943749475 - 0.587785252292473im
  0.3090169943749477 - 0.9510565162951535im

Отобразим найденные корни на комплексной плоскости в декартовой системе координат. В этом построении передадим функции scatter() массив комплексных чисел, не извлекая при этом действительную и мнимую части.

In [ ]:
scatter(
    z,
    title="Корни полинома",
    xlabel="Re(z)",
    ylabel="Im(z)",
    markersize=4,
    markercolor=:blue,
    legend=:topleft,
    label="z"
    )
Out[0]:

Согласно свойствам корней n-ой степени из 1, модуль комплексных корней будет равен 1. Чтобы убедиться в этом, перейдем к отображению этих корней в полярных координатах. Функции scatter() в этом случае необходимо передать массивы аргументов и модулей комплексных корней.

In [ ]:
scatter(
    angle.(z), abs.(z),
    proj=:polar,
    marker = :circle,
    m=4, #markersize
    markercolor=:green,
    legend=:topleft,
    label="z"
    )
Out[0]:

Как и следует из геометрических свойств корней 5-ой степени из 1, их модули равны 1, на комплексной плоскости они располагаются в вершинах правильного пятиугольника с центром в начале координат, а один из корней равен комплексной единице $1+0 \cdot i$.

Параметрическая кривая на комплексной плоскости

Построим на комплексной плоскости параметрическую кривую, которая представлена выражением $f(t) = t \cdot exp(t \cdot i)$.
Параметр $t$ будет определен в диапазоне $[0,\ 4\cdot \pi]$.
Зададим массив из 200 точек параметра $t$ в установленном диапазоне и рассчитаем массив точек параметрической кривой.

In [ ]:
t = collect(range(0, 4pi, length=200));
z = t.*exp.(t.*im);

Отобразим параметрическую кривую на комплексной плоскости в декартовой системе координат:

In [ ]:
plot(
    z,
    title="Параметрическая кривая",
    xlabel="Re(z)",
    ylabel="Im(z)",
    markersize=4,
    markercolor=:blue,
    legend=:topright,
    label="z",
    width=3
    )
Out[0]:

Отобразим параметрическую кривую на комплексной плоскости в полярной системе координат:

In [ ]:
plot(
    angle.(z), abs.(z),
    proj=:polar,
    legend=:topleft,
    label="z",
    width=3
    )
Out[0]:

Собственные значения матрицы на комплексной плоскости

Для квадратной матрицы $n\times n$ существуют $n$ собственных значений, которые либо действительны, либо являются комплексно-сопряженными парами.
Убедимся в этом свойстве и отобразим собственные значения на комплексной плоскости.

Для нахождения сопряженных значений загрузим и подключим библиотеку LinearAlgebra:

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

Найдем собственные значения для матрицы $20\times 20$, сгенерированной случайным образом.

In [ ]:
z=eigen(rand(20,20));

Построим собственные значения матрицы на комплексной плоскости.

In [ ]:
scatter(
    z.values,
    title="Собственные значения",
    xlabel="Re(z)",
    ylabel="Im(z)",
    markersize=4,
    markercolor=:magenta,
    legend=:topleft,
    label="z"
    )
Out[0]:

Как и следует из свойств собственных значений для квадратной матрицы $20\times 20$, на комплексной плоскости можно наблюдать 20 точек, которые либо располагаются на оси действительных значений, либо представляют собой комплексно-сопряжённые пары.

Несколько массивов комплексных чисел на плоскости

Рассмотрим представление на комплексной плоскости двух различных наборов комплексных данных. Они будут определены следующими выражениями:

$z_1 = x^{e^{-x^2}}$
$z_2 = 2 \cdot x^{e^{-x^2}}$
$x \in [-2,\ 2]$

Определим вектор значений $x$ с шагом $0,25$ и рассчитаем массивы значений $z_1$ и $z_2$.

In [ ]:
x = collect(-2:0.25:2);
z1=Complex.(x).^exp.(-x.^2);
z2=2*Complex.(x).^exp.(-x.^2);

Извлечем действительные и мнимые части чисел для обоих массивов:

In [ ]:
re_z1 = real.(z1);
im_z1 = imag.(z1);
re_z2 = real.(z2);
im_z2 = imag.(z2);

Построим на одной плоскости два набора комплексных чисел:

In [ ]:
scatter(
    re_z1, im_z1,
    title="Массивы комплексных чисел",
    xlabel="Re(z)",
    ylabel="Im(z)",
    marker=:cross,
    markersize=5,
    markercolor=:violet,
    legend=:topleft,
    label="z1"
    )
scatter!(
    re_z2, im_z2,
    marker=:xcross,
    markersize=5,
    markercolor=:orange,
    label="z2"
    )
Out[0]:

Вывод

В этом демонстрационном примере мы рассмотрели различные инструменты и приемы для графического представления комплексных чисел в Engee.