Суммирование, уравнения и анализ
На этой странице описаны суммы и произведения последовательностей, решение уравнений, вычисление производной в виде формулы или в отдельной точке и определённые интегралы. Используйте эти функции для выражений с Σ и Π, уравнений, которые трудно преобразовать вручную, или проверки производной и площади под кривой в учебных задачах.
Все эти функции принимают имя переменной в качестве одного из своих аргументов, например, k в sum(k^2, k, 1, 10). Это имя существует только внутри вызова, поэтому оно никогда не меняет значение того же имени в другом месте вашей заметки.
Конечные суммы и произведения
sum(k, k, 1, 100) даёт 5,050sum(k^2, k, 1, 10) даёт 385summation(2*k - 1, k, 1, 10) даёт 100product(k, k, 1, 5) даёт 120Аргументы — выражение, переменная, первое и последнее значения. Обе границы включаются: sum(k, k, 1, 100) вычисляет 1 + 2 + … + 100. Имя summation — синоним sum. Третья строка показывает, что сумма первых десяти нечётных чисел равна 10², а последняя вычисляет факториал числа 5.
Суммы работают с деньгами и единицами, что подходит для регулярных сбережений:
# £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 даты различны:
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 определяет коэффициенты и вычисляет ответ так же, как при решении на бумаге:
solve(2x + 6 = 10) даёт 2solve(x/3 + 1 = 4) даёт 9solve(5x + 3 = 2x - 9) даёт -4# Candles sell for 12, cost 4 each to make, on 2,000 of fixed costssolve(12n = 2000 + 4n) даёт 250Неизвестной считается единственное имя в уравнении, которому ещё не присвоено значение. Уже определённые имена подставляются со своими значениями. Если правую часть не указать, выражение приравнивается к нулю.
Для линейного уравнения результат — число. Для квадратного — список различных действительных корней по возрастанию. Поэтому кратный корень возвращается списком из одного элемента:
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, но при точном сравнении различаются.
Уравнения решаются только для чисел без единиц измерения. Единицы и денежные суммы не принимаются, чтобы преобразование не потеряло их смысл. Полные правила — в разделе Гарантии вычислительного движка.
Когда решение невозможно
Решатель не делает предположений. Если действительных корней нет, он сообщает об этом, не переходя к комплексным. Уравнения выше второй степени не принимаются; вместо этого предлагается численный способ:
solve(x^2 + 1 = 0) даёт Error: no real solutionsolve(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 numericallysolve(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Неизвестная также не может находиться в знаменателе или показателе степени. Если в уравнении два неопределённых имени, сообщение указывает, какое из них не удалось распознать:
solve(1/x = 2) даёт Unsupported: The unknown cannot be a divisor; write solve(expression,x,lower,upper) to search for one root numericallysolve(2^x = 8) даёт Unsupported: The unknown cannot be an exponent; write solve(expression,x,lower,upper) to search for one root numericallysolve(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Если уравнению удовлетворяет любое значение, решатель сообщает об этом, а не выбирает произвольное:
solve(x - x = 0) даёт Unsupported: every value of x solves this equation, so it has no single answerВо всех этих случаях сообщение предлагает четырёхаргументную форму solve, описанную ниже. Она численно ищет один корень и не требует определённой формы выражения. Для системы линейных уравнений с несколькими неизвестными используйте solve_system; см. Векторы и матрицы.
Поиск одного корня численным методом
С четырьмя аргументами solve работает иначе: ищет значение переменной, при котором уравнение выполняется, внутри заданных границ. Используйте этот вариант, когда точный способ выше не принимает уравнение.
solve(x^2 = 2, x, 0, 2) даёт 1.4142135624solve(x^2 - 4, x, -3, 0) даёт -2solve(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 costssolve(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 или другое число знаков после запятой для округления. Если результат нужен дальше, сначала присвойте ему имя:
solve(sqrt(x) = 2, x, 0, 10) даёт 4.0000000001solve(sqrt(x) = 2, x, 0, 10) to 4 dp даёт 4side = solve(sqrt(x) = 2, x, 0, 10) даёт 4.0000000001side * 3 to 2 dp даёт 12Вы можете обернуть solve в свою собственную функцию, чтобы повторно использовать ее с различными значениями:
root(y) = solve(x^2 = y, x, 0, 10)root(9) даёт 3Для нескольких линейных уравнений в нескольких неизвестных используйте solve_system из Векторы и матрицы.
Символьное дифференцирование
С двумя аргументами differentiate (или derivative) дает производную в виде формулы:
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. Чтобы использовать его, перенесите формулу в собственную функцию:
slope(x) = 3*x^2slope(2) даёт 12Символьное дифференцирование поддерживает:
+,-,*,/и степени по правилам дифференцирования суммы, произведения, частного, степени и сложной функции- Функции
sin,cos,tan,sinh,cosh,exp,lnиsqrt - Другие имена, которые рассматриваются как константы и остаются именами в результате
Именам не обязательно присваивать значения в заметке: можно дифференцировать формулу с символическими параметрами:
derivative(a*x^2, x) даёт (a*(2*(x^(2-1))))Другие функции, например abs, log и пользовательские функции, вызывают ошибку. Для них используйте численный вариант ниже. Полученная формула также не хранит ограничения области определения исходного выражения. Производная sqrt(x) имеет смысл лишь там, где определено исходное sqrt(x), хотя (1/(2*sqrt(x))) выглядит самостоятельной формулой.
Численное дифференцирование
С третьим аргументом derivative дает наклон в этой точке в виде числового значения:
derivative(x^3, x, 2) даёт 12differentiate(sin(x), x, 0) даёт 1derivative(sqrt(x), x, 4) даёт 0.25height(t) = 20*t - 4.9*t^2derivative(height(t), t, 1) даёт 10.2Этот вариант поддерживает функции, определённые в заметке, например height выше, в отличие от символьного способа. Поскольку вычисляется число, всем остальным именам в выражении нужны значения. Это же правило действует для sum, product, solve и integrate:
derivative(a*x^2, x, 2) даёт Unsupported: Unknown name: aa = 3derivative(a*x^2, x, 2) даёт 12Результат оценивается по значениям вблизи точки с обеих сторон. Если истинная производная — простое по записи число, Varlig сохраняет именно его, и точное сравнение работает. Для иррациональных значений, например производной exp(x), сохраняются все вычисленные цифры; такие результаты сравнивайте с допуском:
derivative(x^3, x, 2) == 12 даёт trueabs(derivative(exp(x), x, 1) - e) < 1e-6 даёт trueВ окрестности точки функция должна быть гладкой, без изломов и разрывов. derivative(abs(x), x, 0) выдаёт ошибку из-за излома abs в нуле. derivative(sqrt(x), x, 0) тоже выдаёт ошибку, поскольку sqrt не определён слева от нуля.
Определённый интеграл
integrate(x^2, x, 0, 3) даёт 9integrate(sin(x), x, 0, pi) даёт 2integrate(x^2, x, 3, 0) даёт -9integrate(4/(1 + x^2), x, 0, 1) даёт 3.1415926536# Distance fallen in 3 s: integrate the speed, 9.8t m/sintegrate(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 м/с²:
# Height in metres after t secondsheight(t) = 19.6*t - 4.9*t^2velocity(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 heightderivative(height(t), t, 1) даёт 9.8# Highest point, where the velocity is zeropeak = solve(velocity(t) = 0, t, 0, landing) даёт 2height(peak) даёт 19.6# Check: integrating the velocity up to the peak gives the same heightintegrate(velocity(t), t, 0, peak) даёт 19.6Мяч приземлится через 4 секунды и достигнет высоты 19,6 м через 2 секунды. Нижняя граница 1 в строке landing не позволяет solve выбрать другой корень при t = 0. Последняя строка подтверждает высоту другим способом — интегрированием скорости.