Работа с мнимыми единицами в 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.