João Bonifácio
  • Home
  • About
  • R Packages
  • Shiny Apps

Soma de Riemann com R

R
Matemática
Aprenda a calcular a área de uma região plana delimitada por uma curva usando a soma de Riemann com R
Author

João Bonifácio

Published

February 16, 2025

Introdução

A soma de Riemann é uma técnica matemática utilizada para aproximar a área de uma região plana delimitada por uma curva. Ela é uma das ferramentas fundamentais para o cálculo de integrais definidas e é amplamente utilizada em várias áreas da ciência e engenharia.

Neste post, vamos usar o R para aproximar a área de uma região plana delimitada por uma curva usando a soma de Riemann. Vamos usar três métodos de soma de Riemann: esquerda, direita e ponto médio. De pacotes usaremos o kableExtra para visualizar as tabelas.

Aproximação de area sob a curva

A soma é dada pela divisão da região a ser calculada em formas (retângulos, trapézios, parábolas ou cubos) que juntos formam uma região que é similar àquela a ser medida, então calcula-se a área de cada uma das formas, e finalmente soma-se todas essas áreas menores juntas. Essa abordagem pode ser usada para encontrar uma aproximação numérica para a integral definida. Para isso, precisa-se definir uma função e os limites de integração.

fx = function(x) -x^2 + 3*x + 4
a = 1
b = 4

Tendo a função e os limites de integração, vamos definir a função de soma de Riemann para aproximar a área sob a curva. Para isso, vamos dividir a região de integração em \(n\) partes iguais e calcular a área de cada uma das partes. A soma dessas áreas é uma aproximação da área sob a curva. Considerando \(n=20\) e usando o limite inferior da região de integração como ponto de partida, vamos calcular a área sob a curva.

#dividir o intervalo em subintervalos
seqx = seq(a,b,length.out=21);
dx = diff(seqx)

#left end point
fx.left = fx(seqx[-length(seqx)])
Ln = sum(dx*fx.left)

#construir grafico
x = seq(a,b,by=0.1);

#left
plot(x,fx(x),type='l',ylim=c(min(fx(x)),max(fx(x)))); abline(h=0,v=0);
for(i in 1:length(seqx))  rect(seqx[i], 0, seqx[i+1], fx(seqx[i]),col=rgb(0,1,1,0.2))

Pode-se repetir o mesmo processo para o ponto final do intervalo de integração e para o ponto médio do intervalo de integração.

#right end point
fx.right = fx(seqx[-1])
Rn = sum(dx*fx.right)

#middle point
fx.middle = fx(seqx[-1] - dx/2);
Mn = sum(dx*fx.middle)

par(mfrow=c(1,2))

#right
plot(x,fx(x),type='l',ylim=c(min(fx(x)),max(fx(x)))); abline(h=0,v=0);
for(i in 1:length(seqx))  rect(seqx[i], 0, seqx[i+1], fx(seqx[i+1]),col=rgb(0,1,1,0.2))

#middle
plot(x,fx(x),type='l',ylim=c(min(fx(x)),max(fx(x)))); abline(h=0,v=0);
for(i in 1:length(seqx))  rect(seqx[i], 0, seqx[i+1], fx((seqx[i+1]+seqx[i])/2),col=rgb(0,1,1,0.2))

Podemos então comparar a área sob a curva calculada pelos três métodos de soma de Riemann com o valor da integral definida.

library(kableExtra) # para a tabela
resp = integrate(fx, lower = a, upper = b)$value
error = c(abs(resp-Ln),abs(resp-Rn),abs(resp-Mn),resp)
kable(data.frame(
  c("Valor", "Erro"),
  c(Ln,abs(resp-Ln)),
  c(Rn,abs(resp-Rn)),
  c(Mn,abs(resp-Mn)),
  c(resp,0)), 
  col.names = c("","Esquerda","Direita","Meio","Valor real"),
  caption = "Comparação entre os métodos de soma de Riemann")
Comparação entre os métodos de soma de Riemann
Esquerda Direita Meio Valor real
Valor 13.93875 13.03875 13.505625 13.5
Erro 0.43875 0.46125 0.005625 0.0

Nota-se que a soma de Riemann pelo ponto médio é a que mais se aproxima do valor real da integral definida.

Aproximação de área entre duas curvas

Da mesma forma, a soma de Riemann também pode ser usada para encontrar a área entre duas curvas. Para isso, precisa-se definir duas funções e os limites de integração. Seja: \[f(x) = \sqrt{x}\] e \[g(x) = x\] vamos encontrar a área entre as duas curvas no intervalo \([0,1]\).

f1x = function(x) x
f2x = function(x) sqrt(x)
a = 0; 
b = 1;
seqx = seq(a,b,length.out=50)
par(mfrow=c(1,2))
x = seq(0,1,by=0.1);

Tendo as duas funções e os limites de integração, vamos calcular a área entre as duas curvas usando a soma de Riemann pelo ponto médio.

par(mfrow=c(1,2))
plot(x,f1x(x),type='l',ylim=c(0,max(f1x(x)))); abline(h=0,v=0);
lines(x,f2x(x))
plot(x,f1x(x),type='l',ylim=c(0,max(f1x(x)))); abline(h=0,v=0);
lines(x,f2x(x))
for(i in 1:length(seqx))  rect(seqx[i], 0, seqx[i+1], f1x((seqx[i+1]+seqx[i])/2),col=rgb(0,1,1,0.5))
for(i in 1:length(seqx))  rect(seqx[i], 0, seqx[i+1], f2x((seqx[i+1]+seqx[i])/2),col=rgb(1,0,0,.3))

A área entre as duas curvas é dada pela diferença entre as áreas sob as duas curvas. Neste caso precisamos calcular a área sob a curva \(g(x)\) e subtrair a área sob a curva \(f(x)\). Assim, a área entre as duas curvas é dada por:

dx = diff(seqx)
f1x.middle = f1x(seqx[-1] - dx/2);
f2x.middle = f2x(seqx[-1] - dx/2);
Mn = sum(dx*f2x.middle - dx*f1x.middle)
Mn
[1] 0.1668355

Comparando este valor com o valor real da área entre as duas curvas, temos:

\[\int_{0}^{1} (\sqrt{x}-x) dx = \frac{2\sqrt{x}}{3}-\frac{x^2}{2}\bigg|_{0}^{1}=\frac{2}{3}-\frac{1}{2}=\frac{1}{6}\] Usando a função integrate do R, temos:

int <-integrate(function(x) f2x(x)-f1x(x), lower = a, upper = b)$value
cat("Valor real da área entre as duas curvas:",int)
Valor real da área entre as duas curvas: 0.1666667

Que é um valor muito próximo do valor calculado pela soma de Riemann pelo ponto médio. Para melhorar a precisão, pode-se aumentar o número de subintervalos.