7 легендарных уравнений на JavaScript

Отредактировано

Математика и компьютерные науки идут рука об руку. Подобрали 7 математических формул разного уровня сложности для проверки — сможете ли вы их реализовать? И на всякий случай снабдили статью нашими решениями.

2К открытий29К показов

Мы нашли несколько математических формул, которые в своё время внесли значимый вклад в развитие математики, геометрии и физики. Предлагаем разминку для ума: сможете ли вы справиться и реализовать все перечисленные нами формулы?

Кстати, Kata Academy набирает студентов на обучение JavaScript. Это отличная возможность, так как вы не платите за обучение, пока не устроитесь Javascript-разработчиком! Подробности здесь → Курс по JavaScript-разработке от Kata Academy.

Теорема Пифагора

Начнём с простенькой формулы. Известная всем со школьной скамьи теорема, которая гласит: квадрат гипотенузы равен сумме квадратов катетов в прямоугольном треугольнике. Она широко используется в инженерии (например, архитектуре), физике и информатике.

Возьмем c как длину гипотенузы, а a и b — длины катетов. Получаем запись a^2 + b^2 = c^2.

Решение на JavaScript
			function calculateHypotenuse(a, b) {
  return Math.sqrt(a * a + b * b);
}

// пример использования
const a = 3;
const b = 4;
const hypotenuse = calculateHypotenuse(a, b);
console.log(`Hypotenuse: ${hypotenuse}`);
		

Логарифмы

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

Звучит определение логарифма примерно так: результат логарифма по основанию a от b будет являться такое число c, для которого справедливо a^c = b. Логарифмы, которые записываются без основания как log(x) — натуральные, то есть в его основание будет константа e.

Сможете реализовать функцию, которая бы проверяла достоверность log(xy)=log(x)+log(y)?

Решение на JavaScript
			// перед вычислениями удостоверяемся, что x и y — положительные числа
const x = /* некоторое положительное число */;
const y = /* некоторое положительное число */;


const logxy = Math.log(x * y);
const logx_plus_logy = Math.log(x) + Math.log(y);


// теперь проверяем, что полученные вычисления верны
console.log(logxy === logx_plus_logy); // вернёт true
		

Математический анализ

f'(x)=lim(h→0)h

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

Решение на JavaScript
			function derivative(f, x, h = 1e-5) {
  return (f(x + h) - f(x)) / h;
}


// определяем функцию, для которой будем считать производную, например, f(x) = x^2
function square(x) {
  return x * x;
}

// считаем производную для f(x) = x^2 где x = 3
const x = 3;
const derivativeAtX = derivative(square, x);
console.log(
  `Derivative of f(x) = x^2 at x = ${x} is approx: ${derivativeAtX}`
		

Функция derivative() аппроксимирует производную функцию f в точке x. На выходе в примере мы получаем наклон касательной к f(x) = x^2 при заданном x=3. А поскольку производная для квадратичной функции от x всегда равна 2x, мы ожидаем, что скрипт выдаст ответ 6. В реальности, реализованная функция должна выдать очень близкий к нашему значению результат.

Универсальный закон всемирного тяготения Ньютона

Закон сформулирован следующим образом: сила притяжения прямо пропорциональна произведению их масс и обратно пропорциональна квадрату расстояния между их центрами. Для

  • F — вычисляемая сила притяжения;
  • G — гравитационная постоянная (6,674 * 10^(-11) Н(м^2)/кг^2);
  • m1 и m2 — масса двух объектов;
  • r — расстояние между центрами двух масс;

будет справедлива запись F=G(m1*m2/r^2).

Решение на JavaScript
			function calculateGravitationalForce(m1, m2, r) {
  const G = 6.674e-11; // гравитационная константа Н(м^2)/кг^2
  return (G * (m1 * m2)) / (r * r);
}


// пример использования
const m1 = 5.972e24; // масса Земли в кг
const m2 = 7.348e22; // масса Луны в кг
const r = 384400e3; // дистанция между Землёй и Луной в квадрате


const force = calculateGravitationalForce(m1, m2, r);
console.log(
  `The gravitational force between Earth and Moon is ${force} N`
);
		

Комплексные числа

Комплексные числа вселяли в нас ужас — i^2 = -1. Между тем, они часто используются для решения полиномиальных уравнений (то есть таких, в которых используются многочлены типа x^2=x^3).

Комплексные числа упрощают анализ электрических цепей, облегчают описание квантовой механики и играют ключевую роль в обработке сигналов. 

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

Решение на JavaScript
			class Complex {
  constructor(real, imaginary) {
    this.real = real;
    this.imaginary = imaginary;
  }


  // добавляем ещё одно комплексное число
  add(other) {
    return new Complex(
      this.real + other.real,
      this.imaginary + other.imaginary
    );
  }


  // перемножаем два комплексных числа
  multiply(other) {
    // (a + bi) * (c + di) = (ac - bd) + (ad + bc)i
    const realPart =
      this.real * other.real - this.imaginary * other.imaginary;
    const imaginaryPart =
      this.real * other.imaginary + this.imaginary * other.real;
    return new Complex(realPart, imaginaryPart);
  }


  // выводим комплексные числа в понятном формате
  toString() {
    return `${this.real} + ${this.imaginary}i`;
  }
}


// показываем, что i^2 = -1
const i = new Complex(0, 1);
const iSquared = i.multiply(i);


console.log(`i^2 = ${iSquared}`); // результат должен выглядеть как i^2 = -1 + 0i
		

В нашем примере мы создаём мнимую единицу i в виде комплексного числа с 0 действительной частью и 1 в качестве мнимой, затем возводим i в квадрат чтобы доказать, что результатом будет -1.

Нормальное распределение

7 легендарных уравнений на JavaScript 1
Тут уж без картинки не обойдёшься

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

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

  • x — переменная;
  • μ — среднее значение распределения;
  • σ — стандартное отклонение распределения;
  • e — основа натурального логарифма (~2.71828);
  • π приблизительно равно 3.14159.

Сможете написать функцию для вычисления математического ожидания для заданного x?

Решение на JavaScript
			function normalDistributionPDF(x, mu, sigma) {
  const sqrtTwoPi = Math.sqrt(2 * Math.PI);
  const exponent = -0.5 * ((x - mu) / sigma) ** 2;
  return (1 / (sigma * sqrtTwoPi)) * Math.exp(exponent);
}


// пример использования
const mu = 0; // значение
const sigma = 1; // стандартное отклонение
const x = 1; // значение для определения отклонения


const pdfValue = normalDistributionPDF(x, mu, sigma);
console.log(`PDF value at x = ${x}: ${pdfValue}`);
		

Уравнение Шрёдингера

7 легендарных уравнений на JavaScript 2

Возьмём формулу из квантовой механики. Уравнение Шрёдингера описывает, как квантовое состояние физической системы изменяется со временем. Уравнение предоставляет способ вычисления амплитуды вероятности положения и импульса частиц, позволяя предсказывать множество физических свойств и явлений, таких как уровни энергии, структуры связей и поведение электронов в атомах.

Реализация этого уравнения на JavaScript, определенно, выходит за рамки простых функций языка. Сможете с ним справиться? Мы не справились, поэтому приводим концептуальное решение.

Решение на JavaScript
			// определим константы
const hbar = 1.0545718e-34; // редуцированная постоянная Планка
const m = 9.10938356e-31; // масса электрона в килограммах


// функция потенциальной энергии V(x) которая предполагает, что V(x) = 0
function V(x) {
  return 0;
}


// упрощённая версия уравнения для сценария «частицы в коробке»
function solveSchrodinger(N, L) {
  // N — количество точек
  // L — длина коробки в метрах


  const dx = L / (N - 1); // размер шага
  const dx2 = dx * dx;
  const factor = Math.pow(-hbar, 2) / (2 * m * dx2);


  // инициализируем массив волновых функций и массив потенциальной энергии
  let psi = new Array(N).fill(0);
  let potential = new Array(N).fill(0).map((_, i) => V(i * dx));


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


  // возвращаем волновую функцию (упрощённо)
  return psi;
}


// концептуальный пример использования
const N = 100; // количество точек
const L = 1e-10; // длина коробки в метрах, тут — 1 нм
const psi = solveSchrodinger(N, L);


console.log(psi); // эта функция вывела бы массив волновых функций
		

Делитесь в комментариях, какие хитрые формулы вы ещё знаете. А если приложите код — то мы обязательно дополним материал вашим примером.

Интересуетесь новыми возможностями и языками программирования? Возможно, позиция SRE-инженера в Deckhouse, компании Флант, станет для вас отличным шансом применить свои знания на практике и участвовать в разработке инновационных проектов.

Следите за новыми постами
Следите за новыми постами по любимым темам
2К открытий29К показов