Pular para o conteúdo
Guia do Varlig
Página inicial do Varlig

Somatórios, equações e cálculo

Esta página explica como somar ou multiplicar uma sequência de termos, resolver uma equação, derivar uma expressão simbolicamente ou em um ponto e calcular integrais definidas. Use esses recursos quando um problema pedir notação Σ ou Π, quando for difícil isolar a incógnita à mão ou quando quiser conferir uma derivada ou a área sob uma curva nos seus estudos.

Todas essas funções tomam um nome de variável como um de seus argumentos, como o k em sum(k^2, k, 1, 10). Esse nome só existe dentro da chamada, então ele nunca altera um valor do mesmo nome em outro lugar da sua nota.

Somas e produtos finitos

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

Os argumentos são a expressão, a variável, o primeiro valor e o último valor. Ambas as extremidades estão incluídas, então sum(k, k, 1, 100) adiciona 1 + 2 +... + 100. summation é outro nome para sum. A terceira linha mostra que os primeiros dez números ímpares somam até 10², e o último é 5 fatorial.

As somas aceitam valores monetários e unidades, o que é útil para calcular depósitos regulares:

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

Um produto é útil para cadeias de probabilidades. A chance de que pelo menos duas pessoas em um grupo de 23 compartilhem um aniversário é uma menos a chance de que todos os 23 aniversários sejam diferentes:

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

Alguns detalhes:

  • O primeiro e o último valores devem ser números inteiros.
  • Se o último valor estiver abaixo do primeiro, não há termos: a soma é 0 e o produto é 1.
  • Uma única soma ou produto pode ter no máximo 10.000 termos.
  • As somas podem ser aninhadas, como em sum(sum(j, j, 1, n), n, 1, 4), que é 20. Chamadas aninhadas compartilham um limite geral de trabalho.
  • Para adicionar valores que você já tem, use uma lista em vez disso: sum([4, 8, 15]). Veja Listas e estatísticas.

Resolva uma equação exatamente

Quando recebe apenas uma equação, solve lê os coeficientes e calcula a solução como você faria no papel:

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

A incógnita é o único nome na equação que ainda não tem um valor. Nomes já definidos usam seus respectivos valores. Se você omitir o lado direito, a expressão será igualada a zero.

Uma equação linear retorna um número. Uma equação quadrática retorna uma lista de raízes reais distintas, em ordem crescente; se houver uma raiz dupla, a lista terá apenas um elemento:

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

O formato da resposta depende do tipo de equação, não das raízes encontradas: uma equação quadrática sempre retorna uma lista.

Equações lineares e quadráticas com discriminante quadrado perfeito são calculadas com frações exatas: as raízes de solve(x^2 - 5x + 6 = 0) são exatamente 2 e 3. Quando o discriminante não é um quadrado perfeito, as raízes são aproximações decimais. Dois valores aproximados podem ser diferentes mesmo que pareçam iguais: solve(x^2 - 2 = 0) e sqrt(2) exibem 1.4142135624, mas a comparação os considera diferentes.

As equações são resolvidas apenas com números sem unidades. Valores com unidades ou moedas são recusados, para evitar manipulações algébricas que não preservariam essas informações. Veja a regra completa em O que o mecanismo garante.

Quando diz não

Não há como adivinhar. Uma equação sem raiz real diz isso em vez de alcançar uma complexa, e qualquer coisa além de uma quadrática é recusada com a forma numérica como alternativa:

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

A incógnita também não pode aparecer em um divisor ou expoente. Se a equação tiver dois nomes não definidos, a mensagem indicará qual deles não pôde ser interpretado:

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

Uma equação que todo valor satisfaz também diz isso, em vez de escolher uma:

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

Todas essas recusas indicam a forma de solve com quatro argumentos, descrita abaixo. Ela busca uma raiz numericamente, sem exigir uma forma específica para a expressão. Para sistemas de equações lineares com várias incógnitas, use solve_system, em Vetores e matrizes.

Encontre uma raiz numérica

Com quatro argumentos, solve funciona de outra forma: busca, entre dois limites informados, um valor da variável que satisfaça a equação. Use essa forma quando a resolução exata acima recusar a equação.

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

Os argumentos são a equação, a variável, o limite inferior e o limite superior. Você pode dar uma equação com =, ou uma expressão por si só, que solve trata como expression = 0.

Escolhendo os limites

solve precisa dos dois lados da equação para trocar qual é maior em algum lugar entre seus limites. Em outras palavras, left - right deve ser positiva em um limite e negativa no outro (ou exatamente zero em um limite). Em seguida, reduz o alcance até encontrar o ponto de travessia.

Isso tem algumas consequências:

  • Se houver duas raízes entre os limites, o sinal pode não mudar no geral. solve(x^2 - 4, x, -3, 3) falha, porque x^2 - 4 é positivo em ambas as extremidades. Use limites que cercam uma raiz, como 0 e 3.
  • Uma raiz onde a curva só toca zero, como x^2 = 0, não pode ser encontrada dessa maneira, porque o sinal nunca muda.
  • A expressão tem que ser definida em todo o intervalo. solve(sqrt(x) = 2, x, -1, 10) falha porque sqrt de um valor numérico negativo é um erro. Em vez disso, inicie o intervalo em 0.
  • Um salto sobre zero, como em 1/x perto de 0, não é uma raiz, então solve dá um erro lá em vez de uma resposta.
  • O limite inferior deve ser menor que o limite superior, e ambos devem ser números simples.

solve retorna uma raiz, nunca uma lista de todas elas. Funciona apenas com números simples, então deixe as unidades fora da equação.

Arredondamento e reutilização

A resposta é uma aproximação numérica precisa, mas pode ter erro no último dígito exibido. Acrescente to 4 dp (ou outra quantidade de casas decimais) à mesma linha para ajustar a apresentação, ou atribua um nome ao resultado antes de reutilizá-lo:

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

Você pode envolver solve em uma função própria para reutilizá-la com valores diferentes:

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

Para várias equações lineares em várias incógnitas, use solve_system de Vetores e matrizes.

Diferenciação simbólica

Com dois argumentos, differentiate (ou derivative ) dá a derivada como uma fórmula:

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

O resultado não é simplificado, e cada etapa está entre parênteses: (3*(x^(3-1))) é 3x². Decimais em sua expressão voltam como frações, então 19.6 aparece como (98/5).

O resultado é texto, não algo com que Varlig possa calcular. Para usá-lo, digite a fórmula em uma função própria:

calc
slope(x) = 3*x^2
slope(2) resulta em 12

A derivação simbólica aceita:

  • +, -, *, / e potências, usando as regras da soma, do produto, do quociente, da potência e da cadeia
  • As funções sin, cos, tan, sinh, cosh, exp, ln e sqrt
  • Outros nomes, que são tratados como constantes e permanecem como nomes no resultado

Um nome não precisa de um valor em sua nota, então você pode diferenciar uma fórmula com símbolos nela:

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

Outras funções, como abs, log ou uma função definida por você, produzem um erro. Para elas, use a forma numérica abaixo. A fórmula resultante também não registra as restrições da expressão original: a derivada de sqrt(x) só se aplica onde sqrt(x) é válida, mesmo que (1/(2*sqrt(x))) pareça uma fórmula independente.

Diferenciação numérica

Com um terceiro argumento, derivative dá a inclinação nesse ponto como um valor numérico:

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

Esta forma funciona com funções que você definiu na nota, como height acima, que a forma simbólica não pode. Como ele resolve um valor numérico, todos os outros nomes na expressão precisam de um valor. O mesmo vale para sum, product, solve e integrate :

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

A resposta é estimada a partir de valores próximos dos dois lados do ponto. Quando a inclinação verdadeira é um número simples, Varlig armazena esse valor e permite comparações exatas. Inclinações irracionais, como a de exp(x), mantêm todos os dígitos calculados; compare esses resultados usando uma tolerância:

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

A expressão precisa ser suave na vizinhança do ponto, sem pontos angulosos ou descontinuidades. derivative(abs(x), x, 0) produz erro porque abs tem um ponto anguloso em zero. derivative(sqrt(x), x, 0) também produz erro porque sqrt não está definida à esquerda de zero.

Integração definida

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

Os argumentos são a expressão, a variável, o limite inferior e o limite superior, na mesma ordem de sum. A resposta é a área com sinal sob a curva entre os limites. Inverter os limites inverte o sinal; limites iguais dão zero. Você pode integrar funções definidas na nota, como integrate(power(t), t, 0, 4).

integrate calcula numericamente, por isso há algumas limitações:

  • Não há integração indefinida: você sempre recebe um valor numérico, nunca uma fórmula.
  • Ambos os limites devem ser números finitos; não há como se integrar ao infinito.
  • A expressão deve ser definida em todo o intervalo. integrate(1/sqrt(x), x, 0, 1) é um erro, porque 1/sqrt(0) divide por zero, mesmo que a própria área seja finita.
  • Expressões com saltos, picos ou oscilações muito rápidas podem produzir resultados imprecisos ou um erro.
  • As unidades não são aceitas, então deixe-as em um comentário, como no último exemplo.

Algoritmos e convergência

Você não precisa desses detalhes para o uso diário, mas eles ajudam quando um resultado parece errado ou uma linha dá um erro.

solve usa o método da bisseção: divide o intervalo ao meio repetidamente, mantendo a metade em que o sinal muda. Para quando left - right está a no máximo 10⁻¹⁰ de zero e o intervalo é suficientemente estreito. Após 128 divisões sem convergência, retorna um erro.

derivative simbólica aplica as regras usuais, passo a passo, sem simplificar. O resultado pode ter no máximo 8.192 caracteres. Não se trata de um sistema completo de álgebra computacional.

derivative numérica compara diferenças centrais com passos cada vez menores e verifica separadamente a inclinação de cada lado. Se os resultados não concordarem ou algum valor próximo do ponto não estiver definido, retorna um erro em vez de arriscar uma resposta.

integrate usa regras adaptativas de Gauss–Kronrod de 7 e 15 pontos. Compara as duas estimativas em cada trecho do intervalo e subdivide o trecho com maior erro estimado, até que o erro total estimado fique abaixo de 10⁻⁹ × max(1, |answer|). Permite até 2.048 subdivisões, 20 níveis de subdivisão e um limite compartilhado de 100.000 etapas. Os pontos de amostragem não são igualmente espaçados; assim, uma oscilação rápida como cos(128*pi*x) de 0 a 1 resulta corretamente em uma integral próxima de zero, sem ser confundida com uma constante. A estimativa de erro ainda é heurística: interprete com cuidado resultados de expressões com singularidades ou descontinuidades.

As regras completas estão na referência matemática avançada.

Combinando os recursos

Veja como conferir um exercício de física: uma bola lançada verticalmente para cima a 19,6 m/s, considerando a aceleração da gravidade de 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) resulta em 4
# Speed after 1 second, from the slope of the height
derivative(height(t), t, 1) resulta em 9.8
# Highest point, where the velocity is zero
peak = solve(velocity(t) = 0, t, 0, landing) resulta em 2
height(peak) resulta em 19.6
# Check: integrating the velocity up to the peak gives the same height
integrate(velocity(t), t, 0, peak) resulta em 19.6

A bola pousa após 4 segundos e chega a 19,6 m em 2 segundos. O limite inferior de 1 na linha landing mantém solve longe da outra raiz em t = 0. A última linha confirma a altura de uma segunda maneira, integrando a velocidade.