Тип данных complex

Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs

Смотреть материал на YouTube | RuTube

Мы с вами начинаем знакомиться с, так называемой, стандартной библиотекой языка Python (The Python Standard Library). Ее можно рассматривать, как набор пакетов и модулей, поставляемых совместно с интерпретатором, для расширения базовой функциональности языка Python. В частности, она содержит такие полезные и широко используемые модули, как:

  • re – обработка текста регулярными выражениями;
  • random – генерация псевдослучайных чисел;
  • datetime – работа с датой и временем;
  • collections – набор коллекций для реализации различных структур данных;
  • itertools – формирование различных итераторов для перебора данных коллекций;

и многие другие. Конечно, в рамках этого курса мы затронем лишь наиболее значимые модули стандартной библиотеки, которые чаще всего применяются на практике. Изучать ее сразу всю целиком большого смысла нет, так как в ней содержится немало специализированных инструментов, которые интересны лишь узким специалистам в своих областях. Если в будущем вам потребуется, например, криптографическое шифрование данных, или взаимодействие с сетью, или многопоточное программирование, то можно будет обратиться к дополнительной литературе по этим отдельным, глубоким темам. А чтобы в целом представлять возможности стандартной библиотеки, то с ее содержимым можно ознакомиться на странице официальной документации:

https://docs.python.org/3/library/index.html

Тип данных complex

Но начать я решил со встроенных типов данных, о которых мы не говорили в начальном курсе по языку Python – это:

  • complex – для работы с комплексными числами;
  • frozenset – неизменяемое множество;

и дополнительные типы, такие как:

  • OrderedDict – упорядоченный словарь;
  • enum – перечисления;
  • namedtuple – именованные кортежи;
  • defaultdict – модифицированный словарь.

Начнем с типа complex. Конечно, он больше интересен инженерам и математикам, так как появляется при попытке извлечения квадратного корня из отрицательного числа. Но, тем не менее, это довольно распространенный тип данных, о котором следует знать.

Я напомню, что квадратный корень из минус единицы равен, так называемой, мнимой единице:

Ее в математике обозначают через j или i. В языке Python используется символ j. В результате любое комплексное число можно представить в виде суммы действительной и мнимой частей. Например, так:

a = 10 + 5j

Здесь 10 – это действительная (real) часть, а 5j – мнимая (image) часть. Соответственно, в Python можно получить эти части через атрибуты real и imag:

print(a.real) # 10.0
print(a.imag) # 5.0

Как вариант, комплексные числа можно определять с помощью специального встроенного класса complex:

b = complex(6, -3.5)

Главное отличие второго подхода в том, что мы в качестве аргументов типа complex можем передавать не только числа, но и переменные, например, так:

b_re = -7.4
b_im = 0.1
b = complex(b_re, b_im)

А вот такое определение приведет к ошибке:

d = b_re + b_im*j

так как переменная j не определена. Чтобы все сработало, в качестве мнимой части следует указывать конкретное числовое значение:

d = b_re + 0.1j

Операции с комплексными числами

Так как комплексные числа состоят из двух компонент, их не редко изображают в виде вектора в координатах (real, imag) следующим образом:

Из этого рисунка хорошо видно, что из себя представляет длина, то есть, модуль комплексного числа. Для его определения используется уже знакомая нам функция abs:

m = abs(a)

Часто при операциях с комплексными числами требуется получать комплексно-сопряженные числа. Для этого достаточно вызвать метод conjugate комплексного числа:

d = b.conjugate() # -7.4 - 0.1j

Особенность комплексно-сопряженного числа в том, что оно при умножении на исходное комплексное число дает обычное вещественное число:

u = b * d # мнимая часть равна 0

Соответственно, с комплексными числами можно выполнять и другие арифметические операции:

a + 7 # 17 + 5j
a - b # 17.4 + 4.9j
a * 2 # 20+10j
a ** 2 # 75 + 100j
b / a # -0.588 + 0.304j

Модуль cmath

Для работы с комплексными числами вместо модуля math следует импортировать модуль cmath:

import cmath

который содержит множество стандартных математических функций. Например, такие:

Функция модуля cmath

Описание

exp()

экспонента

log()

натуральный логарифм

log10()

десятичный логарифм

sin()

синус

cos()

косинус

tan()

тангенс

sqrt()

корень квадратный

phase()

фаза комплексного числа

polar()

выражение комплексного числа в полярных координатах (фаза, длина)

rect()

выражение комплексного числа в исходном виде: действительная и мнимая части

Существуют и другие функции в модуле cmath. Применяются они следующим образом:

cmath.sqrt(a) # корень квадратный от комплексного числа a
cmath.phase(a) # фаза (угол) комплексного числа a
d = cmath.polar(a) # представление числа a в полярных координатах
cmath.sin(a) # синус от комплексного числа a

И так для всех функций модуля cmath.

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

Давайте посмотрим на конкретном примере вычисления корней квадратного уравнения с использованием комплексных чисел:

from math import sqrt
 
 
def solve_quadratic(a, b, c):
    D = b ** 2 - 4 * a * c
    if D >= 0:
        root1 = (-b + sqrt(D)) / (2 * a)
        root2 = (-b - sqrt(D)) / (2 * a)
    else:
        root1 = complex(-b / (2 * a), sqrt(abs(D)) / (2 * a))
        root2 = complex(-b / (2 * a), -sqrt(abs(D)) / (2 * a))
 
    return root1, root2
 
 
roots = solve_quadratic(4, 7, 8)
print("Корни:", roots)

В общем случае корни могут получаться комплексными, если дискриминант меньше нуля. В школьной программе в этом случае писали, что действительных корней нет, но зато есть комплексные числа. И эта программа позволяет вычислять их. После запуска программы при решении квадратного уравнения вида:

Получим два комплексных числа:

Корни: ((-0.875+1.1110243021644486j), (-0.875-1.1110243021644486j))

Как видите, использование комплексных чисел в Python довольно удобно благодаря простоте синтаксиса и полной поддержке стандартных математических операций. Это позволяет весьма эффективно решать различные научные и технические задачи.

Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs

Видео по теме