Линейные пространства и линейные отображения#
Линейное пространство - это просто набор векторов (с некоторыми свойствами). Плоские векторы и пространственные векторы, с которыми вы, возможно, знакомы из школьной математики, являются примерами векторов. Здесь мы узнаем, что такие функции, как многочлены и тригонометрические функции, также являются векторами. Расширяя это рассмотрение, звуки можно рассматривать как векторы. Используя Python, мы можем видеть или слышать эти различные векторы. [eal23]
В этой главе мы будем использовать абстрактные аргументы (абстрактные линейные пространства). Вы можете подумать, что абстрактные рассуждения утомительны и скучноваты, но это самый важный метод в науке, позволяющий рассматривать, казалось бы, разные объекты единым образом и позволяющий достичь хорошего понимания. Прогресс покажется намного проще, если вы освоитесь с этим процессом получения результатов с помощью строгих пошаговых аргументов, начиная с нескольких абстрактных понятий.
Линейные пространства#
На протяжении всей этой книги \(K\) обозначает либо множество \(\mathbb R\) всех действительных чисел, либо множество \(\mathbb C\) всех комплексных чисел. \(K\) называется скалярным полем, а его элемент называется скаляром.
Множество \(V\) называется линейным пространством или векторным пространством над \(K\) (элемент \(V\) называется вектором), если оно удовлетворяет следующим пяти условиям.
Для любых векторов \(x\) и \(y\) определена их векторная сумма \(x + y \in V\) (то есть \(V\) замкнуто при векторном суммировании).
Для любого вектора \(x\) и любого скаляра \(a\) определено умножение на скаляр \(ax \in V\) (то есть \(V\) замкнуто при умножении на скаляр).
В \(V\) определен специальный вектор \(0\), называемый нулевым вектором (существование нуля).
Для любого вектора \(x\) определен вектор \(−x \in V\), называемый его обратным вектором (существование обратного).
Чтобы избежать путаницы между скалярами и векторами, для векторов используется жирный шрифт.
\(+\) - это бинарная операция, отображение из \(V \times V\) в \(V\). Важно, что \(x + y\) определяется в пределах \(V\).
Для векторной суммы, умножения на скаляр, нулевого вектора и обратного вектора, определенных выше, выполняется следующий набор условий, называемых аксиомами линейного пространства:
(a) \(x + y = y + x\)
(b) \((x + y) + z = x + ( y + z)\)
(c) \(x + 0 = x\)
(d) \(x + (−x) = 0\)
(e) \(a (x + y) = ax + a y \)
(f) \((a + b) x = ax + bx\)
(g) \((ab) x = a (bx) \)
(h) \(1x = x\)
Здесь мы отличаем скаляр \(0 \in K\) от вектора \(0 \in V\), в то время как \(1 \in K\) является скаляром.
Линейное пространство над \(\mathbb R\) иногда называют вещественным линейным пространством, где вектор может быть умножен только на действительное число.
Линейное пространство над \(\mathbb C\) называется комплексным линейным пространством, и допускается умножение на комплексное число.
В частности, \(\mathbb R\) само по себе является вещественным линейным пространством, а \(\mathbb C\) - комплексным линейным пространством. \(\mathbb C\) также является вещественным линейным пространством, если рассматривать комплексное число как вектор, действительное число как скаляр и умножение комплексное числа на действительное число как скалярное кратное. Здесь скаляр \(0\) и вектор \(0\) совпадают.
С другой стороны, \(\mathbb R\) не является комплексным линейным пространством, даже если мы рассматриваем комплексное число как скаляр, а умножение действительного числа на комплексное число как умножение на скаляр.
В Python мы можем выражать векторы кортежами или списками, но он не поддерживает векторные операции.
Используя NumPy, мы можем манипулировать векторными суммами и скалярными кратными как обычными математическими формулами. Вместе с библиотекой Matplotlib давайте проверим \(x + y = y + x\) визуально на плоскости.
Программа: vec2d.py
from numpy import array
import matplotlib.pyplot as plt
o, x, y = array([0, 0]), array([3, 2]), array([1, 2])
arrows = [(o, x + y, 'b'), (o, x, 'r'), (x, y, 'g'), (o, y,'g'), (y, x, 'r')]
for p, v, c in arrows:
plt.quiver(p[0], p[1], v[0], v[1], color=c, units='xy', scale=1)
plt.axis('scaled'), plt.xlim(0, 5), plt.ylim(0, 5)
plt.show()
Строка 4: Векторы 0 = (0, 0), x = (3, 2) и y = (1, 2) выражаются массивами o, x и y соответственно. Используя массивы для векторов, векторная сумма x + y выражается как x +y, а скалярное кратное 2x - как 2 * x.
Строки 5, 6: Список векторов, которые отображаются в виде стрелок. Тройка из начальной точки, вектора и цвета - это параметр, определяющий стрелку.
Строки 7-9: Нарисуйте стрелку для каждой тройки (p, v, c) в стрелках списка, используя функцию quiver в Matplotlib. Первые четыре фактических аргумента называются аргументами позиции. Последние три аргумента color, units, scale называются аргументами name, а правые части = являются фактическими дополнениями. Порядок аргументов position важен, но порядок аргументов name не имеет значения. Вы можете изменить порядок, потому что имена передают значения. scale=’xy’ подразумевает, как задать размер стрелки и задает его с помощью координат x и y. scale=1 - масштаб стрелки, и большее значение уменьшает размер.
Программа: vec3d.py
from vpython import vec, arrow, mag
o = vec(0, 0, 0)
x, y, z = vec(1, 0, 0), vec(0, 1, 0), vec(0, 0, 1)
arrows = [(o, x + y), (x, y + z), (o, x + y + z), (o, x), (y, x),
(z, x), (y + z, x), (o, y), (x, y), (z, y), (x + z, y),
(o, z), (x, z), (y, z), (x + y, z)]
for p, v in arrows:
arrow(pos=p, axis=v, color=v, shaftwidth=mag(v) / 50)
Строки 3, 4: Используя класс vector из VPython, представим векторы 0 = (0, 0, 0), x = (1, 0, 0), y = (0, 1, 0) и z = (0, 0, 1) через o, x, y и z соответственно.
Строки 5-7: Список векторов, нарисованных в виде стрелок. Пара начальной точки и вектора - это параметр, определяющий стрелку.
Строки 8, 9: Нарисуйте стрелку для каждой пары (p, v) в виде стрелок. Цвет вектора и толщина оси определяются компонентами и длиной вектора.