Java
Libreras Externas
Librera: Commons math
Uso: Nmeros complejos
I3TzShadow 1
La librera Commons math de apache incluye diversas funciones
matemticas ocupadas habitualmente y que no vienen definidas
en la paquetera de java.
Se descarga desde esta liga:
http://commons.apache.org/proper/commons-math/index.html
Versin utilizada en el desarrollo de este documento: Commons
Math 3.6.1
Para este documento se explicara solamente las funciones mas
usadas que involucran nmeros complejos, y vienen incluidas
dentro de esta librera.
I3TzShadow 2
Para este tutorial se utilizo la versin de Java 1.8.0.112 (tanto
JRE como JSE) para correr los programas.
Se utilizo el IDE Eclipse para compilar y crear las clases.
Para agregar la librera commons-math3-3.6.1 a nuestro
proyecto se tienen 2 formas
La primera es colocarla en la carpeta:
C:\Program Files\Java\jre1.8.0_112\lib\ext
Despus de colocarlo en esa ruta, abrir el programa y al crear
un nuevo proyecto asegurarnos en darle clic en:
I3TzShadow 3
La otra forma es crear el proyecto habitualmente usando
cualquier opcin:
Despus dar clic derecho sobre:
Y seleccionamos la siguiente opcin:
I3TzShadow 4
Se abre una nueva ventana y hay que asegurarnos que se
este en el apartado de: Java Build Path.
Despus seleccionar la pestaa: Libraries.
Y por ultimo dar clic en: Add External JARs
Buscamos el archivo *.jar que deseemos agregar, en este caso
la librera de commons math
Una vez seleccionada, damos clic en: Apply
Por ultimo en: Ok
Y veremos que en nuestro proyecto se crea una nueva biblioteca
de libreras, donde se mostraran las libreras que agreguemos de
forma externa:
I3TzShadow 5
I3TzShadow 6
Creamos la clase donde usaremos los nmeros complejos,
importamos la librera commons math para poder hacer uso de
los nmeros complejos as como diversas operaciones.
import org.apache.commons.math3.complex.*;
Para crear un nuevo numero complejo hacemos uso del constructor
de la clase Complex:
Complex nombre_variable = new Complex(real,imaginario);
Donde observamos que en el constructor primero se ingresa la
parte real y despus la parte imaginaria, ambas entradas son de
tipo Doble.
I3TzShadow 7
Creamos clase NumerosComplejos, y creamos el numero complejo c1 =
-31.1 + 41.4i y lo mostramos en pantalla:
Y al correrlo obtenemos:
Para darle formato a la salida hacemos uso de la clase ComplexFormat,
que sirve para darle formato a la salida de nmeros complejos y quede:
a+bi.
I3TzShadow 8
Creamos el objeto para darle formato a nuestro texto de salida:
Y se lo aplicamos a la variable compleja para que obtenga su
formato de salida con:
El programa nos queda de la siguiente forma:
I3TzShadow 9
Y obtenemos esta salida:
Donde la primera lnea es sin el formato, y la segunda lnea ya
tiene el formato aplicado de forma binomial.
Creamos otro numero complejo c2 = 5.4- 6.3i, para poder realizar
las operaciones bsicas de suma, resta, multiplicacin y divisin.
I3TzShadow 10
Para la suma se usa la funcin add de la siguiente forma:
complejo_1.add(complejo_2) = complejo_1+complejo_2
Para la resta se usa la funcin subtract de la siguiente forma:
complejo_1. subtract(complejo_2) = complejo_1-complejo_2
Para la multiplicacin se usa la funcin multiply de la siguiente forma:
complejo_1. multiply(complejo_2) = complejo_1*complejo_2
Para la divisin se usa la funcin divide de la siguiente forma:
complejo_1.divide(complejo_2) = complejo_1/complejo_2
Todas estas funciones generan un nuevo numero complejo por lo cual es
necesario crear nuevas variables complejas para almacenar los
resultados.
I3TzShadow 11
Se agregan las
operaciones al
cdigo e
imprimimos
los resultados en
pantalla por
medio del
formateador (sal):
I3TzShadow 12
Obteniendo los siguientes resultados en pantalla
Otra funcin importante usada en los nmeros complejos es el
pasar de forma cuadrtica (a + bi) a forma polar (r ) donde se
obtiene una magnitud(r) y un ngulo ().
Tambin se incluye la forma para pasar de un numero en forma
polar, a un numero en forma cuadrtica.
I3TzShadow 13
Para obtener magnitud y ngulo, haremos uso de 2 funciones:
abs() para obtener la magnitud, y getArgument() para obtener el
ngulo en radianes. Usamos el numero c1 para mostrar su
funcionamiento mediante la implementacin del siguiente cdigo:
Estas funciones regresan una variable tipo Doble, por lo que ser
necesario crear una variable del mismo tipo para guardar el
resultado, en este cdigo se usan las variables: r para guardar la
magnitud y theta para guardar el ngulo.
En nuestro cdigo adems agregaremos una impresin de pantalla
de los resultados
I3TzShadow 14
I3TzShadow 15
Y se obtienen los siguientes resultados.
Ahora para crear un numero complejo a partir de su magnitud y
ngulo(en radianes) hacemos uso de la funcin
polar2Complex(magnitud, ngulo). Y debido a que esta funcin
crea un numero complejo es necesario crear una variable de tipo
compleja para guardar el resultado, usaremos los valores de
magnitud y ngulo(en radianes) obtenidos en c1 para obtener un
numero complejo, el cdigo queda de la siguiente forma:
Y
Cualquiera de las 2 formas es valida y para comprobarlo se
implemento el siguiente cdigo:
I3TzShadow 16
I3TzShadow 17
Y se obtuvieron los siguientes resultados:
Aqu se observa el error en la conversin es muy pequeo, pero si
llega a tener repercusiones a lo largo de diferentes operaciones,
en cambio al mostrarlo en pantalla el resultado pareciera que se
convirti de forma correcta.
I3TzShadow 18
Invertir un numero complejo infinito.
Java permite crear variables numricas de tipo real(positiva o
negativa) con un valor infinito y al hacer el inverso de dicho
valor se obtiene el cero. Como se muestra en el siguiente cdigo
continuacin:
I3TzShadow 19
Y se obtienen los siguientes resultados:
Donde se observa que Java, reconoce que la divisin de 1 entre un
numero muy grande(infinito) es igual a cero.
Esta librera tambin permite el manejo de nmeros infinitos as
como su inversin.
I3TzShadow 20
Para crear un numero complejo, con esta librera, se puede hacer de
2 formas distintas:
La primera es creando 1 variable real de valor infinito(positivo o
negativo), y crear el numero complejo a travs de su constructor.
La segunda es crear un objeto a partir de la funcin (INF) que ya
viene incluida en la librera.
Usando los siguientes cdigos:
La funcin Complex.INF crea el numero complejo infinito de
valor positivo.
No existe problema con el singo del infinito(positivo, negativo) si
creamos un numero complejo mediante la primera forma
I3TzShadow 21
Para la inversin de un numero (x) en general se tienen 2 formas:
La primera que es dividir 1 entre el numero que queremos
invertir. (1/x)
La segunda es elevar a la potencia -1 el numero que
queremos invertir. (x-1)
Aunque conceptualmente es lo mismo, se tienen en esta librera
tiene 3 formas de hacer esta inversin:
Con la divisin
Con la funcin reciproco
Con el exponente (caso especial)
A continuacin se explica como hacer uso de cada uno de ellos.
I3TzShadow 22
Para hacer la inversin de un numero mediante la divisin (1/x) es
necesario crear un numero complejo con el valor 1 en la parte
real, esto es debido a que la funcin divide solo acepta nmeros
complejos en el numerador, en cambio en el denominador acepta
nmeros complejos o reales.
La creacin de este numerador puede ser de 2 formas:
Usando la funcin ONE incluida en el paquete Complex
Creando un numero complejo desde el constructor
En cdigo seria:
I3TzShadow 23
Ahora simplemente hacemos la divisin de nuestro numerador(1+0i)
y el denominador que es el numero complejo infinito.
A continuacin se muestra todas las combinaciones entre las formas
de crear el numerador y el denominador:
Y se imprimen los 4 resultados en pantalla:
Se observa que de las 4 formas se obtiene el mismo valor de cero.
I3TzShadow 24
Recordemos que:
El Reciproco de un numero es otro que, al multiplicarlo por el original sea igual a la
unidad.
Para obtener dicho numero basta con dividir 1 sobre el numero del cual
quisiramos saber su reciproco.
Este mtodo nos genera un nuevo numero complejo, por lo cual ser
necesario crear una nueva variable de tipo compleja en donde guardarla.
Invertimos el numero complejo cinf_1 mediante la funcin reciprocal()
con el siguiente cdigo y obtenemos el resultado en pantalla:
I3TzShadow 25
La funcin pow(), dentro de esta librera, nos permite elevar un
numero complejo a una potencia real o una potencia compleja.
El cdigo se implementa de la siguiente forma:
complejo_1.pow(complejo_2) = (complejo_1)complejo_2
O bien
complejo_1.pow(real) = (complejo_1)real
El resultado ser un numero complejo por lo cual ser necesario
crear una variable de tipo complejo para almacenar el resultado.
Para invertir un numero complejo de valor infinito se tiene un caso
especial con este mtodo, el cual se muestra a continuacin:
I3TzShadow 26
Para invertir el numero complejo c3= 15-0.3i, hacemos uso del
real -1 el cual guardaremos en una variable (inv) de tipo doble y
mostramos el resultado en pantalla:
Y se obtiene:
Ahora usaremos este mismo cdigo para invertir un numero
complejo infinito:
Y se obtiene
I3TzShadow 27
Donde el elemento NaN(Not a Number) nos da a entender que el
resultado obtenido en esa operacin no es un numero por lo
cual, laso operaciones subsecuentes donde se utilice este
elemento siempre darn como resultado un NaN.
Otro caso especial, para esta librera, es el manejo del cero
complejo (0 + 0i).
Este numero al igual que el infinito se puede crear de ambas
formas, definiendo una variable real (Doble) con valor cero, o
usando la funcin ZERO dentro de la librera.
I3TzShadow 28
Aplicamos las mismas operaciones que en el caso de los
complejos.
E imprimimos los resultados en pantalla.
En este caso observamos que la nica forma que la divisin entre
cero nos de un valor operable es aplicando el reciproco.
Estos 2 casos en la inversin de nmeros complejos son los casos
especiales en los que se obtienen valores no deseados o valores
que impiden que se tenga un buen manejo de operaciones.
I3TzShadow 29