Cálculo de probabilidades y combinatorias por línea de comandos

Linux Recipes

Mediante la herramienta “bc” es posible contar con un poderosa calculadora desde la línea de comandos en Linux, con la que podemos realizar complejos cálculos de probabilidades. Esta Calculadora nos permite trabajar con precisión infinita en diversas bases, incluso podemos predefinir funciones para el calculo de combinatorias y funciones de probabilidad para las variables aleatorias con nombre propio, y esta es, precisamente, la razón de este post.

José R Sosa https://josersosa.github.io/personalweb/
08-30-2011

El comando “bc”

Para llamar a la aplicación bc escribimos desde la consola la siguiente instrucción:

$ bc -il 

Con esta sentencia convocamos nuestra calculadora en modo interactivo (-i) y enlazando la librería matemática (-l)

Para obtener la lista completa de parámetros de esta aplicación, la ejecutamos:

$ bc --help
usage: bc [options] [file ...]
  -h  --help         print this usage and exit
  -i  --interactive  force interactive mode
  -l  --mathlib      use the predefined math routines
  -q  --quiet        do not print initial banner
  -s  --standard     non-standard bc constructs are errors
  -w  --warn         warn about non-standard bc constructs
  -v  --version      print version information and exit

Si queremos incluir cálculos matemáticos dentro de un script de Linux es necesario pasar las formulas al comando bc, para eso podemos usar un pipeline, así:

#!/bin/bash 
echo 'scale=4; 10/3' | bc -l

Cálculo de combinatorias y probabilidades

Para incorporar las funciones de cálculo de combinatorias debemos definir las correspondientes funciones en el ambiente de bc, también podemos pre-cargarlas a través de un archivo donde ya estén estas codificadas. Yo he preparado una versión de este archivo, que he llamado bc_defines.bc que pueden descargar de este enlace.

Aquí el contenido de este archivo:

pi = 4*a(1)
nep = e(1)
define fact (x) {
  if (x <= 1) return (1);
  return (fact(x-1) * x);
  }
define comb (n,x) {
  return fact(n)/(fact(n-x)*fact(x))
  }
define poisson (s,x) {
  return e(-s)*s^x/fact(x)
  }
define apoisson (s,x) { suma=0; for (i=0;i<=x;i++){ suma=suma+poisson(s,i)}; return suma}

define binomial (n,p,x) {
  return comb(n,x)*p^x*(1-p)^(n-x)
  }
define abinomial (n,p,x) { suma=0; for (i=0;i<=x;i++){ suma=suma+binomial(n,p,i)}; return suma}

define geometrica (p,x) {
  return p*(1-p)^x
  }
define ageometrica (p,x) { suma=0; for (i=0;i<=x;i++){ suma=suma+geometrica(p,i)}; return suma}

define binomialneg (n,p,x) {
  return comb(n+x-1,x)*p^n*(1-p)^x
  }
define abinomialneg (n,p,x) { suma=0; for (i=0;i<=x;i++){ suma=suma+binomialneg(n,p,i)}; return suma}

define hipergeometrica (n,m,k,x) {
  return comb(m,x)*comb(k,n-x)/comb(m+k,n)
  }
define ahipergeometrica (n,m,p,x) { suma=0; for (i=0;i<=x;i++){ suma=suma+hipergeometrica(n,m,p,i)}; return suma}

Para ejecutar bc con las funciones que predefinimos escribimos:

$ bc -il bc_defines.bc

En el, se implementan una serie de funciones que describo a continuación:

Referencias

Espero que les sirva…

Corrections

If you see mistakes or want to suggest changes, please create an issue on the source repository.

Citation

For attribution, please cite this work as

Sosa (2011, Aug. 30). Blog de José R Sosa: Cálculo de probabilidades y combinatorias por línea de comandos. Retrieved from https://josersosa.github.io/personalweb/posts/2021-05-09-calculo-de-probabilidades-y-combinatorias-en-linea-de-comandos/

BibTeX citation

@misc{sosa2011cálculo,
  author = {Sosa, José R},
  title = {Blog de José R Sosa: Cálculo de probabilidades y combinatorias por línea de comandos},
  url = {https://josersosa.github.io/personalweb/posts/2021-05-09-calculo-de-probabilidades-y-combinatorias-en-linea-de-comandos/},
  year = {2011}
}