Перейти до вмісту
Посібник 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 м на другій секунді. Нижня межа 1 у рядку landing віддаляє solve від іншого кореня, t = 0. Останній рядок підтверджує висоту іншим способом — інтегруванням швидкості.