Модуль math (часть 3)

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

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

Завершаем рассмотрение функций модуля math, и очередной блок посвящен тригонометрическим функциям:

Функция

Описание

degrees(x)

пересчет из радиан в градусы

radians(x)

пересчет из градусов в радианы

cos(x)

вычисление косинуса угла x

sin(x)

вычисление синуса угла x

tan(x)

вычисление тангенса угла x

acos(x)

вычисление арккосинуса от значения x

asin(x)

вычисление арксинуса от значения x

atan(x)

вычисление арктангенса от значения x

atan2(y, x)

вычисление арктангенса atan(y / x)

Первые две функции выполняют конвертацию углов из радиан в градусы и наоборот:

math.degrees(math.pi)  # 180.0
math.degrees(math.pi/4)  # 45.0
math.radians(180)  # 3.141592653589793
math.radians(-45.0)  # -0.7853981633974483

Следующие три функции – это обычные, школьные функции вычисления косинуса, синуса и тангенса для указанного угла x, заданного в радианах:

math.cos(math.pi/3)  # 0.5000000000000001
math.sin(-math.pi/4)  # -0.7071067811865476
math.tan(0.1)  # 0.10033467208545055
math.tan(math.pi/2)  # 1.633123935319537e+16

Последние четыре функции – это обратные тригонометрические функции для вычисления углов по значениям синуса, косинуса и тангенса:

math.acos(0)  # 1.5707963267948966
math.asin(math.sin(0.1))  # 0.1
math.asin(-1.0)  # -1.5707963267948966
math.asin(-1.1)  # ValueError
math.asin(1.0)  # 1.5707963267948966
math.asin(1.01)  # ValueError
math.atan(0)  # 0
math.atan(-10)  # -1.4711276743037347
math.atan(77.3)  # 1.5578604377870968

Обратите внимание, что допустимые значения аргумента для функций asin() и acos() лежат в диапазоне [-1.0; 1.0]. Выход за этот диапазон приводит к ошибке ValueError.

Гиперболические функции

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

Функция

Описание

cosh(x)

гиперболический косинус угла x

sinh(x)

гиперболический синус угла x

tanh(x)

гиперболический тангенс угла x

acosh(x)

обратная гиперболическая функция для cosh(x)

asinh(x)

обратная гиперболическая функция для sinh(x)

atanh(x)

обратная гиперболическая функция для tanh(x)

Применяются они по аналогии с обычными тригонометрическими функциями, например:

math.cosh(math.pi/2)  # 2.5091784786580567
math.sinh(0)  # 0.0
math.tanh(-5.2)  # -0.9999391368861988

И обратные им функции:

math.asinh(math.sinh(-2.3))  # -2.3
math.asinh(0)  # 0.0
math.acosh(0.99)  # ValueError
math.acosh(1.0) # 0.0
math.acosh(1000)  # 7.600902209541989
math.atanh(-1.0)  # ValueError
math.atanh(-0.99)  # -2.6466524123622457

Обратите внимание, что у обратных гиперболических функций свой допустимый диапазон значений, выход за который приводит к появлению ошибки ValueError.

Функции вычисления расстояний, сумм и произведений

Следующий блок функций модуля math связан с вычислением различных расстояний, сумм и произведений:

Функция

Описание

dist(p, q)

вычисление евклидового расстояния между точками p и q (в пространстве произвольной размерности)

hypot(*coordinates)

вычисление евклидовой нормы радиус-вектора с координатами coordinates

fsum(iterable)

вычисление суммы значений итерируемого объекта iterable

prod(iterable, start)

вычисление произведения элементов итерируемого объекта iterable с начальным значением start

sumprod(p, q)

вычисление суммы из произведений пар соответствующих элементов итерируемых последовательностей p и q

Давайте подробно разберем работу каждой из этих функций. Первая dist(p, q) возвращает евклидовое расстояние между двумя точками p и q, заданных в пространстве произвольной размерности:

Формула для его вычисления выглядит следующим образом:

Реализовать ее можно было бы командой:

p = [0.1, -2.1, 3.2, 0.5]
q = [8.2, 7.2, 0.1, -0.2]
 
dist = math.sqrt(sum((px - qx) ** 2.0 for px, qx in zip(p, q)))

Но вместо этой длинной строчки можно воспользоваться уже готовой функцией dist(p, q):

res = math.dist(p, q)  # 12.735776379946376

Следующая аналогичная функция hypot() делает все то же самое, только одна из точек имеет нулевые координаты:

Расстояние вычисляется по формуле:

и может быть записано в виде команды:

h = math.sqrt(sum(x**2 for x in p))  # 3.861346915261565

Тот же результат можно получить путем вызова функции hypot():

res = math.hypot(*p)  # 3.861346915261565

Обратите внимание, что в hypot() координаты передаются, как набор позиционных аргументов, поэтому список p распаковывается. Или же вызов этой функции можно записать так:

math.hypot(3, 4, -1)  # 5.0990195135927845

Получим евклидову норму радиус-вектора с координатами (3; 4; -1) в трехмерном пространстве.

Следующая функция fsum(iterable) вычисляет сумму значений итерируемого объекта iterable. Пусть, например, у нас имеется список из десяти элементов со значениями 0.1:

values = [0.1] * 10

Тогда значение суммы всех элементов этого списка можно вычислить так:

math.fsum(values)  # 1.0

А вот если бы мы воспользовались уже знакомой нам функцией sum(), то получили бы такой результат:

sum(values)  # 0.9999999999999999

Как видите, точность вычислений с вещественными числами у функции fsum() выше, чем у встроенной функции sum(). Однако, в отличие от функции sum(), функция fsum() работает только с вещественными числами. Даже если ей передать целые числа:

d = [1, 2, 3]
math.fsum(d)  # 6.0

то они все равно будут обрабатываться, как вещественные типа float.

Следующая функция prod(iterable, start) выполняет умножение чисел итерируемого объекта iterable. Например:

vs = [0.1, 10.5, -2.3]
math.prod(vs)  # -2.415 = 0.1 * 10.5 * (-2.3)

Дополнительный необязательный параметр start позволяет умножать полученный результат на указанное значение:

math.prod(vs, start=10)  # -24.15

Последняя функция sumprod(p, q) была введена в Python 3.12 и вычисляет следующую сумму произведений итерируемых объектов p и q:

Реализовать ее можно командой:

s = sum(itertools.starmap(operator.mul, zip(p, q, strict=True)))

И тот же самый результат вернет функция:

math.sumprod(p, q)  # -14.08

Вот основные функции модуля math, которые вам могут пригодиться при построении ваших программ.

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

Видео по теме