Курс по стандартной библиотеке: https://stepik.org/a/259466?utm_source=proproprogs
Завершаем
рассмотрение функций модуля 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:
Тогда значение
суммы всех элементов этого списка можно вычислить так:
А вот если бы мы
воспользовались уже знакомой нам функцией 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