Пропустить к содержанию
Руководство Varlig
Главная страница Varlig

Суммирование, уравнения и анализ

На этой странице описаны суммы и произведения последовательностей, решение уравнений, вычисление производной в виде формулы или в отдельной точке и определённые интегралы. Используйте эти функции для выражений с Σ и Π, уравнений, которые трудно преобразовать вручную, или проверки производной и площади под кривой в учебных задачах.

Все эти функции принимают имя переменной в качестве одного из своих аргументов, например, k в sum(k^2, k, 1, 10). Это имя существует только внутри вызова, поэтому оно никогда не меняет значение того же имени в другом месте вашей заметки.

Конечные суммы и произведения

calc
sum(k, k, 1, 100) даёт 5,050
sum(k^2, k, 1, 10) даёт 385
summation(2*k - 1, k, 1, 10) даёт 100
product(k, k, 1, 5) даёт 120

Аргументы — выражение, переменная, первое и последнее значения. Обе границы включаются: sum(k, k, 1, 100) вычисляет 1 + 2 + … + 100. Имя summation — синоним sum. Третья строка показывает, что сумма первых десяти нечётных чисел равна 10², а последняя вычисляет факториал числа 5.

Суммы работают с деньгами и единицами, что подходит для регулярных сбережений:

calc
# £1,200 paid in at the start of each year for 5 years, at 5%
sum(£1200 * 1.05^k, k, 1, 5) даёт £6,962.30

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

calc
p = 1 - product((365 - k)/365, k, 0, 22)
(p as %) to 1 dp даёт 50.7%

Некоторые детали:

  • Первое и последнее значения должны быть целыми числами.
  • Если последняя граница меньше первой, членов последовательности нет: сумма равна 0, а произведение — 1.
  • Одна сумма или произведение может включать не более 10 000 членов.
  • Суммы можно вкладывать друг в друга: sum(sum(j, j, 1, n), n, 1, 4) даёт 20. Для вложенных вызовов действует общий лимит вычислений.
  • Чтобы сложить значения, которые у вас уже есть, используйте вместо этого список: sum([4, 8, 15]). См. Списки и статистика.

Точное решение уравнения

Если передать только уравнение, solve определяет коэффициенты и вычисляет ответ так же, как при решении на бумаге:

calc
solve(2x + 6 = 10) даёт 2
solve(x/3 + 1 = 4) даёт 9
solve(5x + 3 = 2x - 9) даёт -4
# Candles sell for 12, cost 4 each to make, on 2,000 of fixed costs
solve(12n = 2000 + 4n) даёт 250

Неизвестной считается единственное имя в уравнении, которому ещё не присвоено значение. Уже определённые имена подставляются со своими значениями. Если правую часть не указать, выражение приравнивается к нулю.

Для линейного уравнения результат — число. Для квадратного — список различных действительных корней по возрастанию. Поэтому кратный корень возвращается списком из одного элемента:

calc
solve(x^2 - 5x + 6 = 0) даёт [2, 3]
solve(x^2 = 9) даёт [-3, 3]
solve(x^2 - 6x + 9 = 0) даёт [3]
solve(x^2 - 2 = 0) даёт [-1.4142135624, 1.4142135624]

Форма результата определяется типом уравнения, а не найденными корнями: квадратное уравнение всегда возвращает список.

Линейные уравнения и квадратные уравнения с дискриминантом, равным полному квадрату, решаются в точных дробях. Поэтому solve(x^2 - 5x + 6 = 0) даёт ровно 2 и 3. Если дискриминант не является полным квадратом, корни вычисляются приближённо как десятичные значения. Такие значения могут не быть точно равны, даже если выглядят одинаково: положительный корень из solve(x^2 - 2 = 0) и sqrt(2) оба отображаются как 1.4142135624, но при точном сравнении различаются.

Уравнения решаются только для чисел без единиц измерения. Единицы и денежные суммы не принимаются, чтобы преобразование не потеряло их смысл. Полные правила — в разделе Гарантии вычислительного движка.

Когда решение невозможно

Решатель не делает предположений. Если действительных корней нет, он сообщает об этом, не переходя к комплексным. Уравнения выше второй степени не принимаются; вместо этого предлагается численный способ:

calc
solve(x^2 + 1 = 0) даёт Error: no real solution
solve(x^3 - 1 = 0) даёт Unsupported: solve reads equations of degree 1 and 2; this one has degree 3: write solve(expression,x,lower,upper) to search for one root numerically
solve(sin(x) = 0) даёт Unsupported: solve reads a polynomial in x of degree 1 or 2; write solve(expression,x,lower,upper) to search for one root numerically

Неизвестная также не может находиться в знаменателе или показателе степени. Если в уравнении два неопределённых имени, сообщение указывает, какое из них не удалось распознать:

calc
solve(1/x = 2) даёт Unsupported: The unknown cannot be a divisor; write solve(expression,x,lower,upper) to search for one root numerically
solve(2^x = 8) даёт Unsupported: The unknown cannot be an exponent; write solve(expression,x,lower,upper) to search for one root numerically
solve(x + y = 10) даёт Unsupported: solve reads one unknown, and y holds no value either; give y a value, or write solve(expression,x,lower,upper) to search for one root numerically

Если уравнению удовлетворяет любое значение, решатель сообщает об этом, а не выбирает произвольное:

calc
solve(x - x = 0) даёт Unsupported: every value of x solves this equation, so it has no single answer

Во всех этих случаях сообщение предлагает четырёхаргументную форму solve, описанную ниже. Она численно ищет один корень и не требует определённой формы выражения. Для системы линейных уравнений с несколькими неизвестными используйте solve_system; см. Векторы и матрицы.

Поиск одного корня численным методом

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

calc
solve(x^2 = 2, x, 0, 2) даёт 1.4142135624
solve(x^2 - 4, x, -3, 0) даёт -2
solve(cos(x) = x, x, 0, 1) даёт 0.7390851332
# How long does a stone take to fall 44.1 m?
solve(4.9*t^2 = 44.1, t, 0, 10) даёт 3
# Candles sell for £12, cost £4 each to make, plus £2,000 of fixed costs
solve(12*n = 2000 + 4*n, n, 0, 1000) даёт 250

Аргументы — это уравнение, переменная, нижний предел и верхний предел. Вы можете ввести уравнение с =, или выражение в отдельности, которое solve рассматривает как expression = 0.

Выбор пределов

Для solve нужно, чтобы разность сторон уравнения меняла знак между границами. Иными словами, left - right должна быть положительной на одной границе и отрицательной на другой либо равной нулю на границе. Затем функция сужает интервал до точки пересечения.

Это имеет несколько последствий:

  • Если между границами два корня, на концах интервала знак может совпадать. Вызов solve(x^2 - 4, x, -3, 3) завершается ошибкой, поскольку x^2 - 4 положительно на обоих концах. Выберите границы вокруг одного корня, например 0 и 3.
  • Корень, где кривая касается только нуля, например x^2 = 0, не может быть найден таким образом, потому что знак никогда не меняется.
  • Выражение должно быть определено по всему диапазону. solve(sqrt(x) = 2, x, -1, 10) не удается, потому что sqrt отрицательного числового значения является ошибкой. Вместо этого начните диапазон с 0.
  • Прыжок через ноль, как в 1/x рядом с 0, не является корнем, поэтому solve дает ошибку, а не ответ.
  • Нижняя граница должна быть меньше верхней; обе задаются числами без единиц измерения.

Функция solve возвращает один корень, а не список всех корней. Она работает только с числами без единиц измерения, поэтому единицы в уравнение не включайте.

Округление и повторное использование

Результат — близкое численное приближение, у которого последняя отображаемая цифра может быть неточной. Добавьте в ту же строку to 4 dp или другое число знаков после запятой для округления. Если результат нужен дальше, сначала присвойте ему имя:

calc
solve(sqrt(x) = 2, x, 0, 10) даёт 4.0000000001
solve(sqrt(x) = 2, x, 0, 10) to 4 dp даёт 4
side = solve(sqrt(x) = 2, x, 0, 10) даёт 4.0000000001
side * 3 to 2 dp даёт 12

Вы можете обернуть solve в свою собственную функцию, чтобы повторно использовать ее с различными значениями:

calc
root(y) = solve(x^2 = y, x, 0, 10)
root(9) даёт 3

Для нескольких линейных уравнений в нескольких неизвестных используйте solve_system из Векторы и матрицы.

Символьное дифференцирование

С двумя аргументами differentiate (или derivative) дает производную в виде формулы:

calc
differentiate(sin(x), x) даёт cos(x)
derivative(x^3, x) даёт (3*(x^(3-1)))
derivative(x * sin(x), x) даёт (sin(x)+(x*cos(x)))
derivative(exp(2*x), x) даёт (exp((2*x))*2)

Результат не упрощен, и каждый шаг в скобках: (3*(x^(3-1))) это 3x². Десятичные дроби в вашем выражении возвращаются в виде дробей, поэтому 19.6 появляется как (98/5).

Результат — текст, а не значение, участвующее в вычислениях Varlig. Чтобы использовать его, перенесите формулу в собственную функцию:

calc
slope(x) = 3*x^2
slope(2) даёт 12

Символьное дифференцирование поддерживает:

  • +, -, *, / и степени по правилам дифференцирования суммы, произведения, частного, степени и сложной функции
  • Функции sin, cos, tan, sinh, cosh, exp, ln и sqrt
  • Другие имена, которые рассматриваются как константы и остаются именами в результате

Именам не обязательно присваивать значения в заметке: можно дифференцировать формулу с символическими параметрами:

calc
derivative(a*x^2, x) даёт (a*(2*(x^(2-1))))

Другие функции, например abs, log и пользовательские функции, вызывают ошибку. Для них используйте численный вариант ниже. Полученная формула также не хранит ограничения области определения исходного выражения. Производная sqrt(x) имеет смысл лишь там, где определено исходное sqrt(x), хотя (1/(2*sqrt(x))) выглядит самостоятельной формулой.

Численное дифференцирование

С третьим аргументом derivative дает наклон в этой точке в виде числового значения:

calc
derivative(x^3, x, 2) даёт 12
differentiate(sin(x), x, 0) даёт 1
derivative(sqrt(x), x, 4) даёт 0.25
height(t) = 20*t - 4.9*t^2
derivative(height(t), t, 1) даёт 10.2

Этот вариант поддерживает функции, определённые в заметке, например height выше, в отличие от символьного способа. Поскольку вычисляется число, всем остальным именам в выражении нужны значения. Это же правило действует для sum, product, solve и integrate:

calc
derivative(a*x^2, x, 2) даёт Unsupported: Unknown name: a
a = 3
derivative(a*x^2, x, 2) даёт 12

Результат оценивается по значениям вблизи точки с обеих сторон. Если истинная производная — простое по записи число, Varlig сохраняет именно его, и точное сравнение работает. Для иррациональных значений, например производной exp(x), сохраняются все вычисленные цифры; такие результаты сравнивайте с допуском:

calc
derivative(x^3, x, 2) == 12 даёт true
abs(derivative(exp(x), x, 1) - e) < 1e-6 даёт true

В окрестности точки функция должна быть гладкой, без изломов и разрывов. derivative(abs(x), x, 0) выдаёт ошибку из-за излома abs в нуле. derivative(sqrt(x), x, 0) тоже выдаёт ошибку, поскольку sqrt не определён слева от нуля.

Определённый интеграл

calc
integrate(x^2, x, 0, 3) даёт 9
integrate(sin(x), x, 0, pi) даёт 2
integrate(x^2, x, 3, 0) даёт -9
integrate(4/(1 + x^2), x, 0, 1) даёт 3.1415926536
# Distance fallen in 3 s: integrate the speed, 9.8t m/s
integrate(9.8*t, t, 0, 3) даёт 44.1

Аргументы — выражение, переменная, нижний и верхний пределы, как у sum. Результат — площадь под кривой между пределами с учётом знака. Перестановка пределов меняет знак результата, а одинаковые пределы дают ноль. Можно интегрировать функции из заметки, например integrate(power(t), t, 0, 4).

integrate работает численно, поэтому несколько вещей недоступны:

  • Неопределённое интегрирование не поддерживается: результат всегда число, а не формула.
  • Оба предела должны быть конечными числами; интегрирование до бесконечности недоступно.
  • Выражение должно быть определено на всём интервале. integrate(1/sqrt(x), x, 0, 1) выдаёт ошибку, потому что 1/sqrt(0) означает деление на ноль, хотя сам несобственный интеграл имеет конечное значение.
  • Функции со скачками, резкими пиками или очень частыми колебаниями могут дать неточный результат или ошибку.
  • Единицы не принимаются, поэтому оставьте их в комментарии, как в последнем примере.

Алгоритмы и сходимость

Вам не нужны эти детали для повседневного использования, но они помогают, когда результат выглядит неправильно или линия выдает ошибку.

solve использует метод деления пополам: на каждом шаге оставляет ту половину интервала, где меняется знак. Поиск заканчивается, когда left - right отличается от нуля не более чем на 10⁻¹⁰, а интервал достаточно узок. После 128 делений без успеха возвращается ошибка.

Символьный вариант derivative последовательно применяет стандартные правила без упрощения. Длина результата ограничена 8192 символами. Это не полноценная система компьютерной алгебры.

Численный вариант derivative сравнивает центральные разности при уменьшающемся шаге и отдельно проверяет производную с каждой стороны. Если оценки не совпадают или значение рядом с точкой не определено, возвращается ошибка, а не предположительный ответ.

integrate использует адаптивные 7- и 15-точечные квадратурные формулы Гаусса — Кронрода. На каждом участке сравниваются две оценки; участок с наибольшей оценкой погрешности делится до тех пор, пока суммарная оценка не станет меньше 10⁻⁹ × max(1, |результат|). Допускаются 2048 разбиений, 20 уровней вложенности и общий лимит 100 000 шагов. Узлы расположены неравномерно, поэтому быстро колеблющаяся функция вроде cos(128*pi*x) на интервале от 0 до 1 даёт примерно нулевой интеграл, а не ошибочно принимается за константу. Оценка погрешности остаётся эвристической: результаты для функций с особенностями и разрывами требуют осторожной проверки.

Полные правила находятся в справке по продвинутой математике.

Всё вместе

Пример проверки задачи по физике: мяч брошен вертикально вверх со скоростью 19,6 м/с, ускорение свободного падения принято равным 9,8 м/с²:

calc
# Height in metres after t seconds
height(t) = 19.6*t - 4.9*t^2
velocity(t) = 19.6 - 9.8*t
# Lands when the height is back to zero (skip t = 0)
landing = solve(height(t) = 0, t, 1, 10) даёт 4
# Speed after 1 second, from the slope of the height
derivative(height(t), t, 1) даёт 9.8
# Highest point, where the velocity is zero
peak = solve(velocity(t) = 0, t, 0, landing) даёт 2
height(peak) даёт 19.6
# Check: integrating the velocity up to the peak gives the same height
integrate(velocity(t), t, 0, peak) даёт 19.6

Мяч приземлится через 4 секунды и достигнет высоты 19,6 м через 2 секунды. Нижняя граница 1 в строке landing не позволяет solve выбрать другой корень при t = 0. Последняя строка подтверждает высоту другим способом — интегрированием скорости.