using SymPy # Para el cálculo simbólico de integrales.
using QuadGK # Para el cálculo numérico de integrales.
using Plots # Para el dibujo de gráficas.
using LaTeXStrings # Para usar código LaTeX en los gráficos.
using PrettyTables # Para formatear tablas.
6 Integrales de funciones reales
6.1 Ejercicios Resueltos
Para la realización de esta práctica se requieren los siguientes paquetes:
Ejercicio 6.1 Sea
Calcular la suma inferior de Riemann de
en el intervalo , tomando una partición de 10 subinvervalos de igual amplitud.AyudaLa suma inferior de Riemann de una función
en un intervalo se obtiene sumando las áreas de los rectángulos que resultan de tomar una partición del intervalo, tomando como base la amplitud de los subintervalos y el como altura el mínimo valor de en el subintervalo.Soluciónf(x) = x^2 # Definimos la amplitud de los subintervalos. = 1/10 Δx # Calculamos las áreas de los rectángulos tomando como altura el mínimo valor de la función en el subintervalo, que es el valor de la función en el extremo izquierdo del subintervalo. = [f((i-1)*Δx)*Δx for i = 1:10] areas_inf # Sumamos las áreas de los rectángulos. = sum(areas_inf) sum_inf
0.2850000000000001
Calcular la suma superior de Riemann de
en el intervalo , tomando una partición de 10 subinvervalos de igual amplitud.AyudaLa suma superior de Riemann de una función
en un intervalo se obtiene sumando las áreas de los rectángulos que resultan de tomar una partición del intervalo, tomando como base la amplitud de los subintervalos y el como altura el máximo valor de en el subintervalo.Soluciónf(x) = x^2 # Definiendo la amplitud de los subintervalos. = 1/10 Δx # Calculamos las áreas de los rectángulos tomando como altura el máximo valor de la función en el subintervalo, que es el valor de la función en el extremo derecho del subintervalo. = [f(i*Δx)*Δx for i = 1:10] areas_sup # Sumamos las áreas de los rectángulos. = sum(areas_sup) sum_sup
0.3850000000000001
Dar una cota del error cometido en la aproximación del área encerrada entre la gráfica de
y el eje en el intervalo tomando sumas de Riemann para una partición en 10 subintervalos.SoluciónLa suma inferior de Riemann nos da una cota inferior del área que queda encerrada entre la gráfica de la función y el eje
en el intervalo , mientras que la suma superior de Riemann nos da una cota superior. Por tanto, si tomamos cualquier valor entre la suma inferior y la suma superior de Riemann como aproximación del área encerrada entre la gráfica de y el eje , una cota del error cometido será la diferencia entre la suma superior y la suma inferior.= sum_sup - sum_inf error
0.10000000000000003
Definir una función para calcular de manera aproximada el área encerrada entre la gráfica de
y el eje en el intervalo tomando sumas de Riemann para una partición en subintervalos, y el error cometido en la aproximación. Utilizarla para calcular los errores aproximados al aproximar el area de en el intervalo tomando particiones desde 10 a 100 subintervalos.Soluciónusing PrettyTables f(x) = x^2 function suma_inf(f, a, b, n) """ Función que calcular la suma inferior de Riemann de una función f en el intervalo [a,b] tomando una partición de n subintervalos. """ = (b-a)/n Δx return sum([f(a+(i-1)*Δx)*Δx for i = 1:n]) end function suma_sup(f, a, b, n) """ Función que calcular la suma superior de Riemann de una función f en el intervalo [a,b] tomando una partición de n subintervalos. """ = (b-a)/n Δx return sum([f(a+i*Δx)*Δx for i = 1:n]) end function area(f, a, b, n) """ Función que calcular de manera aproximada el área encerrada entre la gráfica de f y el eje x en el intervalo [a,b] tomando sumas de Riemann para una partición en n subintervalos, y el error cometido en la aproximación. """ = suma_inf(f, a, b, n) area_inf = suma_sup(f, a, b, n) area_sup = (area_inf + area_sup) / 2 area = area_sup - area_inf error return area, error end suma_sup(f, 0, 1, 10) area(f, 0, 1, 10) = [area(f, 0, 1, 10^n) for n=1:6] areas pretty_table(hcat(first.(areas), last.(areas)); header = ["Aproximación", "Error"])
┌──────────────┬────────┐ │ Aproximación │ Error │ ├──────────────┼────────┤ │ 0.335 │ 0.1 │ │ 0.33335 │ 0.01 │ │ 0.333334 │ 0.001 │ │ 0.333333 │ 0.0001 │ │ 0.333333 │ 1.0e-5 │ │ 0.333333 │ 1.0e-6 │ └──────────────┴────────┘
Ejercicio 6.2 Calcular las primitivas de las siguientes funciones.
Para calcular la primitiva de una función se puede usar la función integrate(f)
del paquete SymPy
, donde f
es la función a integrar.
- Solución
using SymPy @syms x::real = integrate(x^2*log(x)) primitiva
Obsérvese que la primitiva obtenida con la función
integrate
no incluye la típica constante que define la familia de primitivas.Podemos comprobar que efectivamente es la primitiva derivándola.
diff(primitiva)
- Solución
integrate(log(log(x))/x)
- Solución
Cuando en la función aparece algún parámetro, es necesario indicar la variable con respecto a la que calcular la integral. Para ello se utiliza la función
integrate(f, x)
, siendox
la variable con respecto a la que integrar.@syms a::real integrate(x^a, x)
- Solución
@syms x::real j(x) = (1 + log(x)) * sqrt(1 + (x*log(x))^2 ) # El cálculo directo de la integral no funciona. integrate(j(x)) # Ayudamos a SymPy con la sustitución. h(x) = x*log(x) @syms y::real dy::real # Definimos la nueva función con el cambio de variable. g(y) = j(x)(h(x) => y, diff(h(x), x) => 1) # Integramos la nueva función y deshacemos el cambio de variable. integrate(g(y))(y => h(x))
Ejercicio 6.3 Calcular las siguientes integrales definidas:
Para calcular una integral definida también se puede usar la función integrate(f, (x, a, b))
, del paquete SymPy
, donde, además de la función f
, hay que indicar la variable de integración x
y los límites de integración a
y b
.
- Solución
using SymPy @syms x::real integrate(x^3/(x^2+x+1), (x, -1/2, 0))
- Solución
integrate(sqrt(16-x^2)/x, (x, 2, 4))
- Solución
integrate(1/(3+cos(2x)), (x, 0, PI/2))
Ejercicio 6.4 Calcular la integral definida
Esta función no tiene primitiva como se puede comprobar al realizar la integral con la función integrate
. Para calcularla hay que recurrir a métodos numéricos de aproximación. Para ello se puede usar la función quadgk
del paquete QuadGK
que realiza el cálculo de la integral mediante el método de la cuadratura de Gauss-Kronrod.
using SymPy
@syms x::real
f(x) = x^x
integrate(f(x), (x, 0, 1))
No es posible calcular la primitiva con integrate
porque esta función no tiene primitiva, así que hay que calcular la integral definida de manera aproximada por métodos numéricos.
using QuadGK
quadgk(f(x), 0, 1, rtol = 10^-10)
(0.783430510710741, 7.598588099878845e-11)
Ejercicio 6.5 Dibujar y calcular el área encerrada por la parábola
Para calcular el área encerrada entre la gráfica de una función y el eje
Otra opción es calcular el área mediante la integral del valor absoluto de la función.
Dibujamos primero la región.
using SymPy, LaTeXStrings, GLMakie
@syms x::real
f(x) = x^2-7x+6
# Definimos un rango de valores para x.
= range(2, 7, length=100)
xs # Creamos la figura.
= Figure()
fig # Definimos los ejes.
= Axis(fig[1, 1])
ax # Dibujamos la región.
band!(ax, xs, f.(xs), [0], color = :blue, alpha = 0.3)
# Dibujamos la función.
lines!(ax, xs, f.(xs), color = :blue, label = L"$f(x)=x^2-7x+6$")
# Añadimos la leyenda.
axislegend(ax)
# Mostramos la figura.
fig
using Plots, SymPy, LaTeXStrings
@syms x::real
f(x) = x^2-7x+6
# Dibujamos la región y la gráfica de la función.
plot(f, 2, 7, fillrange = 0, fillalpha = 0.3, label = L"$f(x)=x^2-7x+6$") Plots.
Y ahora calculamos el área de la región sombreada.
# Calculamos primero las raíces de la función
solve(f(x))
# Descomponemos el intervalo de integración en los subintervalos [2,6] (función negativa) y [6,7] (función positiva) y calculamos las integrales por separado
-integrate(f(x), (x, 2, 6)) + integrate(f(x), (x, 6, 7))
En general, para calcular áreas bajo una curva, es más rápido integrar el valor absoluto de la función.
integrate(abs(f(x)), (x, 2, 7))
Ejercicio 6.6 Calcular y dibujar el área comprendida entre las parábolas
Calculamos primero el área comprendida entre las dos funciones.
using Plots, SymPy, LaTeXStrings
@syms x::real
f(x) = -x^2+6x
g(x) = x^2-2x
# Calculamos primero los puntos de corte de la función.
= N.(solve(f(x)-g(x)))
a, b # Calculamos el área comprendida entre las dos funciones entre los puntos de corte.
= integrate(f(x)-g(x), (x, a, b)) sol
Y ahora dibujamos el área calculada.
using GLMakie
# Definimos un rango de valores para x.
= range(-1, 5, length=100)
xs # Definimos un rango de valores para x en el intervalo de intersección.
= range(a, b, length=100)
xs2 # Creamos la figura.
= Figure()
fig # Definimos los ejes.
= Axis(fig[1, 1])
ax # Dibujamos la región.
band!(ax, xs2, f.(xs2), g.(xs2), color = :blue, alpha = 0.3)
# Dibujamos la función.
lines!(ax, xs, f.(xs), color = :blue, label = L"$f(x)=-x^2+6x$")
!(ax, xs, g.(xs), color = :red, label = L"$g(x)=x^2-2x$")
lines# Añadimos el area calculada.
text!(2, 4, text = "$sol")
# Añadimos la leyenda.
axislegend(ax)
# Mostramos la figura.
fig
using Plots
plot!(g, a, b, fillrange = f, fillalpha = 0.3, label = "")
Plots.plot(f, -1, 5, label = L"$f(x)=-x^2+6x$")
Plots..plot!(g, label = L"$g(x)=x^2-2x$")
Plotsannotate!(2, 4, sol)
Ejercicio 6.7 Dibujar la gráfica de la función
Dibujamos primero la gráfica.
using SymPy, LaTeXStrings, GLMakie
@syms x::real
f(x) = exp(-x)
# Definimos un rango de valores para x.
= range(0, 10, length=100)
xs # Creamos la figura.
= Figure()
fig # Definimos los ejes.
= Axis(fig[1, 1])
ax # Dibujamos la región.
band!(ax, xs, f.(xs), 0, color = :blue, alpha = 0.3)
# Dibujamos la función.
lines!(ax, xs, f.(xs), color = :blue, label = L"$f(x)=e^{-x}$")
# Añadimos la leyenda.
axislegend(ax)
# Mostramos la figura.
fig
using SymPy, LaTeXStrings, Plots
@syms x::real
f(x) = exp(-x)
plot(f(x), 0, 10, fillrange = 0, fillalpha = 0.3, label = L"$f(x)=e^{-x}$") Plots.
Y ahora calculamos el área mediante la integral impropia entre
integrate(f(x), (x, 0, oo))
Ejercicio 6.8 Dibujar la región encerrada por la curvas polares
Para dibujar curvas polares se pueden definir los ejes polares con la función PolarAxis
del paquete Makie
, o bien se puede usar la función plot
del paquete Plots
con el argumento proj = :polar
.
Dibujamos primero las curvas polares.
using SymPy, GLMakie
@syms θ::real
f(θ) = 1 + cos(θ)
g(θ) = 3cos(θ)
# Generamos los valores de θ
= range(0, 2pi, 100)
θs = Figure()
fig = PolarAxis(fig[1, 1], radius_at_origin = 0)
ax lines!(ax, θs, g.(θs), label = L"g(\theta) = 3\cos(\theta)")
lines!(ax, θs, f.(θs), label = L"f(\theta) = 1 + \cos(\theta)")
fig
using SymPy, Plots
@syms θ::real
f(θ) = 1 + cos(θ)
g(θ) = 3*cos(θ)
plot(g, 0, pi, proj = :polar, label = L"g(\theta) = 3\cos(\theta)")
Plots.plot!(f, 0, 2pi, proj = :polar, label = L"f(\theta) = 1 + \cos(\theta)") Plots.
Y ahora calculamos el area encerrada entre ellas.
# Calculamos los puntos de corte de las funciones.
= solve(f(θ)-g(θ))
a, b # Ajustamos los ángulos para recorrer la región en el sentido correcto.
= b - 2pi, a
a, b # Calculamos el de la región con forma de media luna encerrada entre g y f.
= integrate(g(θ)^2/2, (θ, a, b)) - integrate(f(θ)^2/2, (θ, a, b))
area_luna # Finalmente calculamos el area de g y le restamos el área de la media luna.
N(integrate(g(θ)^2/2, (θ, 0, pi)) - area_luna)
3.9269908169872414
Ejercicio 6.9 Un vehículo se mueve con una velocidad dada por la función
Para calcular el valor medio de una función
using SymPy
@syms x::real
f(x) = sin(x)^2
1/(2*PI) * integrate(f(x), (x, 0, 2PI))
Ejercicio 6.10 Representar gráficamente la región del primer cuadrante limitada por la función
Para calcular el volumen de un sólido de revolución generado al rotar la gráfica de una función
Dibujamos primero la región.
using SymPy, Plots
@syms x::real
f(x) = sin(x)+2
plot(f, 0, 2pi, ylim=(0,3), fillrange = 0, fillalpha = 0.3, label = "") Plots.
A continuación dibujamos el sólido de revolución parametrizado en 3D.
using GLMakie
# Generamos los valores de x y θ
= range(0, 2pi, 100)
u = range(0, 2pi, 100)
θ # Generamos los valores de X, Y y Z de la superficie de revolución.
= [i for i in u, j in θ]
xs = [f(i) * cos(j) for i in u, j in θ]
ys = [f(i) * sin(j) for i in u, j in θ]
zs # Creamos la figura.
= Figure()
fig # Definimos los ejes.
= Axis3(fig[1, 1], azimuth = -pi/3, title = "Sólido de revolución", xlabel = "X", ylabel = "Y", zlabel = "Z")
ax # Dibujamos la superficie de revolución
surface!(ax, xs, ys, zs, alpha = 0.9)
Makie.# Mostamos la figura.
fig
# Generamos los valores de x y θ
= range(0, 2pi, 100)
u = range(0, 2pi, 100)
θ # Generamos los valores de X, Y y Z de la superficie de revolución.
= [i for i in u, j in θ]
xs = [f(i) * cos(j) for i in u, j in θ]
ys = [f(i) * sin(j) for i in u, j in θ]
zs # Dibujamos la superficie de revolución
surface(xs, ys, zs) Plots.
Finalmente, calculamos el volumen del sólido de revolución.
N(integrate(pi*f(x)^2, (x, 0, 2pi)))
88.82643960980423
Ejercicio 6.11 Calcular el volumen del toro que se obtiene al rotar la circunferencia de ecuación
En este caso, usaremos envoltorios cilíndricos para calcular el volumen del sólido de revolución. Para calcular el volumen del sólido de revolución que se obtiene al rotar alrededor del eje
Dibujamos primero la región.
using SymPy, Plots
@syms x::real
f(x) = sqrt(1-(x-2)^2)
plot(f(x), 0, 4, fillrange = 0, fillalpha = 0.3, aspect_ratio = 1, label = "")
Plots.plot!(-f(x), 0, 4, fillrange = 0, fillalpha = 0.3, aspect_ratio = 1, label = "") Plots.
Para el caso particular del toro, como el círculo que lo genera es simétrico con respecto al eje
2 * integrate(2PI*x*f(x), (x, 1, 3))
Ejercicio 6.12 Una empresa fabrica tejas de chapa con forma ondulada cuyo perfil viene dado por la curva
Para calcular la longitud de una curva dada por la gráfica de una función
Dibujamos primero el perfil de las chapas.
using SymPy, Plots
@syms x::real
f(x) = sin(x/2)
plot(f(x), 0, 100, aspect_ratio = 1, label = "") Plots.
using QuadGK
quadgk(sqrt(1+diff(f(x))^2), 0, 100)
(105.954416730336, 1.2200227161862642e-6)
Ejercicio 6.13 El cuerno de Gabriel es un sólido de revolución que se obtiene al rotar la función
El volumen del cuerno de Gabriel.
SoluciónCalculamos su volumen mediante discos cilíndricos transversales al eje
.using SymPy @syms x::real f(x) = 1/x integrate(PI*f(x)^2, (x, 1, oo))
Calcular la superficie del cuerno de Gabriel.
AyudaPara calcular la superficie del sólido de revolución que se obtiene al rotar la gráfica de la función
alrededor del eje en el intervalo hay que calcular la integral definidaSoluciónusing SymPy @syms x::real f(x) = 1/x integrate(2PI*f(x)*sqrt(1+diff(f(x))^2), (x, 1, oo))
Así pues, se da la paradoja de que el cuerno de Gabriel tiene un volumen finito, pero una superficie infinita.
Ejercicio 6.14 Un depósito con forma de sólido de revolución generado al rotar la gráfica de la función
Para calcular el trabajo realizado por una fuerza aplicada sobre un objeto y que provoca un desplazamiento desde
En este caso, tomando discos cilíndricos perpendiculares al eje
donde
Calculamos primero el nivel del aceite en el depósito. Para ello necesitamos el volumen contenido en el depósito hasta una altura
using SymPy
@syms x::real y::real
f(x) = x^2/2
f⁻¹(y) = solve(y-f(x), x)[2]
# Volumen hasta una altura h
V(x) = integrate(PI*f⁻¹(y)^2, (y, 0, x))
# Nivel para un volumen de 100 m³
= solve(V(x)-100)[2] nivel
Ahora calculamos el trabajo realizado al vaciar el depósito por arriba.
= 900
δ = 9.81
gravedad N(integrate(gravedad*δ*PI*f⁻¹(y)^2*(8-y), (y, 0, nivel)))
3.7423801112379064e6
Ejercicio 6.15 Dibujar la región que se obtiene con la intersección de la recta
Para calcular el centroide
Dibujamos primero la región. Para ello hay que calcular primero los puntos de corte de las dos curvas.
using SymPy, GLMakie
@syms x::real
f(x) = x-1
g(x) = (x-1)^2
# Calculo de los puntos de corte.
= float(solve(f(x)-g(x)))
a, b # Definimos un rango de valores para x.
= range(a, b, length=100)
xs # Creamos la figura.
= Figure()
fig # Definimos los ejes.
= Axis(fig[1, 1])
ax # Dibujamos la región.
band!(ax, xs, f.(xs), g.(xs), color = :blue, alpha = 0.3)
# Dibujamos la función.
lines!(ax, xs, f.(xs), color = :blue, label = L"$f(x)=-x^2+6x$")
!(ax, xs, g.(xs), color = :red, label = L"$g(x)=x^2-2x$")
lines# Añadimos la leyenda.
axislegend(ax, position = :lt)
# Mostramos la figura.
fig
using SymPy, Plots
@syms x::real
f(x) = x-1
g(x) = (x-1)^2
# Calculo de los puntos de corte.
= float(solve(f(x)-g(x)))
a, b # Dibujamos la región.
plot(g, a, b, fillrange = f, fillalpha = 0.3, label = "")
Plots.# Dibujamos la gráfica de f.
plot!(f, a, b, label = L"$f(x)=-x^2+6x$")
Plots.# Dibujamos la gráfica de g.
plot!(g, label = L"$g(x)=x^2-2x$") Plots.
Ahora calculamos el centroide de la región y lo dibujamos.
# Coordenada x del centroide.
= N(integrate(x*(f(x)-g(x)), (x, a, b)) / integrate(f(x)-g(x), (x, a, b)))
cx # Coordenada y del centroide
= 1/2 * N(integrate(f(x)^2-g(x)^2, (x, a, b)) / integrate(f(x)-g(x), (x, a, b))) cy
0.39999999999999564
scatter!(Point2(cx, cy), color = :green, markersize = 10, label = "Centroide")
Makie. fig
scatter!([cx], [cy], color = :green, label = "Centroide") Plots.
Para calcular el volumen del sólido de revolución generado al rotar esta región sobre el eje
Al rotar la región sobre el eje
2*PI*cy*integrate(f(x)-g(x), (x,a, b))
Y al rotarla sobre el eje
2*PI*cx*integrate(f(x)-g(x), (x, a, b))
6.2 Ejercicios propuestos
Ejercicio 6.16 Calcular la suma superior de Riemann de la función
Ejercicio 6.17 Calcular el area encerrada entre las funciones
Ejercicio 6.18 Dibujar la gráfica de la función
Ejercicio 6.19 Calcular el área encerrada entre las curvas polares
Ejercicio 6.20 La función
Ejercicio 6.21 Calcular el volumen del sólido de revolución generado por la rotación al rededor del eje
Calcular también el volumen del sólido de revolución generado al rotar la misma región alrededor del eje
Ejercicio 6.22 La curva
Ejercicio 6.23 Un depósito metálico tiene la forma del elipsoide que se obtiene al rotar la elipse
Ejercicio 6.24 La función de densidad del modelo de distribución de probabilidad exponencial
¿Cuál de las siguientes afirmaciones es cierta?