Spring naar inhoud
Varlig-handleiding
Varlig-startpagina

Sommen, vergelijkingen en analyse

Deze pagina behandelt sommen en producten van reeksen termen, vergelijkingen oplossen, een uitdrukking als formule of op één punt differentiëren en bepaalde integralen berekenen. Gebruik dit voor Σ- of Π-notatie, wanneer een vergelijking lastig met de hand te herleiden is, of om een afgeleide of oppervlakte onder een curve uit je studie te controleren.

Al deze functies krijgen een variabelenaam als argument, zoals k in sum(k^2, k, 1, 10). Die naam bestaat alleen binnen de functieaanroep en verandert nooit een gelijknamige waarde elders in je notitie.

Eindige sommen en producten

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

De argumenten zijn de uitdrukking, de variabele, de beginwaarde en de eindwaarde. Beide grenzen tellen mee: sum(k, k, 1, 100) telt 1 + 2 + … + 100 op. summation is een andere naam voor sum. De derde regel toont dat de eerste tien oneven getallen samen 10² zijn; de laatste is 5-faculteit.

Sommen werken met geld en eenheden, handig voor regelmatig sparen:

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

Een product is nuttig voor opeenvolgende kansen. De kans dat minstens twee mensen in een groep van 23 dezelfde verjaardag hebben, is één min de kans dat alle 23 verjaardagen verschillend zijn:

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

Enkele details:

  • Begin- en eindwaarden moeten gehele getallen zijn.
  • Ligt de eindwaarde onder de beginwaarde, dan zijn er geen termen: de som is 0 en het product 1.
  • Eén som of product mag maximaal 10.000 termen hebben.
  • Sommen kunnen genest worden, zoals sum(sum(j, j, 1, n), n, 1, 4), met als resultaat 20. Geneste aanroepen delen één totale werklimiet.
  • Gebruik een lijst om bestaande waarden op te tellen: sum([4, 8, 15]). Zie Lijsten en statistiek.

Een vergelijking exact oplossen

Met alleen een vergelijking leest solve de coëfficiënten en berekent het resultaat zoals je dat op papier zou doen:

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

De onbekende is de enige naam in de vergelijking zonder eigen waarde. Eerder gedefinieerde namen worden als hun waarde gelezen. Laat je het rechterlid weg, dan wordt de uitdrukking gelijk aan nul gesteld.

Een lineaire vergelijking geeft één getal als resultaat. Een kwadratische geeft een lijst van de verschillende reële wortels, van klein naar groot. Een dubbele wortel wordt dus een lijst met één element:

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

De vorm van het resultaat volgt de vergelijking, niet de gevonden wortels: een kwadratische vergelijking geeft altijd een lijst.

Lineaire vergelijkingen en kwadratische vergelijkingen waarvan de discriminant een volkomen kwadraat is, worden met exacte breuken opgelost. solve(x^2 - 5x + 6 = 0) geeft dus exact 2 en 3. Anders worden beide wortels als decimale vierkantswortels berekend. Twee benaderingen zijn niet noodzakelijk gelijk, ook als ze er zo uitzien: solve(x^2 - 2 = 0) en sqrt(2) tonen beide 1.4142135624, maar vergelijken als verschillend.

Vergelijkingen worden met gewone getallen opgelost. Eenheden en geld worden geweigerd, omdat herleiden ze anders mogelijk niet behoudt. Zie Wat de rekenengine garandeert voor de volledige regel.

Wanneer het niet kan

Er wordt niet gegokt. Zonder reële wortel verschijnt een melding in plaats van een complexe wortel. Alles boven de tweede graad wordt geweigerd, met de numerieke vorm als alternatief:

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

De onbekende mag ook niet in een deler of exponent staan. Bij twee ongedefinieerde namen vermeldt de fout welke niet kon worden gelezen:

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

Een vergelijking die voor elke waarde waar is meldt dat ook, in plaats van één waarde te kiezen:

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

Al deze weigeringen verwijzen naar solve met vier argumenten hieronder, dat numeriek één wortel zoekt ongeacht de vorm van de uitdrukking. Gebruik voor meerdere lineaire vergelijkingen met meerdere onbekenden solve_system uit Vectoren en matrices.

Eén numerieke wortel vinden

Met vier argumenten werkt solve anders: het zoekt tussen twee opgegeven grenzen een variabelenwaarde die de vergelijking waar maakt. Gebruik dit wanneer de exacte vorm hierboven een vergelijking weigert.

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

De argumenten zijn de vergelijking, de variabele, de ondergrens en de bovengrens. Je kunt een vergelijking met = geven of alleen een uitdrukking, die solve leest als expression = 0.

De grenzen kiezen

Voor solve moet tussen de grenzen wisselen welk lid het grootst is. Anders gezegd: left - right moet bij de ene grens positief en bij de andere negatief zijn, of bij een grens exact nul. De functie verkleint het interval totdat ze het kruispunt vindt.

Dat heeft enkele gevolgen:

  • Bij twee wortels binnen de grenzen hoeft het teken over het hele interval niet te wisselen. solve(x^2 - 4, x, -3, 3) mislukt omdat x^2 - 4 aan beide uiteinden positief is. Kies grenzen rond één wortel, zoals 0 en 3.
  • Een wortel waar de curve nul alleen raakt, zoals bij x^2 = 0, is zo niet te vinden: het teken wisselt daar niet.
  • De uitdrukking moet over het hele interval gedefinieerd zijn. solve(sqrt(x) = 2, x, -1, 10) mislukt omdat sqrt van een negatief getal een fout geeft. Begin het interval bij 0.
  • Een sprong over nul, zoals bij 1/x rond 0, is geen wortel. solve geeft daar dus een fout in plaats van een resultaat.
  • De ondergrens moet kleiner zijn dan de bovengrens en beide moeten gewone getallen zijn.

solve geeft één wortel, nooit een lijst van alle wortels. Het werkt alleen met gewone getallen; laat eenheden dus weg uit de vergelijking.

Afronden en opnieuw gebruiken

Het resultaat is een nauwkeurige numerieke benadering; het laatste getoonde cijfer kan afwijken. Voeg op dezelfde regel to 4 dp toe, of een ander aantal decimalen, voor een overzichtelijk getal. Geef het resultaat eerst een naam als je het wilt hergebruiken:

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

Je kunt solve in een eigen functie opnemen om het met andere waarden te hergebruiken:

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

Gebruik voor meerdere lineaire vergelijkingen met meerdere onbekenden solve_system uit Vectoren en matrices.

Symbolisch differentiëren

Met twee argumenten geeft differentiate (of derivative) de afgeleide als formule:

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

Het resultaat wordt niet vereenvoudigd en elke stap krijgt haakjes: (3*(x^(3-1))) is 3x². Decimale getallen komen terug als breuken: 19.6 verschijnt als (98/5).

Het resultaat is tekst, geen waarde waarmee Varlig verder kan rekenen. Typ de formule in een eigen functie om haar te gebruiken:

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

Symbolisch differentiëren ondersteunt:

  • +, -, *, / en machten, met de som-, product-, quotiënt-, machts- en kettingregel
  • de functies sin, cos, tan, sinh, cosh, exp, ln en sqrt
  • andere namen, die als constanten worden behandeld en als namen in het resultaat blijven

Een naam hoeft geen waarde in je notitie te hebben; je kunt dus een formule met symbolen differentiëren:

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

Andere functies, zoals abs, log en zelfgedefinieerde functies, geven een fout. Gebruik daarvoor de numerieke vorm hieronder. De formule neemt ook de domeinbeperkingen van de oorspronkelijke uitdrukking niet over: de afgeleide van sqrt(x) is alleen geldig waar sqrt(x) geldig is, ook al lijkt (1/(2*sqrt(x))) een zelfstandige formule.

Numeriek differentiëren

Met een derde argument geeft derivative de helling op dat punt als getal:

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

Deze vorm werkt met functies uit je notitie, zoals height hierboven, wat de symbolische vorm niet kan. Omdat ze een getal berekent, moet elke andere naam in de uitdrukking een waarde hebben. Hetzelfde geldt voor sum, product, solve en integrate:

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

Het resultaat wordt geschat uit nabijgelegen waarden aan beide kanten van het punt. Is de werkelijke helling een eenvoudig getal, dan bewaart Varlig dat getal en werkt exact vergelijken. Irrationale hellingen, zoals die van exp(x), behouden alle cijfers; vergelijk ze daarom met een tolerantie:

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

De uitdrukking moet rond het punt glad zijn, zonder knikken of gaten. derivative(abs(x), x, 0) geeft een fout omdat abs een knik bij nul heeft. derivative(sqrt(x), x, 0) geeft een fout omdat sqrt links van nul niet gedefinieerd is.

Bepaalde integralen

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

De argumenten zijn de uitdrukking, de variabele, de ondergrens en de bovengrens, in dezelfde volgorde als bij sum. Het resultaat is de getekende oppervlakte onder de curve tussen de grenzen. Grenzen omwisselen keert het teken om; gelijke grenzen geven nul. Functies uit je notitie werken ook, zoals integrate(power(t), t, 0, 4).

integrate werkt numeriek en heeft daarom enkele beperkingen:

  • Onbepaald integreren kan niet: je krijgt altijd een getal, nooit een formule.
  • Beide grenzen moeten eindige getallen zijn; integreren tot oneindig kan niet.
  • De uitdrukking moet over het hele interval gedefinieerd zijn. integrate(1/sqrt(x), x, 0, 1) geeft een fout omdat 1/sqrt(0) door nul deelt, ook al is de oppervlakte zelf eindig.
  • Uitdrukkingen met sprongen, pieken of zeer snelle oscillaties kunnen onnauwkeurige resultaten of een fout geven.
  • Eenheden worden niet geaccepteerd; zet ze in een opmerking, zoals in het laatste voorbeeld.

Algoritmen en convergentie

Voor dagelijks gebruik heb je deze details niet nodig, maar ze helpen als een resultaat vreemd lijkt of een regel een fout geeft.

solve gebruikt bisectie: het halveert het interval telkens en behoudt de helft waarin het teken wisselt. Het stopt als left - right binnen 10⁻¹⁰ van nul ligt en het interval smal genoeg is. Na 128 halveringen volgt anders een fout.

Symbolische derivative past de standaardregels stap voor stap toe zonder vereenvoudiging. Het resultaat mag maximaal 8.192 tekens lang zijn. Dit is geen volledig computeralgebrasysteem.

Numerieke derivative vergelijkt centrale differenties met steeds kleinere stappen en controleert de helling aan beide kanten afzonderlijk. Komen die niet overeen of is een waarde nabij het punt ongedefinieerd, dan volgt een fout in plaats van een gok.

integrate gebruikt adaptieve Gauss–Kronrod-regels met 7 en 15 punten. Het vergelijkt beide schattingen per deelinterval en splitst het deel met de grootste geschatte fout totdat de totale geschatte fout onder 10⁻⁹ × max(1, |answer|) ligt. Het staat maximaal 2.048 splitsingen, 20 niveaus en een gedeeld budget van 100.000 stappen toe. De meetpunten liggen niet gelijkmatig verspreid, zodat een snelle oscillatie als cos(128*pi*x) van 0 tot 1 terecht ongeveer nul oplevert en niet voor een constante wordt aangezien. De foutschatting blijft een heuristiek; wees dus voorzichtig met resultaten bij singulariteiten of discontinuïteiten.

De volledige regels staan in de referentie voor geavanceerde wiskunde.

Alles combineren

Hier controleren we een natuurkundeopgave: een bal wordt recht omhoog gegooid met 19,6 m/s, bij een zwaartekrachtsversnelling van 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) geeft 4
# Speed after 1 second, from the slope of the height
derivative(height(t), t, 1) geeft 9.8
# Highest point, where the velocity is zero
peak = solve(velocity(t) = 0, t, 0, landing) geeft 2
height(peak) geeft 19.6
# Check: integrating the velocity up to the peak gives the same height
integrate(velocity(t), t, 0, peak) geeft 19.6

De bal landt na 4 seconden en bereikt na 2 seconden een hoogte van 19,6 m. De ondergrens 1 in de regel landing houdt solve weg van de andere wortel bij t = 0. De laatste regel controleert de hoogte op een tweede manier, door de snelheid te integreren.