Работа с мнимыми единицами в Python через тип complex

Раздел: Типы данных -> Комплексные числа

Создание комплексного числа и его свойства

Как создать число с вещественной и мнимой частями?

Тип данных complex представляет число с вещественной и мнимой частями. Основной приём для получения такого объекта в Python: вызов встроенной функции complex() с числами в качестве аргументов.

z1 = complex(3, 4)
z2 = complex(2.5, -1)
print(z1)
print(z2)

тип данных complex python (тип данных complex в python)

(3+4j)
(2.5-1j)

Первый аргумент попадает в вещественную часть, второй в мнимую. При одном числовом аргументе мнимая часть становится нулевой, и Python все равно возвращает объект complex.

z = complex(7)
print(z)
print(type(z).__name__)
(7+0j)
complex

Атрибуты real и imag показывают части числа. Они доступны сразу после создания объекта.

z = complex(3, 4)
print(z.real)
print(z.imag)
3.0
4.0

Как записать комплексное значение в виде литерала?

Для фиксированных чисел применяют суффикс j или J после числового литерала.

a = -2 + 3j
b = 4 - 0.5J
c = 1j * 6
print(a)
print(b)
print(c)
(-2+3j)
(4-0.5j)
6j

Выражение 1j уже является значением complex, поэтому умножение на целое число дает новое комплексное число. Заглавная J не меняет смысл литерала.

Пробел между числом и суффиксом не разрешается. Запись 3 j будет содержать две лексемы и вызовет ошибку синтаксиса. Умножение 3*j использует имя j, которое должно быть заранее определено как переменная.

Как превратить строку в объект complex?

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

text = '-7+2j'
z = complex(text)
print(z)
print(z.real, z.imag)
(-7+2j)
-7.0 2.0

Пробелы вокруг знаков плюс и минус в строке не допустимы. Перед вызовом complex() строку нужно очистить от лишних пробелов.

Значение '1 + 4j' не преобразуется, так как парсер ждет один числовой литерал без разделителей. Возникает исключение ValueError. Передача двух строковых аргументов тоже ошибочна: функция допускает строку только в единственном аргументе.

Как построить комплексное число из полярных координат?

В задачах с амплитудой и фазой применяется функция cmath.rect(). Она превращает модуль и угол в обычное декартово представление.

import cmath
import math

r = 2.0
phi = math.pi / 2
z = cmath.rect(r, phi)
print(z)
(1.2246467991473532e-16+2j)

Ожидаемое число 2j получилось с небольшой вещественной погрешностью. Это следствие хранения числа пи в двоичном виде и вычисления косинуса с плавающей точкой.

Как выполнять сложение, вычитание, умножение и деление?

Арифметика над complex не требует ручного вычисления частей. Операторы +, -, *, / и ** работают непосредственно.

x = 1 + 2j
y = 3 - 1j
print(x + y)
print(x - y)
print(x * y)
print(x / y)
print(x ** 2)
(4+1j)
(-2+3j)
(5+5j)
(0.1+0.7j)
(-3+4j)

Модуль числа вычисляется функцией abs(). Сопряженное число возвращает метод conjugate().

mod = abs(3 - 4j)
conj = (3 - 4j).conjugate()
print(mod)
print(conj)
5.0
(3+4j)

Операторы < и > не имеют смысла для комплексных чисел. Попытка применить их вызывает TypeError. Если требуется сравнить удаленность от нуля, используется abs(z1) < abs(z2).

Функции int() и float() не преобразуют объект complex. Даже complex(4, 0) нельзя перевести целиком; отдельно извлекается атрибут .real.

Дополнительные примеры показывают связь между операциями и свойствами комплексного числа.

Проверка свойства произведения на сопряженное число.

Пример
z = 6 - 8j
conj = z.conjugate()
prod = z * conj
print(conj)
print(prod)
print(prod.real)
print(abs(z) ** 2)
(6+8j)
(100+0j)
100.0
100.0

Мнимая часть произведения исчезает, потому что знаки мнимых частей у z и conj противоположны.

Переход из декартовой формы в полярную и обратно.

Пример
import cmath
z = 1 + 1j
r, phi = cmath.polar(z)
round_trip = cmath.rect(r, phi)
print(r)
print(phi)
print(abs(round_trip - z) < 1e-14)
1.4142135623730951
0.7853981633974483
True

Разница между исходным значением и восстановленным значением меньше заданного допуска.

Экспонента чисто мнимого показателя.

Пример
import cmath
import math

result = cmath.exp(1j * math.pi)
print(result)
print(abs(result))
(-1+1.2246467991473532e-16j)
1.0

Модуль результата равен единице, поэтому cmath.exp(...) находится на границе единичного круга.

Корень и логарифм отрицательного вещественного числа.

Пример
import cmath
print(cmath.sqrt(-16))
print(cmath.log(-1))
4j
3.141592653589793j

Модуль результата корня равен 4, а логарифм дает аргумент отрицательной полуоси.

Комплексные корни квадратного уравнения.

Пример
import cmath
a = 1
b = -2
c = 5
disc = complex(b * b - 4 * a * c, 0)
x1 = (-b + cmath.sqrt(disc)) / (2 * a)
x2 = (-b - cmath.sqrt(disc)) / (2 * a)
print(disc)
print(x1)
print(x2)
(-16+0j)
(1+2j)
(1-2j)

Корни являются сопряженными числами, когда коэффициенты уравнения вещественны.

Поворот точки на прямой угол.

Пример
point = 1 + 0j
rotated = point * 1j
print(rotated)
print(rotated * 1j)
1j
(-1+0j)

Умножение на мнимую единицу соответствует повороту на 90 градусов против часовой стрелки.

Смешивание complex с числами других типов.

Пример
x = 2.5 + 0.5j
y = 2
z = x * y - 1
print(z)
print(isinstance(z, complex))
(4+1j)
True

Арифметическое выражение с вещественным целым и комплексным операндом сохраняет тип complex.

Тип данных complex в Python - comments

En
тип данных complex python (python)