Кто о чём, а мы продолжаем разбирать сложную математику, чтобы она не была такой сложной.
Что такое предел в математике
Когда математики говорят о пределах, то имеют в виду такую последовательность событий:
- Есть функция — это просто какая-то «коробка» с математикой. Ты ей на вход число, она его обрабатывает у себя внутри и отдаёт другое число.
- У функции есть как минимум два числа: то, которое ты ей даёшь на вход; и то, которое получаешь на выходе.
- Иногда математикам интересно, что будет, если число на входе будет к чему-то стремиться. А именно: «Если число на входе будет стремиться вот сюда, куда будет стремиться число на выходе?»
👉 Стремиться — значит стараться приблизиться к какому-то числу, но не достигнуть его.
Если мы говорим, что переменная функции стремится к бесконечности, то это значит, что с каждым новым вычислением мы берём значение переменной больше предыдущего.
1, 2, 3, … 1000000000000003, 1000000000000004 и так до бесконечности
Наоборот тоже работает: если переменная функции стремится к нулю, то это значит, что она постоянно уменьшается:
1, 0.1, 0.01, 0.001, … 0.00000000000000000000000001 и с каждым разом число будет ближе к нулю, но никогда его не достигнет.
Стремление переменной к числу обозначается стрелкой: x→0, а предел — словом lim:
График и предел
Если мы нарисуем график этой функции, то можем увидеть, что начиная с какого-то момента он превратится в почти прямую линию вдоль оси. Почти прямую — потому что прямой он никогда не станет, но стремится к этому, если продолжить рисовать график бесконечно.
Но бесконечный график означает, что у нас переменная функции стремится к бесконечности. А значение этой линии на графике — это и есть предел этой функции при переменной, стремящейся к бесконечности:
Пределы в жизни
Пределы из математики часто используются для решения практических задач, где нужно найти точку, после которой разница в результате будет уже незаметна.
Например, бригада монтажников строит мост, и им нужно понять, какой максимальной длины можно сделать плиту перекрытия. Есть требования, что плита должна выдерживать в середине нагрузку в 50 тонн — она может быть и прочнее, но 50 тонн это минимум. Для решения этой задачи используют предел — он покажет, длиннее какого размера делать плиту нельзя, а всё, что короче, даст необходимую прочность.
Астрономы с помощью пределов изучают законы Вселенной, физики проверяют всё на прочность, и даже в микроэлектронике затухание сигналов тоже зависит от пределов функций.
Погрешность в пределах
В математике пределы считаются точно: используются специальные формулы и трюки, которые помогают найти точный ответ. Но в жизни такая точность необязательна: можно взять любое решение, которое нас устроит с приемлемой погрешностью.
Эта погрешность поможет нам считать пределы, не зная точных математических формул подсчёта.
Как вычислить предел, если вы программист
Раз у нас есть постоянное действие по уменьшению или увеличению переменной, то логично сделать из этого простой цикл и поручить его машине. Единственное, что нам нужно предусмотреть, — момент, когда цикл должен остановиться, потому что в мире математики lim по умолчанию касается бесконечности (потому что стремиться можно бесконечно).
Так как мы не знаем заранее точного предела функции, но можем контролировать количество повторений, то сделаем такие условия для остановки цикла:
- Закончилось количество повторений. Например, мы заранее говорим, что будем стремиться к границе предела 10000000000 раз, но если ничего не выйдет — остановимся.
- Если достигли нужной погрешности. Два соседних результата отличаются на величину погрешности или меньше — отлично, мы нашли то, что нужно.
Самый сложный момент в коде — описать то, как переменная функции к чему-то стремится. Если к бесконечности, то всё просто: на каждом шаге прибавляем или умножаем на какое-то число. А если нужно, чтобы переменная стремилась к нулю или другому числу, то можно действовать так: брать начальное число, конечное, складывать их и делить пополам. Так мы будем постоянно приближаться к нужному нам числу, но никогда его не достигнем.
⚠️ Важная оговорка: числа в компьютере — это не числа в абстрактном математическом понимании, а конечный набор данных. Конечный он тем, что на всякое число выделяется какое-то количество «клеток», в которые это число можно записать. Если у нас ограниченное количество «клеток», значит, у нас есть какой-то предел самого большого и самого малого числа.
Например, если мы дали переменной 32 бита памяти, самое малое число, которое мы сможем в нее записать, — 1,4012985 × 10-45. Это кажется бесконечно малым, но на самом деле, если циклически делить число на 2 несколько сотен раз в секунду, мы упремся в этот лимит точности почти сразу. Потом знаки после запятой закончатся и число очень быстро превратится в 0.
С точки зрения математики любое число можно бесконечно делить и получать бесконечное число знаков после запятой; а с точки зрения компьютера бесконечное число знаков невозможно, и если делить достаточно долго — мы получим ноль.
Поэтому в работе с пределами важно указывать либо число шагов для определения предела, либо погрешность.
Теперь напишем простой цикл, который нам посчитает lim x→2 (8−2x) / (x²−4x−12):
- предел функции f(x) = (8−2x) / (x²−4x-12);
- при x стремящемся к 2.
Если мы посчитаем этот предел как математики, то получим значение −1. Проверим, как с этим справится наш код:
// погрешность вычислений
var e = 0.00001;
// предел, к которому будет стремиться переменная
var lim = 2;
// переменная функции, на старте начинаем стремиться к пределу отсюда
var x = 0;
// сколько раз мы уже выполнили цикл
var n = 0;
// максимальное количество приближений к пределу
var max_n = 100;
// функция, которая возвращает значение для переменной функции
function f(x) {
return (8 - 2*x*x)/(x*x + 4*x - 12);
}
// пока мы не достигли нужной погрешности — выполняем цикл
while (Math.abs(f(x) -f((x+lim)/2)) >= e) {
// приближаемся ещё на один шаг к пределу
x = (x+lim)/2;
// увеличиваем счётчик приближений
n +=1;
// если дошли до максимального количества повторений
if (n == max_n) {
// выводим сообщение о том, что останавливаемся
console.log('Закончилось количество повторений, остановились на таком значении функции: ', f(x));
// сбрасываем переменную с максимальным значением повторений и выходим из цикла
max_n = 0;
break;
}
}
// если переменная с максимальным значением не была сброшена
if (max_n != 0){
// выводим найденный предел
console.log('Предел функции с заданной погрешностью: ', f(x))
}