12  Корисні математичні функції

Автор

Юрій Клебан

Опубліковано

3/18/23

Функції у програмуванні мають ім'я/назву та () (круглі дужки). Виклик функції зазвичай має вигляд function_name(params).

12.1 Заокруглення чисел

У цьому розділі описано роботу функцій: round(), ceiling(), floor(), trunc(), signif().

Як ми знаємо з математики, що заокруглення чисел буває “вверх”, “вниз” або відносно деякого значення, зазвичай пов’язаного із цифрою 5 (3.6 заокруглюємо до цілого як \(4\), а \(3.2\) як \(3\), ввжаючи \(3.5\) межею.

Warning

Увага! Заокрулення чисел у програмуванні може призводити до помилок у результатах обчислень. Для задач бізнесу, фінансів або технічних процесів мінімальні відхилення можуть призводити до викривлених результатів або збоїв у системах.

12.1.1 Функція round()

Примітка. Тут і надалі функції будуть позначатися як назва() (назва і “круглі” дужки).

Для заокруглення дійних чисел (з дробовою частиною) за правилом <0.5 & >=0.5 (не знаю як називається науково) використовується функція round(x, y), де x - число, y - точність (кількість знаків після коми/крапки). Наприклад:

round(3.557, 2)
[1] 3.56
round(3.241, 2)
[1] 3.24
round(-3.557, 2)
[1] -3.56
round(-3.241, 2)
[1] -3.24

Також можна використати round(x) з одним параметром, тоді заокруглення відбудеться до цілої частини, наприклад:

round(124.345)
[1] 124

12.1.2 Функція floor()

Для заокруглення до найближчого меншого цілого числа слід скористатися функцією floor():

floor(3.557)
[1] 3
floor(3.241)
[1] 3
floor(-3.557)
[1] -4
floor(-3.241)
[1] -4

12.1.3 Функція ceiling()

Для заокруглення до найближчого більшого цілого числа слід скористатися функцією ceiling():

ceiling(3.557)
[1] 4
ceiling(3.241)
[1] 4
ceiling(-3.557)
[1] -3
ceiling(-3.241)
[1] -3

12.1.4 Функція trunc()

Функція trunc() у R використовується для отримання найбільшого цілого числа, яке більше або рівне x. Простими словами це означає, що для чисел менших 0 (x < 0) trunc() працює як celing(), а для чисел більших нуля x > 0, як floor():

x <- 5.34
print(paste("trunc:", trunc(x), "celing:", ceiling(x), "floor:", floor(x), sep = " "))
[1] "trunc: 5 celing: 6 floor: 5"
x <- x * -1
print(paste("trunc:", trunc(x), "celing:", ceiling(x), "floor:", floor(x), sep = " "))
[1] "trunc: -5 celing: -5 floor: -6"

12.1.5 Функція signif()

Інколи виникає потреба заокруглити не десяткову частину числа, а десятки, сотні, тисячі і так далі. Розглядемо варіант, коли у нас є велике число \(11 547 741.3\) і нам потрібно коротко його записати як \(11.5 млн\). Для таких задач можна використати функцію signif(x,y), де x - число, яке потрібно заокруглити до певного порядку, y - порядок заокруглення (рахувати від початку). Наприклад:

big_number <- 11547741.3
rounded_big_number <- signif(big_number,3)
rounded_big_number
[1] 11500000
rounded_big_number / 1000000
[1] 11.5

12.2 Послідовності чисел

Послідовності у програмуванні на R це вектори, які містять набір чисел. Найпростіший спосіб створити послідовність у R це використання оператора “двокрапка” :, наприклад:

seq <- 1:4
seq
[1] 1 2 3 4
class(seq)
[1] "integer"

12.2.1 Функція seq()

Функція seq() використовується для створення послідовностей чисел. Ця функція приймає наступні аргументи:

  • from - початок послідовності
  • to - кінець послідовності
  • by - крок послідовності
  • length.out - довжина послідовності

Розглянемо кілька прикладів використання функції seq().

Виведемо числа від \(1\) до \(10\):

seq(1, 10)
 [1]  1  2  3  4  5  6  7  8  9 10

Виведемо числа від \(0\) до \(10\) з кроком \(2.5\):

seq(0, 10, by = 2.5)
[1]  0.0  2.5  5.0  7.5 10.0

Виведемо та покажемо на графіку 50 чисел від \(0\) до \(10\) (крок у такому випадку обчислюється функцією самостійно):

s <- seq(0, 10, length=50)
print(s)
 [1]  0.0000000  0.2040816  0.4081633  0.6122449  0.8163265  1.0204082
 [7]  1.2244898  1.4285714  1.6326531  1.8367347  2.0408163  2.2448980
[13]  2.4489796  2.6530612  2.8571429  3.0612245  3.2653061  3.4693878
[19]  3.6734694  3.8775510  4.0816327  4.2857143  4.4897959  4.6938776
[25]  4.8979592  5.1020408  5.3061224  5.5102041  5.7142857  5.9183673
[31]  6.1224490  6.3265306  6.5306122  6.7346939  6.9387755  7.1428571
[37]  7.3469388  7.5510204  7.7551020  7.9591837  8.1632653  8.3673469
[43]  8.5714286  8.7755102  8.9795918  9.1836735  9.3877551  9.5918367
[49]  9.7959184 10.0000000
plot(seq(0, 10), seq(0, 50, length=11), type="l", col="blue")

Рис. 12.1. Приклад візуалізації послідовності у R

12.2.2 Функція rep()

Функція rep() також використовується для створення послідовностей чисел, що повторюються. Ця функція приймає наступні аргументи:

  • x - послідовність, що повторюється
  • times - кількість повторень
  • each - кількість повторень кожного елемента

Синтаксис виклику:

rep(x = <вектор>, 
    times = <кількість повторень ветора>, 
    each = <кількість повторень кожного елемента>)

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

# 123 повторюється 2 рази
rep(1:3, times = 2)   
[1] 1 2 3 1 2 3
# вектор x повторюється 2 рази
x <- c(5, 2, 7)
rep(x, times = 2)   
[1] 5 2 7 5 2 7
# 1 повторюється 2 рази
# 2 повторюється 1 раз
# 3 повторюється 4 рази
rep(1:3, times=c(2,1,4))  
[1] 1 1 2 3 3 3 3
# кожен елемент повторюється 2 рази
rep(1:3, each=2) 
[1] 1 1 2 2 3 3
x <- c(1,3,5)
rep(x, each = 3, times = 2)
 [1] 1 1 1 3 3 3 5 5 5 1 1 1 3 3 3 5 5 5

12.3 Генерація псевдовипадкових чисел

R має вбудовані функції для генерації псевдовипадкових чисел: runif(), sample().

12.3.1 Функція runif()

runif() генерує послідовність випадкових чисел з рівномірним розподілом на відрізку \([min, max]\). Ця функція приймає наступні аргументи:

  • n - кількість чисел;
  • min - мінімальне значення (за замовчуванням \(0\));
  • max - максимальне значення (за замовчуванням \(1\)).

Наприклад, згенеруємо \(5\) випадкових значень на відрізку \([min, max]\):

runif(5)
[1] 0.8009979 0.3816051 0.9993743 0.4799962 0.7964063

Виведемо графік з \(1000\) випадкових знань на відрізку \([0, 1]\):

x <- runif(1000)
plot(x)

Рис. 12.2. Приклад візуалізації 1000 випадкових знань на відрізку [0, 1] з використанням функції runif()

12.3.2 Функція sample()

Функція sample() дозволяє вибрати числа випадковим чином із деякого набору (вектора).

Синтаксис виклику:

sample(x = <вектор>, 
       size = <кількість випадкових значень>, 
       replace = <TRUE/FALSE, >, 
       prob = <вектор з ймовірностями>)

Припустимо у нас є деякий вектор x:

x <- 10:20
print(x)
 [1] 10 11 12 13 14 15 16 17 18 19 20

Для того аби виьрати одне із значень вектора x випадковим чином, використаємо функцію sample():

sample(x)
 [1] 20 17 11 16 10 12 14 19 13 18 15

Якщо ми хочемо вибрати декілька значень вектора x випадковим чином, то використаємо аргумент size:

sample(x, size = 4)
[1] 20 11 19 18
sample(x, size = 4)
[1] 10 18 12 19

Зверніть увагу, що у такому випадку усі значення завжди будуть різними у межах одного вибору.

У випадку, якщо потрібно вибрати значення з повтореннями, то використаємо аргумент replace:

sample(x, size = 15, replace = TRUE)
 [1] 14 11 14 17 10 15 17 15 17 11 12 12 17 19 13

Якщо потрібно вибрати значення з деякими ймовірностями, то використаємо аргумент prob:

t <- sample(c(1,2), size = 1000, replace = T, prob = c(80, 20))
hist(t, breaks = 2, col = c('blue', 'green'))

Рис. 12.3. Приклад візуалізації гістограми у R

12.4 Інші математичні функції та константи R

Окрім описаного вище набору функцій R містить дуже велику кількість реалізованих функцій з різних сфер науки, бізнесу, техніки тощо. Прочитати про них можна з офіційної документації пакетів, у яких вони реалізовані та знайти за допомогою функції help() або ?name.

Далі розглянемо перелік найпоширеніших функцій, що використовуються для розв’язання навчальних задач під час вивчення основ програмування.

Популярні математичні функції в R
Функція Призначення, опис
log(x) Логарифм числа x за основою e
log(x,n) Логарифм числа x за основою n
exp(x) e у степені x
sqrt(x) Корінь квадратний числа x
factorial(x) Факторіал числа x
abs(x) Модуль числа x

Також у R доступні ряд тригонометричних функцій, які вивчалися у школі і не тільки, серед них cos(x), sin(x), tan(x), а також acos(x), asin(x), atan(x), acosh(x), asinh(x), atanh(x).

Детальніше про кожну з них можна почитати у документації за допомогою кодманди help(function).

Приклади розв’язання завдань

Завдання 1. Генерація випадкових чисел

Згенеруйте \(1000\) випадкових чисел у діапазоні \([0,1]\). Заокругліть їх до десятих (“2 знаки після коми/крапки”). Побудуйте графік за допомогою функції plot().

Розв’язання

x <- runif(1000)
x <- round(x, 1)
plot(x)

Рис. 12.4. Графік до Завдання 1. Генерація випадкових чисел