Przejdź do treści
Przewodnik po Varlig
Strona główna Varlig

Sumowanie, równania i analiza

Ta strona opisuje sumowanie i mnożenie ciągów wyrazów, rozwiązywanie równań, różniczkowanie symboliczne lub w punkcie oraz całki oznaczone. Sięgnij po nią, gdy potrzebujesz zapisu Σ lub Π, równania nie da się łatwo przekształcić ręcznie albo chcesz sprawdzić pochodną lub pole pod krzywą z zadania.

Wszystkie te funkcje przyjmują nazwę zmiennej jako jeden z argumentów, na przykład k w sum(k^2, k, 1, 10). Ta nazwa istnieje tylko wewnątrz wywołania i nigdy nie zmienia wartości o tej samej nazwie w innym miejscu notatki.

Sumy i iloczyny skończone

calc
sum(k, k, 1, 100) daje 5,050
sum(k^2, k, 1, 10) daje 385
summation(2*k - 1, k, 1, 10) daje 100
product(k, k, 1, 5) daje 120

Argumenty to wyrażenie, zmienna, pierwsza wartość i ostatnia wartość. Obie granice są włączone, więc sum(k, k, 1, 100) dodaje 1 + 2 + … + 100. summation to inna nazwa sum. Trzeci wiersz pokazuje, że pierwszych dziesięć liczb nieparzystych sumuje się do 10², a ostatni oblicza silnię z 5.

Sumy obsługują pieniądze i jednostki, co przydaje się przy regularnym oszczędzaniu:

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

Iloczyn przydaje się do łańcuchów prawdopodobieństw. Szansa, że co najmniej dwie osoby w grupie 23 mają urodziny tego samego dnia, to jeden minus szansa, że wszystkie 23 daty są różne:

calc
p = 1 - product((365 - k)/365, k, 0, 22)
(p as %) to 1 dp daje 50.7%

Kilka szczegółów:

  • Pierwsza i ostatnia wartość muszą być liczbami całkowitymi.
  • Jeśli ostatnia wartość jest mniejsza od pierwszej, nie ma żadnych wyrazów: suma wynosi 0, a iloczyn 1.
  • Jedna suma lub jeden iloczyn może obejmować najwyżej 10 000 wyrazów.
  • Sumy można zagnieżdżać, jak w sum(sum(j, j, 1, n), n, 1, 4), co daje 20. Zagnieżdżone wywołania współdzielą jeden łączny limit pracy.
  • Aby dodać już dostępne wartości, użyj listy: sum([4, 8, 15]). Zobacz Listy i statystyka.

Dokładne rozwiązywanie równania

Gdy podasz samo równanie, solve odczytuje współczynniki i wyznacza rozwiązanie tak jak na papierze:

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

Niewiadomą jest jedyna nazwa w równaniu, której nie przypisano wartości. Wcześniej zdefiniowane nazwy są zastępowane ich wartościami. Jeśli pominiesz prawą stronę, wyrażenie zostanie przyrównane do zera.

Równanie liniowe zwraca liczbę. Równanie kwadratowe zwraca listę różnych pierwiastków rzeczywistych, od najmniejszego, więc pierwiastek podwójny daje listę jednoelementową:

calc
solve(x^2 - 5x + 6 = 0) daje [2, 3]
solve(x^2 = 9) daje [-3, 3]
solve(x^2 - 6x + 9 = 0) daje [3]
solve(x^2 - 2 = 0) daje [-1.4142135624, 1.4142135624]

Postać wyniku zależy od zapisanego równania, a nie liczby znalezionych pierwiastków: równanie kwadratowe zawsze zwraca listę.

Równania liniowe i kwadratowe z wyróżnikiem będącym kwadratem liczby są obliczane jako dokładne ułamki, więc solve(x^2 - 5x + 6 = 0) daje dokładnie 2 i 3. Gdy wyróżnik nie jest takim kwadratem, oba pierwiastki są przybliżeniami dziesiętnymi. Dwie przybliżone wartości nie muszą być równe, nawet jeśli wyglądają identycznie: solve(x^2 - 2 = 0) i sqrt(2) wyświetlają 1.4142135624, ale porównanie wykazuje różnicę.

Równania rozwiązuje się dla liczb bez jednostek. Jednostki i waluty są odrzucane zamiast poddawane przekształceniom, które mogłyby je zniekształcić. Pełne zasady opisuje Co gwarantuje silnik.

Gdy obliczenie nie jest obsługiwane

Nie ma zgadywania. Równanie bez pierwiastka rzeczywistego informuje o tym zamiast zwracać zespolony, a równania wyższych stopni są odrzucane z propozycją użycia postaci numerycznej:

calc
solve(x^2 + 1 = 0) daje Error: no real solution
solve(x^3 - 1 = 0) daje 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) daje Unsupported: solve reads a polynomial in x of degree 1 or 2; write solve(expression,x,lower,upper) to search for one root numerically

Niewiadoma nie może też znajdować się w mianowniku ani wykładniku. Przy dwóch niezdefiniowanych nazwach komunikat wskazuje tę, której nie udało się odczytać:

calc
solve(1/x = 2) daje Unsupported: The unknown cannot be a divisor; write solve(expression,x,lower,upper) to search for one root numerically
solve(2^x = 8) daje Unsupported: The unknown cannot be an exponent; write solve(expression,x,lower,upper) to search for one root numerically
solve(x + y = 10) daje 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

Równanie spełnione dla każdej wartości również to zgłasza zamiast wybierać jedno rozwiązanie:

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

Każda taka odmowa wskazuje czteroargumentowe solve opisane poniżej, które szuka jednego pierwiastka numerycznie bez ograniczenia do określonej postaci wyrażenia. Do układów równań liniowych z wieloma niewiadomymi użyj solve_system ze strony Wektory i macierze.

Wyznaczanie jednego pierwiastka numerycznie

Z czterema argumentami solve działa inaczej: szuka wartości zmiennej spełniającej równanie między dwiema podanymi granicami. Użyj tej postaci, gdy dokładny wariant powyżej odrzuci równanie.

calc
solve(x^2 = 2, x, 0, 2) daje 1.4142135624
solve(x^2 - 4, x, -3, 0) daje -2
solve(cos(x) = x, x, 0, 1) daje 0.7390851332
# How long does a stone take to fall 44.1 m?
solve(4.9*t^2 = 44.1, t, 0, 10) daje 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) daje 250

Argumenty to równanie, zmienna, dolna granica i górna granica. Możesz podać równanie z = albo samo wyrażenie, które solve traktuje jako expression = 0.

Wybór granic

solve wymaga, aby między granicami zmieniało się to, która strona równania jest większa. Innymi słowy left - right musi być dodatnie na jednym końcu i ujemne na drugim albo dokładnie równe zeru na końcu. Następnie funkcja zawęża przedział, aż znajdzie miejsce przecięcia.

Ma to kilka konsekwencji:

  • Gdy między granicami są dwa pierwiastki, znak na końcach może być taki sam. solve(x^2 - 4, x, -3, 3) kończy się błędem, ponieważ x^2 - 4 jest dodatnie na obu końcach. Wybierz granice otaczające jeden pierwiastek, na przykład 0 i 3.
  • Pierwiastka, przy którym krzywa tylko dotyka zera, jak w x^2 = 0, nie da się znaleźć tą metodą, ponieważ znak się nie zmienia.
  • Wyrażenie musi być określone w całym przedziale. solve(sqrt(x) = 2, x, -1, 10) daje błąd, ponieważ sqrt liczby ujemnej jest błędem. Zacznij przedział od 0.
  • Skok przez zero, jak w 1/x w pobliżu 0, nie jest pierwiastkiem, więc solve zwraca błąd zamiast wyniku.
  • Dolna granica musi być mniejsza od górnej, a obie muszą być liczbami bez jednostek.

solve zwraca jeden pierwiastek, nigdy listę wszystkich. Działa tylko na liczbach bez jednostek, więc pomiń jednostki w równaniu.

Zaokrąglanie i dalsze wykorzystanie

Wynik jest dokładnym przybliżeniem numerycznym, które może różnić się na ostatniej wyświetlanej cyfrze. Dodaj w tym samym wierszu to 4 dp lub inną liczbę miejsc, aby uprościć zapis, albo najpierw nadaj wynikowi nazwę, aby użyć go później:

calc
solve(sqrt(x) = 2, x, 0, 10) daje 4.0000000001
solve(sqrt(x) = 2, x, 0, 10) to 4 dp daje 4
side = solve(sqrt(x) = 2, x, 0, 10) daje 4.0000000001
side * 3 to 2 dp daje 12

Możesz umieścić solve we własnej funkcji, aby używać go z różnymi wartościami:

calc
root(y) = solve(x^2 = y, x, 0, 10)
root(9) daje 3

Do układów równań liniowych z wieloma niewiadomymi użyj solve_system ze strony Wektory i macierze.

Różniczkowanie symboliczne

Z dwoma argumentami differentiate lub derivative zwraca pochodną jako wzór:

calc
differentiate(sin(x), x) daje cos(x)
derivative(x^3, x) daje (3*(x^(3-1)))
derivative(x * sin(x), x) daje (sin(x)+(x*cos(x)))
derivative(exp(2*x), x) daje (exp((2*x))*2)

Wynik nie jest upraszczany, a każdy krok ma nawiasy: (3*(x^(3-1))) oznacza 3x². Liczby dziesiętne wracają jako ułamki, więc 19.6 pojawia się jako (98/5).

Wynik jest tekstem, a nie wartością do dalszych obliczeń w Varlig. Aby go użyć, wpisz wzór we własnej funkcji:

calc
slope(x) = 3*x^2
slope(2) daje 12

Różniczkowanie symboliczne obsługuje:

  • +, -, *, / i potęgi, z regułami sumy, iloczynu, ilorazu, potęgi i łańcuchową
  • funkcje sin, cos, tan, sinh, cosh, exp, ln i sqrt
  • inne nazwy, traktowane jako stałe i zachowywane jako nazwy w wyniku

Nazwa nie musi mieć wartości w notatce, więc możesz różniczkować wzór z symbolami:

calc
derivative(a*x^2, x) daje (a*(2*(x^(2-1))))

Inne funkcje, takie jak abs, log lub własna funkcja, dają błąd. Użyj dla nich postaci numerycznej poniżej. Wynikowy wzór nie przenosi też ograniczeń dziedziny oryginału: pochodna sqrt(x) ma sens tylko tam, gdzie oryginalne sqrt(x), choć (1/(2*sqrt(x))) wygląda jak samodzielny wzór.

Różniczkowanie numeryczne

Z trzecim argumentem derivative zwraca nachylenie w danym punkcie jako liczbę:

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

Ta postać działa z funkcjami zdefiniowanymi w notatce, takimi jak powyższe height, czego nie potrafi wariant symboliczny. Ponieważ oblicza liczbę, wszystkie pozostałe nazwy w wyrażeniu muszą mieć wartości. To samo dotyczy sum, product, solve i integrate:

calc
derivative(a*x^2, x, 2) daje Unsupported: Unknown name: a
a = 3
derivative(a*x^2, x, 2) daje 12

Wynik jest oszacowaniem na podstawie pobliskich wartości po obu stronach punktu. Gdy rzeczywiste nachylenie jest prostą liczbą, Varlig zapisuje tę liczbę, więc działa dokładne porównanie. Nachylenia niewymierne, na przykład dla exp(x), zachowują wszystkie cyfry, dlatego porównuj je z tolerancją:

calc
derivative(x^3, x, 2) == 12 daje true
abs(derivative(exp(x), x, 1) - e) < 1e-6 daje true

Wyrażenie musi być gładkie w otoczeniu punktu, bez załamań ani przerw. derivative(abs(x), x, 0) daje błąd, ponieważ abs ma załamanie w zerze. derivative(sqrt(x), x, 0) daje błąd, ponieważ sqrt nie jest określone na lewo od zera.

Całkowanie oznaczone

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

Argumenty to wyrażenie, zmienna, dolna granica i górna granica, w tej samej kolejności co w sum. Wynik jest polem ze znakiem pod krzywą między granicami. Zamiana granic odwraca znak, a równe granice dają zero. Możesz całkować funkcje z notatki, na przykład integrate(power(t), t, 0, 4).

integrate działa numerycznie, więc ma pewne ograniczenia:

  • Nie ma całkowania nieoznaczonego: wynikiem zawsze jest liczba, nigdy wzór.
  • Obie granice muszą być skończone; nie można całkować do nieskończoności.
  • Wyrażenie musi być określone w całym przedziale. integrate(1/sqrt(x), x, 0, 1) daje błąd, ponieważ 1/sqrt(0) dzieli przez zero, mimo że samo pole jest skończone.
  • Wyrażenia ze skokami, ostrymi pikami lub bardzo szybkimi oscylacjami mogą dawać niedokładne wyniki albo błąd.
  • Jednostki nie są przyjmowane, więc umieść je w komentarzu, jak w ostatnim przykładzie.

Algorytmy i zbieżność

Te szczegóły nie są potrzebne na co dzień, ale pomagają, gdy wynik wygląda nieprawidłowo lub wiersz zgłasza błąd.

solve używa bisekcji: wielokrotnie dzieli przedział na pół, zachowując połowę ze zmianą znaku. Kończy, gdy left - right różni się od zera o najwyżej 10⁻¹⁰ i przedział jest dostatecznie wąski; po 128 podziałach bez zbieżności zwraca błąd.

Symboliczne derivative stosuje standardowe reguły krok po kroku bez upraszczania. Wynik może mieć najwyżej 8192 znaki. To nie jest pełny system algebry komputerowej.

Numeryczne derivative porównuje różnice centralne przy coraz mniejszych krokach i osobno sprawdza nachylenie z obu stron. Jeśli się nie zgadzają lub pobliska wartość jest nieokreślona, zwraca błąd zamiast zgadywać.

integrate używa adaptacyjnych 7- i 15-punktowych kwadratur Gaussa–Kronroda. Porównuje dwa oszacowania w każdej części przedziału i dzieli część z największym szacowanym błędem, aż łączny błąd spadnie poniżej 10⁻⁹ × max(1, |wynik|). Dopuszcza do 2048 podziałów, 20 poziomów podziału i wspólny limit 100 000 kroków. Punkty próbkowania nie są równomierne, więc szybka oscylacja taka jak cos(128*pi*x) od 0 do 1 poprawnie daje całkę bliską zeru zamiast zostać uznana za stałą. Oszacowanie błędu pozostaje heurystyką, dlatego ostrożnie traktuj wyniki dla osobliwości i nieciągłości.

Pełne zasady są w dokumentacji zaawansowanej matematyki.

Przykład całościowy

Oto sprawdzenie zadania z fizyki: piłka rzucona pionowo w górę z prędkością 19,6 m/s, przy przyspieszeniu grawitacyjnym 9,8 m/s²:

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) daje 4
# Speed after 1 second, from the slope of the height
derivative(height(t), t, 1) daje 9.8
# Highest point, where the velocity is zero
peak = solve(velocity(t) = 0, t, 0, landing) daje 2
height(peak) daje 19.6
# Check: integrating the velocity up to the peak gives the same height
integrate(velocity(t), t, 0, peak) daje 19.6

Piłka ląduje po 4 sekundach i osiąga 19,6 m po 2 sekundach. Dolna granica 1 w wierszu landing pozwala solve ominąć drugi pierwiastek przy t = 0. Ostatni wiersz potwierdza wysokość inną metodą, całkując prędkość.