top of page

PRÁCTICA 7: 

Integración numérica en R

EJERCICIO 1

Primera parte

prac 7 1.jpg

SOLUCIÓN:

Captura de pantalla 2021-01-01 a las 16.

SOLUCIÓN:

par(mfrow=c(2,1))

x=seq(A,B,0.01)

plot(x,d(x[1:length(x)]),xlim=c(A,B),ylim=c(0,8),xlab='x',ylab='rho')

par(new='TRUE')

plot(T,d(T[1:length(T)]),xlim=c(A,B),ylim=c(0,8),type='h',col='green',xlab='',ylab='')

d=function(x){exp(x)*sin(x)}

Simpson=function(h,n,T,A,B){

s1=0

s2=0

i=1

while(i<=(n-1)){

s1=s1+d(T[i])

i=i+1

}

i=2

while(i<=(n-1)){

s2=s2+d((T[i]+T[i+1])/2)

i=i+1

}

Mab=((h/6)*(d(A)+2*s1+4*s2+d(B)))

return(Mab)

}

A=0

B=3.05

n=35

h=(B-A)/(n-1)

T=0

for(j in 1:n){

T[j]=A+(j-1)*h

}

Masa=Simpson(h,n,T,A,B)

Masa

¡¡CUIDADO!!

ERRORES COMUNES:

   -Poner length mal, poniendo lenght

   -Olvidar poner los paréntesis en el bucle for 1: (n-1)

   -El signo de la multiplicación exp(x)*sin(x)

   -No dar nombre a la función para que pueda escribirse 

   -Poner los datos justo antes de llamar a la función

Segunda parte

prac 7 3.jpg

SOLUCIÓN:

num_puntos=1000

AA=0

BB=7.4

ss=runif(num_puntos,A,B)

ff=runif(num_puntos,AA,BB)

puntos_dentro=0

puntos_fuera=0

color=0

for(i in 1:num_puntos){

if(ff[i]<=d(ss[i])){

puntos_dentro=puntos_dentro+1

color[i]='blue'

} else {

puntos_fuera=puntos_fuera+1

color[i]='orange'

    }

}

¡¡CUIDADO!!

ERRORES COMUNES:

Captura de pantalla 2020-12-21 a las 21.

   -Para dar valores aleatorios se utiliza el comando runif, no utilizar seq

   -Confundir la i con 1

SOLUCIÓN:

plot(ss,ff,xlim=c(A,B),ylim=c(AA,BB),col=color,xlab='x',ylab='Densidad')

par(new='TRUE')

ss=seq(A,B,0.001)

plot(ss,d(ss[1:length(ss)]),type='l',col='dark green',xlim=c(A,B),ylim=c(AA,BB),xlab='',ylab='')

prac 7.png

SOLUCIÓN:

Area=puntos_dentro/num_puntos*B*BB

Vexact=11.97907159

ErrorM=(Area-Vexact)/Vexact

ErrorS=(Masa-Vexact)/Vexact

Metodo=c('Valor exacto','Simpson','Montecarlo')

Valores=c(Vexact,Masa,Area)

Error_Relativo=c(0,round(ErrorS,7),round(ErrorM,7))

data.frame(Metodo,Valores,Error_Relativo)

Captura.PNG

Otra idea:

Haciendo unos cambios al código podemos ver como la naturaleza azarosa del método de montecarlo tiene su impacto en el cálculo de error según se aumenta el número de puntos:

d=function(x){

  v=exp(x)*sin(x)

  return(v)

}

simpson=function(a,b,d,t){

  h=(b-a)/(length(t)-1)

  s1=0

  s2=0

  

  for (i in 2:(length(t)-1)){

    s1=s1+d(t[i])

  }

  for (i in 1:(length(t)-1)){

    s2=s2+d((t[i]+t[i+1])/2)

  }

  masatotal=(h/6)*(d(a)+2*s1+4*s2+d(b))

  return(masatotal)

}

num=10

a=0

b=3.05

t=seq(0,3.05,length = 35)

simpson=simpson(0,3.05,d,t)

par(mfrow=c(4,3))

x=seq(a,b,0.001)

plot(x,d(x),xlim=c(a,b),ylim=c(0,8),xlab='x',ylab='Densidad',type = 'l')

par(new='TRUE')

plot(t,d(t),xlim=c(a,b),ylim=c(0,8),type='h',col='green',xlab='',ylab='')

area=c(0)

for (j in 1:num) {

  npuntos=1000*(j)^2

  aa=0

  bb=7.4

  ss=runif(npuntos,a,b)

  ff=runif(npuntos,aa,bb)

  pdentro=0

  pfuera=0

  col=0

  for (i in 1:npuntos) {

    if(ff[i]<=d(ss[i])){

      pdentro=pdentro+1

      col[i]='blue'

    }

    else{

      pfuera=pfuera+1

      col[i]='orange'

    }

  }

  plot(ss,ff,xlim=c(a,b),ylim=c(aa,bb),col=col,ylab='Densidad',xlab='x')

  par(new='TRUE')

  xx=seq(a,b,0.001)

  plot(xx,d(xx),type='l',col='dark green',xlim=c(a,b),ylim=c(aa,bb),xlab='',ylab='')

  area[j]=(pdentro/(npuntos))*b*bb

}

vexacto=11.97907159

em=((area-vexacto)/vexacto)

es=((simpson-vexacto)/vexacto)

metodo=c('valor exacto','simpson','montecarlo1','montecarlo2','montecarlo3','montecarlo4','montecarlo5','montecarlo6','montecarlo7','montecarlo8','montecarlo9','montecarlo10')

valores=c(vexacto,simpson,area)

erelativo=c(0,es,em)

data.frame(metodo,valores,erelativo)

La tabla quedaría:

         metodo  valores     erelativo

1  valor exacto 11.97907  0.000000e+00

2       simpson 11.97907 -9.019708e-08

3   montecarlo1 12.54892  4.757033e-02

4   montecarlo2 12.08623  8.945886e-03

5   montecarlo3 12.05990  6.747747e-03

6   montecarlo4 11.96492 -1.181255e-03

7   montecarlo5 11.99641  1.447091e-03

8   montecarlo6 11.95959 -1.626117e-03

9   montecarlo7 11.95657 -1.878187e-03

10  montecarlo8 12.01923  3.352407e-03

11  montecarlo9 11.97910  2.134597e-06

12 montecarlo10 12.02123  3.519623e-03

Captura2.PNG

EJERCICIO 2

prac 7 4.jpg

SOLUCIÓN:

t=seq(0,3,length = 120)

y=c(0)

w=c(0)

y[1]=2

w[1]=2

r=2

k=1

h=(3/length(t))

 

f=function(r,k,t,y){

  v=r*y*(1-(y/k))

  return(v)

}

for (i in 1:(length(t)-1)) {

  y[i+1]=y[i]+h*f(r,k,t[i],y[i])

  z=w[i]+h*f(r,k,t[i],w[i])

  w[i+1]=w[i]+(h/2)*(f(r,k,t[i],w[i])+f(r,k,t[i+1],z))

}

exacta=function(t){

  (2*k)/(2+exp(-r*t)*k-2*exp(-r*t))

}


 

tt=seq(0,3, length=10000)

plot(tt,exacta(tt),type='l', col='blue')

par(new='TRUE')

plot(t,y,col='green',xlab='',ylab='')

par(new='TRUE')

plot(t,w,col='red',xlab='',ylab='')

¡¡CUIDADO!!

ERRORES COMUNES:

   -No cerrar las llaves y paréntesis

   -Poner plot=() y par=() cuando no se pone el igual

   -Confundir . y ,

   -Olvidarse de poner las componentes del vector [i]

Captura3.PNG

Explicación en vídeo:

Para más información se puede acceder al repositorio a través del enlace

* DESCARGA AQUÍ EL DOCUMENTO CON LA PRÁCTICA 7 RESUELTA

Fuentes: Logo diseñado por una integrante de nuestro grupo, las imágenes de fondo han sido encontradas en la plataforma que nos proporcionó nuestro profesor y en la galería de wix, los enunciados de ejercicios son capturas de nuestros apuntes

©2020 por Grupo T12, programación.

bottom of page