viernes, 17 de octubre de 2008

El R como herramienta de trabajo

El R (http://www.r-project.org/) es un leguaje de programación de alto nivel muy útil y de una potencia extraordinaria. Aunque fue desarrollado para el cálculo estadístico (para lo cual es la mejor herramienta que haya conocido) tiene funcionalidades que superan ampliamente esos objetivos.
Una de las particularidades más sobresalientes es que, al ser GNU se crean y comparten librerías para las aplicaciones más diversas y específicas, estando más cerca linguísticamente hablando de nuestras aplicaciones en ingeniería. Además tiene soporte y librerías especializadas para ayudarnos a documentar nuestros desarrollos como comúnmente ocurre en los proyectos GNU.

Adjunto un código muy sencillo para el cálculo de propagación de errores y el cálculo de superficies y errores asociados en polígonos medidos con GPS. Se puede ver la sencillez para la definición de funciones y acceso a los resultados de las mismas.

Copiando lo que se encuentra entre "###" al panel interactivo del R se cargan las funciones definidas y se las puede probar con ejemplos propios.
###
# Copyright © 2008 Sergio Roldán
# Esta biblioteca es software libre, puede redistribuir-
# la o modificarla según los términos de la GNU
# Licencia Pública General, publicada por la Free
# Software Foundation; ya sea en su versión 3 o en cualquier versión posterior.
# Esta biblioteca se distribuye con la intención de que
# sea usada, sin embargo no TIENE GARANTÍA; incluídas
# la garantías de comerciabilidad y conveniencia para un
# propósito particular. Véase GNU Licencia Pública
# General para más detallles. (www.gnu.org/licenses/gpl.txt)
#
# Sergio Roldán
# roldan.sergio@gmail.com
# Cervantes (N) 126- G4300CAD- La Banda
# Santiago del Estero

#PROPAGACION DE ERRORES
error.sum<-function (a,b,ea,eb) {
#error.sum(a,b,ea,eb)
#ea,eb error absoluto respectivos
Eabs<-sqrt((ea/a)^2+(eb/b)^2);
return(Eabs)
}

error.prod<-function (a,b,ea,eb,div=1) {
#error.prod(a,b,ea,eb,div=[1][-1])
#ea,eb error absoluto respectivos
# div: 1 producto (a*b) -1 division (a/b)
#valor vector ( {[a*b][a/b]} Eabs Emin Emax)
if ((div!=1)&(div!=(-1))) stop("Parámetro div debe ser 1 o -1");
if ((div==(-1))&(b==0)) stop("Indeterminada!!!, denominador debe ser !=0");
Erel<-sqrt((ea/a)^2+(eb/b)^2);
res<-a*b^(div);
return(matrix(c(res,Eabs<-Erel*res,res-Eabs,res+Eabs),ncol=4))
}

Superficies<-function(vect,RMS){
# vect: matriz de 2 vectores de n elementos conteniendo las coordenadas X e Y de los vértices, sin repetitiendo el primer y último vértice
n<-(dim(vect))[1]
S<-0
Se<-0
P<-0
exis<-vect[,1]
yes<-vect[,2]
medX<-mean(exis)
medY<-mean(yes)
for (i in 2:n) {Se<-Se+(4*(exis[i]-exis[i-1])^2+((yes[i]-medY)+(yes[i-1]-medY))^2)}
for (i in 2:n) {S<-S+(0.5*((yes[i]-medY)+(yes[i-1]-medY))*(exis[i]-exis[i-1]))}
for (i in 2:n) {P<-P+sqrt((yes[i]-yes[i-1])^2+(exis[i]-exis[i-1])^2)}
Ep<-2*sqrt((n-1)*RMS)
Es<-sqrt(2)*RMS*sqrt(Se)/2
S<-abs(S)
return(list(Sup=S,ErrorSup=Es,NroVertices=n-1,Perim=P,ErrorPer=Ep))
}

#definición de un polígono de ejemplo
vect1<-t(matrix(c(2453533,6565046,2453525,6565032,2453514,6565034,2453485,6565045,
2453452,6565071,2453407,6565098,2453382,6565124,2453374,6565139,2453395,6565165,2453403,
6565170,2453421,6565213,2453414,6565257,2453428,6565275,2453438,6565268,2453438,6565244,
2453442,6565209,2453431,6565183,2453437,6565168,2453444,6565164,2453470,6565176,2453474,
6565180,2453533,6565046),nrow=2))
#Aplicacion de la funcion definida "Superficies"
eje1<-Superficies(vect1,15)
#acceso a los resultados
eje1
#calculo con los resultados
#error relativo en superficie
eje1$ErrorSup/eje1$Sup
#error relativo de perímetro
eje1$ErrorPer/eje1$Perim
###

0 comentarios:

Publicar un comentario

Suscribirse a Enviar comentarios [Atom]

<< Inicio

Búsqueda personalizada