Mostrando entradas con la etiqueta Matemáticas. Mostrar todas las entradas
Mostrando entradas con la etiqueta Matemáticas. Mostrar todas las entradas

2015-06-16

Resolver ecuaciones de segundo grado en R

Title

Problema

Queremos resolver una ecuación de segundo grado en R: ax2 + bx + c = 0.

Solución

  1. Dos soluciones reales
  2. Números positivos dentro de la raíz cuadrada.

    2x2 + 20x + 3 = 0

    x <- 2
    y <- 20
    z <- 3
    
    x1 <- (-y + sqrt((y^2) - (4 * x * z)))/(2 * x)
    x2 <- (-y - sqrt((y^2) - (4 * x * z)))/(2 * x)
    print(c(x1, x2))
    
    No empleamos las letras a, b y c, pues c es una palabra reservada en R.

    [1] -0.1523201 -9.8476799
    
  3. Una solución real repetida
  4. Un cero y un número positivo dentro de la raíz cuadrada.

    x2 - 6x + 9 = 0

    x <- 1
    y <- -6
    z <- 9
    
    x1 <- (-y + sqrt((y^2) - (4 * x * z)))/(2 * x)
    x2 <- (-y - sqrt((y^2) - (4 * x * z)))/(2 * x)
    print(c(x1, x2))
    
    [1] 3 3
    
  5. Dos soluciones complejas
  6. Números negativos dentro de la raíz cuadrada.

    2x2 + 7x + 11 = 0

    x <- 2
    y <- 7
    z <- 11
    
    polyroot(c(z, y, x))
    
    [1] -1.75+1.561249i -1.75-1.561249i
    
    El código empleado en las dos opciones anteriores generaría un error. La función polyroot devolverá dos números complejos como la suma de un número real y uno número imaginario. También podemos emplear dicha fórmula en los casos anteriores. En dichos casos el número imaginario será 0i = 0.

    2x2 + 20x + 3 = 0

    x <- 2
    y <- 20
    z <- 3
    
    polyroot(c(z, y, x))
    
    [1] -0.1523201-0i -9.8476799+0i
    

Entradas relacionadas

2015-01-28

Ley de Benford en Ms Access

Title La ley de Benford, también conocida como la ley del primer dígito, se refiere a la frecuencia de distribución del primer dígito en muchos de los números que aparecen en la vida real. En esta distribución, el 1 aparece con una frecuencia aproximada del 30% mientras que el 9 aparece con una frecuencia menor del 5%. Por primer dígito se refiere al primer dígito no nulo o significativo.

Esta ley se puede aplicar a una gran variedad de fuentes de datos: facturas de electricidad, direcciones de calles, precios de acciones, cifras de población, tasas de mortalidad, longitud de los ríos o constantes físicas y matemáticas. Se ha aplicado en la detección de fraudes en contabilidad, resultados electorales y científicos.

Ejemplo

Queremos calcular la frecuencia relativa del campo Cargo de la tabla Pedidos de la base de datos Neptuno. El resultado final es una tabla con los dígitos, su frecuencia absoluta, el total de registros y la frecuencia porcentual.

Solución 1

En dos pasos:

  1. Consulta intermedia (qry_Total): calcula el total de registros de la tabla cuyo último dígito del campo Cargo es mayor que cero.
  2. SELECT COUNT(Pedidos.Cargo) AS Total
    FROM Pedidos
    WHERE (((Mid([Cargo],1,1))>0));
    
  3. Consulta final (qry_BenfordLaw) que calcula la frecuencia relativa usando el total de la consulta anterior.

SELECT Mid([Cargo],1,1) AS Dígito, 
COUNT(Pedidos.Cargo) AS Frecuencia, 
qry_Total.Total, 
COUNT([Pedidos]![Cargo])/[Total] AS Porcentaje
FROM Pedidos, qry_Total
GROUP BY Mid([Cargo],1,1), qry_Total.Total
HAVING (((Mid([Cargo],1,1))>0));

Solución 2

Creando una subconsulta evitando la consulta intermedia.

SELECT Mid([Cargo],1,1) AS Dígito, 
COUNT(Pedidos.Cargo) AS Frecuencia, 
(select count([Cargo]) FROM Pedidos WHERE (((Mid([Cargo],1,1))>0))) AS Total, 
Count([Pedidos]![Cargo])/[Total] AS Porcentaje
FROM Pedidos
GROUP BY Mid([Cargo],1,1)
HAVING (((Mid([Cargo],1,1))>0));
La subconsulta es idéntica a la consulta intermedia (qry_Total) que realizamos en la solución 1.

(SELECT COUNT([Cargo]) FROM Pedidos WHERE (((Mid([Cargo],1,1))>0))) AS Total

Referencias

2014-10-11

Ley de Benford en R

Title La ley de Benford, también conocida como la ley del primer dígito, se refiere a la frecuencia de distribución del primer dígito en muchos de los números que aparecen en la vida real. En esta distribución, el 1 aparece con una frecuencia aproximada del 30% mientras que el 9 aparece con una frecuencia menor del 5%. Por primer dígito se refiere al primer dígito no nulo o significativo.

Esta ley se puede aplicar a una gran variedad de fuentes de datos: facturas de electricidad, direcciones de calles, precios de acciones, cifras de población, tasas de mortalidad, longitud de los ríos o constantes físicas y matemáticas. Se ha aplicado en la detección de fraudes en contabilidad, resultados electorales y científicos.

Distribución

En R, al igual que hicimos en Excel, podemos calcular la tabla con la probabilidad para cada dígito. En R, al contrario de Excel, log calcula por defecto el logaritmo natural. Para calcular el logaritmo en base 10, necesitamos especificar la base o usar la función log10.

benford <- log10(1+1/(1:9)) # O log(1+1/(1:9), base = 10)
data.frame(benford)
     benford
1 0.30103000
2 0.17609126
3 0.12493874
4 0.09691001
5 0.07918125
6 0.06694679
7 0.05799195
8 0.05115252
9 0.04575749 
sum(benford) # Comprobamos que suma 1
[1] 1

Gráficos

Si representamos el vector sin ningún tipo de argumento, obtenemos el siguiente gráfico de barras.

barplot(benford)
Buscamos un formato similar al creado en la entrada ley de Benford en Excel. Formateamos el gráfico suministrando los argumentos necesarios.

barplot(rev(benford*100), # Revierte el orden
        las = 1, # Etiquetas del eje horizontales 
        main = "Ley de Benford",
        xlab = "%",
        ylab = "Dígitos",
        names.arg = c(9:1), # Dígitos orden inverso 
        horiz = TRUE,       # Barras horizontales
        col = "steelblue", 
        border = "white", 
        xlim = c(0, 35))    # Amplia el máximo de la escala                                                                                          
grid(ny = 0) # Líneas de división

Referencias:

?log
?barplot
Bendford's law, mathematical statement
Benford law and lognormal distributions

Entradas relacionadas:
Ley de Benford en Excel
Distribución de frecuencias en Ms Excel

2014-09-10

Ley de Benford en Excel

Title La ley de Benford, también conocida como la ley del primer dígito, se refiere a la frecuencia de distribución del primer dígito en muchos de los números que aparecen en la vida real. En esta distribución, el 1 aparece con una frecuencia aproximada del 30% mientras que el 9 aparece con una frecuencia menor del 5%. Por primer dígito se refiere al primer dígito no nulo o significativo.

Esta ley se puede aplicar a una gran variedad de fuentes de datos: facturas de electricidad, direcciones de calles, precios de acciones, cifras de población, tasas de mortalidad, longitud de los ríos o constantes físicas y matemáticas. Se ha aplicado en la detección de fraudes en contabilidad, resultados electorales y científicos.

Gráficos convencionales

En Excel elaboramos el siguiente gráfico de barras, donde d es el dígito y P(d) la probabilidad de ocurrencia del mismo. Para calcular P(d), asumiendo que el 1 está en la celda A2, escribimos en B2 la fórmula =LOG(1+1/A2) y arrastramos el controlador de relleno hacia abajo.

Minigráficos

En Excel 2013, también podemos utilizar la herramienta Analizar los datos al instante y añadir un gráfico en miniatura.

Para ello, debemos transponer los datos de la tabla, seleccionar las celdas que contienen los datos y hacer clic en el botón Análisis rápido.

Como se puede apreciar el gráfico creado es demasiado pequeño en este caso. Para ampliarlo lo arrastramos a otra celda y cambiamos el ancho y alto de la celda.

Si necesitamos calcular la frecuencia de ocurrencias de unos datos:

1. Extraemos el primer dígito empezando por la izquierda: =IZQUIERDA(A1;1)
2. Creamos la tabla de frecuencias usando la fórmula matricial FRECUENCIA. En el argumento datos incluimos el rango con el primer dígito y en grupos los dígitos del 1 al 9.

Entradas relacionadas

2014-04-09

Sucesión de Fibonacci en R

Title Para calcular números de la secuencia de Fibonacci en R, he empleado el código de Neha Pandey

fib <- function(n) {
    a = 0
    b = 1
    for (i in 1:n) {
        tmp = b
        b = a
        a = a + tmp
    }
    return(a)
}
print(fib(79), digits=20)
Sin embargo, si el número sobrepasa los 16 dígitos, de fib(79) en adelante, obtenemos resultados imprecisos. Por ejemplo: fib(79) = 14472334024676220 cuando el resultado correcto es: fib(79) = 14472334024676221.

fib(77) = 5527939700884757 16 dígitos
+
fib(78) = 8944394323791464 16 dígitos
=
fib(79) = 14472334024676221 17 dígitos

Esto es debido a que R almacena los números como números de doble precisión. Una precisión de 53 bits (16 dígitos decimales significativos aproximadamente.

Resolvemos el problema usando el paquete gmp (Multiple Precision Arithmetic). Específicamente la función add.bigz, con la que sumamos bigz (Large Sized Integer Values) números enteros muy grandes.

install.packages("gmp")
require(gmp)
fib <- function(n) {
    a = 0
    b = 1
    for (i in 1:n) {
        tmp = b
        b = a
        a = add.bigz(a, tmp)  # gmp function
    }
    return(a)
}
fib(79)
Así calculamos correctamente números de más de 16 dígitos. He comprobado los resultados para números mucho más largos fib(25000), 5225 dígitos, y los resultados parecen ser precisos hasta el último dígito.

R al igual que otros lenguajes tiene limitaciones internas. Aunque en la práctica es poco probable que topemos con ellas, es útil tenerlas presentes y, si es posible, ser capaces de sobrepasarlas. En este caso, ya sabemos como sortear la limitación en la precisión de los cálculos más allá de los 16 dígitos con el paquete gmp.

Referencias:

Double-precision floating-point format
R Accuracy
?double en la consola de R

Entradas relacionadas:
Sucesión de Fibonacci en Excel y VBA

2014-04-06

Sucesión de Fibonacci en Excel y VBA

Title La sucesión de Fibonacci es una sucesión infinita en la que los dos primeros elementos son 0 y 1, y los siguientes términos son la suma de los dos anteriores:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377...

En Excel podemos generar la sucesión mediante fórmulas. Sumamos los dos primeros elementos y arrastramos el controlador de relleno.

Sin embargo, como el elemento 74, fib(74) = 1304969544928657, excede los 15 dígitos, Excel devuelve un número incorrecto: 1304969544928660.

Microsoft Excel admite un máximo de 15 dígitos significativos en todo momento. Este límite se aplica a un valor que se calcula mediante una fórmula. Debido a esta limitación, en cualquier momento una fórmula calcula un valor que supere los 15 dígitos de longitud, dígitos más allá el decimoquinto dígito significativo se cambian a ceros.

Función

Para resolver este comportamiento recurrimos a VBA. Traté con el código publicado en rosettacode.org. Pero fib(46) provoca un desbordamiento. Además, provocaría siempre el desbordamiento un término antes del máximo posible porque calcula el próximo nº Fibonacci un término antes de lo necesario, .

'Desbordamiento en fib(46)
Public Function Fib(n As Integer) As Long
    Dim fib0, fib1, sum As Long
    Dim i As Integer
    fib0 = 0
    fib1 = 1
    For i = 1 To n
        sum = fib0 + fib1 'Calcula nº siguiente antes de tiempo
        fib0 = fib1
        fib1 = sum
    Next
    Fib = fib0
End Function
Finalmente, ver notas abajo, modificando este código consigo calcular hasta fib(139) sin desbordamiento.

'Desbordamiento en fib(139)
Public Function Fibonacci(ByVal n As Long)
    Dim i As Long
    Dim a As Variant, b As Variant, tmp As Variant
    a = 0
    b = 1
    For i = 1 To n
        tmp = b
        b = a
        a = CDec(a + tmp) 'Conversión de Variant a Decimal
    Next
    Fibonacci = CStr(a) 'Mostrar todos los dígitos como texto
End Function

Subrutina

A continuación transformamos la función definida por el usuario (FDU) anterior en subrutina. En el cuadro de diálogo escribimos el número Fibonacci que queremos calcular.

'Desbordamiento en fib(139)
Sub Secuencia_Fibonacci()
    n = VBA.InputBox("Número de la serie Fibonacci a calcular. Máx. 139.")
    Dim i As Long
    Dim a As Variant, b As Variant, tmp As Variant
    a = 0
    b = 1
    For i = 1 To n
        tmp = b
        b = a
        a = CDec(a + tmp) 
    Next
    MsgBox "Fib(" & n & ")= " & a, vbInformation 
End Sub
End Sub

Notas

Necesitamos forzar la conversión del resultado a = CDec(a + tmp) con CDec de Variant a Decimal (28 dígitos). De esta manera, evitamos que VBA pierda la precisión necesaria y redondee a 15 dígitos a partir de fib(74) = 1,30496954492866E+15 en lugar de 1304969544928657 (16 dígitos). No podemos declarar las variables como Decimal directamente. Debemos definirlas como Variant y luego asignarles el tipo Decimal. Finalmente, convertimos el resultado de la función en texto con CStr para que Excel conserve todos los dígitos en las celdas y no vuelva redondear a 15 dígitos.

En cualquier caso, el término máximo de la sucesión Fibonacci que Excel puede calcular es el 139. Pues fib(140) = 81055900096023504197206408605 excede el valor máximo que Excel puede usar: 79228162514264337593543950335.

Referencias:

Límite de 15 dígitos.
Definir variable como Decimal.
Calculadora de sucesión de Fibonacci

Entradas relacionadas:
Sucesión de Fibonacci en R

Nube de datos