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 [ ]:
Pkg.add(["LinearAlgebra"])
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) 时,它们在复平面上的坐标将自动确定,下面我们将看到这一点。

复数平面上从 1 开始的 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]:

根据从 1 开始的 n 阶根的性质,复数根的模将等于 1。为了确定这一点,让我们继续将这些根映射到极坐标中。在这种情况下,函数scatter() 必须传递参数数组和复数根的模数。

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

根据 1 的 5 度根的几何性质,它们的模等于 1,在复平面上,它们位于以坐标原点为中心的正五边形的顶点上,其中一个根等于复单位$1+0 \cdot i$ 。

复平面上的参数曲线

让我们在复平面上构建一条参数曲线,其表达式为$f(t) = t \cdot exp(t \cdot i)$ 。
参数$t$ 将定义在$[0,\ 4\cdot \pi]$ 的范围内。
让我们在定义的范围内为参数$t$ 设置一个包含 200 个点的数组,并计算参数曲线的点数组。

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]$

我们按$0,25$ 的步骤定义$x$ 的值向量,并计算$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中用图形表示复数的各种工具和技术。