Mes: agosto 2022 (Página 1 de 3)

Rectas y Planos en Geometría

En el estudio de cualquier disciplina matemática un tema que es fundamental es comprender las bases geométricas que nos permiten trasladar lo que imaginamos al mundo real de lo que vemos y palpamos, en esta sección se explora las diferentes representaciones de las Rectas y Planos en Geometría.

Si deseas más información de geometría vectorial sigue este enlace.

1. Rectas

Para las Recta en Geometría en el espacio se tiene la siguiente ecuación vectorial:

$\overrightarrow{OR}=\overrightarrow{OP}+t\mathbf v$

Donde el vector $\mathbf v$ es un vector paralelo a $\overrightarrow {PR}$. Extendiendo los componentes se puede obtener las siguientes relaciones denominadas ecuaciones paramétricas de la recta:

$x=x_1+t(x_2-x_1)$

$y=y_1+t(y_2-y_1)$

$z=z_1+t(z_2-z_1)$

Si se despeja $t$ en las ecuaciones anteriores y se igualan definiendo $a=x_2−x_1$, $b=y_2−y_1$ y $c=z_2−z_1$ se obtienen las llamadas ecuaciones simétricas de la recta:

$\frac{x-x_1}{a}=\frac{y-y_1}{b}=\frac{z-z_1}{c}$

Tenga en cuenta que las ecuaciones paramétricas o simétricas de una recta no son únicas.

2. Planos

Los Rectas y Planos en Geometría se pueden definir de forma vectorial, para el caso de planos una forma es la siguiente: sea $P$ un punto y $\mathbf n$ un vector dado diferente de cero, el conjunto de puntos $Q$ que cumplen

$\overrightarrow{PQ}\cdot \mathbf n = 0$

se conoce como plano. Las siguientes ecuaciones son las ecuaciones cartesianas de un plano:

$ax+by+cz=d$

$\text{donde }d=ax_0+by_0+cz_0=\overrightarrow{OP}\cdot \mathbf n $

En estas ecuaciones los números $a$, $b$ y $c$ son las componentes del vector $\mathbf n$ normal al plano y los números $x_0$, $y_0$ y $z_0$ son los coordenadas del punto $P$. Finalmente una definición útil es que dos planos son paralelos si sus vectores normales lo son, es decir si el producto cruz de los vectores normales es cero.

3. Artículos de Interés

Catálogo de Funciones Matemáticas

Este post contiene un Catálogo, compendio o recopilación de las Funciones Matemáticas más utilizadas, su ecuación representativa, su gráfica y una descripción de su utilidad.

Para conocer más propiedades de las funciones sigue este vínculo.

1. Funciones Lineales

En el Catálogo de Funciones Matemáticas la primera a estudiar y más sencilla es la Lineal. En su forma más habitual está dada por la ecuación punto pendiente de la recta $f(x)=mx+b$. Estas funciones permiten establecer relaciones lineales entre la variable dependiente e independiente de manera que la proporción del crecimiento o decrecimiento de y respecto a variaciones en x se mantiene constante.

Función lineal
Figura 8. Función lineal $f(x)=x$

2. Funciones Polinomios

En su forma más general está dado por $P(x)=a_nx^n+a_{n−1}x^{n−1}+…+a_2x^2+a_1x+a_0$. Las funciones polinomiales incluyen todos los grados de los exponentes permitiendo establecer relaciones complejas entre la variable $x$ y $y$, sin embargo, las funciones polinomiales más habituales tiene grados pequeños como $2$ o $3$.

Polinomio de segundo grado
Figura 9. Polinomio de segundo grado $f(x)=x^2$

3. Funciones Potencia

Este es un caso particular de un polinomio en una forma más simple y permite representar parábolas o funciones recíprocas, ya que se debe considerar que el exponente puede ser negativo, su forma general es la siguiente $f(x)=x^a$

Función potencia 
Figura 10. Función potencia $f(x)=x^3$

4. Funciones Racionales

Representan cocientes o relación de cantidades y se pueden escribir de la siguiente forma $f(x)=\frac{P(x)}{Q(x)}$ estos cocientes establecen relaciones complejas la gráfica muestra un ejemplo de este tipo de relaciones.

Función racional
Figura 11. Función racional $f(x)=\frac{x−1}{x+1}$

5. Funciones Algebraicas

Son aquellas que están dadas por la combinación de operaciones aritméticas como suma, resta, multiplicación, o división por lo cual las funciones construidas con polinomios o funciones racionales son también algebraicas.

Función algebraica
Figura 12. Función algebraica $f(x)=sqrtx{\frac{−1}{x+1}}$

6. Funciones Trigonométricas

Las funciones trigonométricas son adecuadas para describir comportamientos periódicos las funciones más comunes son $f(x)=sin(x)$, $f(x)=cos(x)$, $f(x)=tan(x)$ y sus respectivas funciones inversas.

Función trigonométrica
Figura 13. Función trigonométrica $f(x)=sin(x)$

7. Funciones Exponenciales

Rn su forma más general está dado por $f(x)=a^x$. Estas funciones permiten modelamientos muy habituales de crecimientos por ejemplo la propagación de virus o crecimiento de poblaciones, así como otros procesos físicos. En particular cuando el exponente $x \approx 2,71$ la pendiente de la gráfica en $x=0$ es exactamente $1$ este número se llama $e$ y muy probablemente sea llamado así por ser la primera letra de la palabra exponential, Leonhard Euler en 1727 lo bautizó.

Función exponencial
Figura 14. Función exponencial $f(x)=2^x$

8. Funciones Logarítmicas

En su forma más general está dado por $f(x)=log_a{x}$. Estas funciones permiten analizar crecimientos muy rápidos de funciones en escalas de un entendimiento más sencillo, un ejemplo de ello lo encontramos en las funciones que trabajan con unidades como decibelios.

Función logarítmica
Figura 15. Función logarítmica $f(x)=log_2{x}$

9. Funciones Trascendentes

Estas funciones incluyen otras como las trigonométricas, la exponencial y la logarítmica y muchas otras que no reciben ningún nombre.

10. Artículos de Interés

Listas con Arreglos en Java

Las Listas con Arreglos en Java permiten que estas estructuras de datos se desarrollen usando memoria estática, con lo cual se requerirá operaciones de redimensionado de los arreglos cada vez que se cambie el tamaño, este post detalla el funcionamiento y el código de esta estructura de datos.

Acceda al código de las listas con memoria dinámica o enlazadas usando este link.

1. Lista con arreglos

Como se había mencionado anteriormente la lista con arreglos puede ser una implementación de la misma interface IList.

La ventaja en este caso es la facilidad para posicionarse en cualquier punto, sin embargo, al estar la lista conformada con arreglos, tiene las desventajas del uso de arreglos que se menciono al principio de esta sección.

El arreglo es muy óptimo para indexare, pero cuando se acaba el tamaño es necesario crear otro nuevo con más tamaño y hacer un copiado de los elementos del arreglo original en el nuevo con mayor capacidad, esta operación ralentiza los métodos de la lista.

Por esta razón las listas con arreglos deben tener mínimamente dos conceptos incluidos: el tamaño (que comúnmente se refiere al tamaño ocupado) y la capacidad (que es la máxima cantidad de elementos que puede tener el arreglo utilizado en la lista). A continuación, se presenta el código de la lista enlazada usando arreglos.

package lists;
import java.util.Iterator;
/**
 * Lista que usa arreglos nativos para implementar las operaciones de una lista
 * @author ochoscar
 * @param < T > Tipo genérico que contra los item de la lista
 */
public class ArrayList< T > implements IList< T >, Iterable< T >  {
    ////////////////////
    // Atributos
    ////////////////////
    /** Arreglo nativo de la lista que contiene los elementos y su longitud es
     la capacidad máxima de elementos a almacenar*/
    private T array[];
    /** Tamaño de la lista que refleja la cantidad de casillas del arreglo usadas */
    private int listSize;
    ////////////////////
    // Métodos
    ////////////////////
    /**
     * Constructor por defecto que crea la lista con 10 casillas de capacidad
     */
    public ArrayList() {
        array = (T[]) new Object[10];
        listSize = 0;
    }
    /**
     * Constructor especificando la capacidad inicial
     * @param initCapacity Capacidad inicial
     */
    public ArrayList(int initCapacity) {
        array = (T[]) new Object[initCapacity];
        listSize = 0;
    }
    /**
     * Método que verifica si la lista esta vacía
     * @return Devuelve true si la lista esta
     * vacía y false en caso contrario
     */
    @Override
    public boolean isEmpty() {
        return listSize == 0;
    }
    /**
     * Obtiene el primer item de la lista
     * @return Devuelve la Clase al principio de la lista
     * null en caso que la lista este vacía
     */
    @Override
    public T getFirst() {
        return listSize > 0 ? array[0] : null;
    }
    /**
     * Obtiene el ultimo elemento de la lista
     * @return Devuelve la ultima Clase en la lista
     * null si la lista esta vacía
     */
    @Override
    public T getLast() {
        return listSize > 0 ? array[listSize - 1] : null;
    }
    /**
     * Devuelve el i - esimo elemento de la lista
     * @param i Posición del elemento a devolver (comienza en 0)
     * @return Devuelve la Clase en la posición i
     */
    @Override
    public T get(int i) {
        return listSize > 0 && i > 0 && i < listSize ? array[i] : null;
    }
    /**
     * Método que establece un item de la lista en una posición especifica
     * @param p Objeto que sera establecido en una posición especifica
     * @param i Posición a establecer el objeto
     */
    @Override
    public void set(T p, int i) {
        if(listSize > 0 && i > 0 && i < listSize) {
            array[i] = p;
        }
    }
    /**
     * Método que determina el tamaño de la lista
     * @return Devuelve un entero que indica el tamaño de la lista
     */
    @Override
    public int size() {
        return listSize;
    }
    /**
     * Método que inserta al final de la lista
     * @param p Objeto a insertar
     * @return Devuelve la propia lista enlazada
     */
    @Override
    public IList< T > addLast(T p) {
        if(listSize == array.length) {
            adjustCapacity(2 * listSize);
        }
        array[listSize] = p;
        listSize++;
        return this;
    }
    /**
     * Método que permite agregar un objeto en un posición
     * arbitraria de la lista
     * @param p Objeto que se quiere agregar a la lista
     * @param i posición en la cual se quiere agregar
     * @return Devuelve la propia lista enlazada
     */
    @Override
    public IList< T > add(T p, int i) {
        if(listSize == array.length) {
            adjustCapacity(2 * listSize);
        }
        for(int j = listSize - 1; j >= i; j--) {
            array[j + 1] = array[j];
        }
        array[i] = p;
        listSize++;
        return this;
    }
    /**
     * Método que elimina un elemento dado un objeto
     * @param p Objeto a eliminar
     */
    @Override
    public void remove(T p) {
        for(int i = 0; i < listSize; i++) {
            if(array[i].equals(p)) {
                remove(i);
                break;
            }
        }
    }
    /**
     * Método que remueve un elemento de la lista
     * @param i Posición o índice a eliminar de la lista
     */
    @Override
    public void remove(int i) {
        for(int j = i; j < listSize; j++) {
            array[j] = array[j + 1];
        }
        listSize--;
    }
    /**
     * Devuelve si esta o no
     * @param p Objeto a verificar si esta en la lista
     * @return Devuelve true si p esta en la lista false sino
     */
    @Override
    public boolean contains(T p) {
        for(int i = 0; i < listSize; i++) {
            if(array[i].equals(p)) {
                return true;
            }
        }
        return false;
    }
    /**
     * Implementación de la interface iterable que permite recorrer la lista
     * con ciclos estilo for - each
     * @return Devuelve el iterador para recorrer la lista
     */
    @Override
    public Iterator< T > iterator() {
        // Creación de un objeto anónimo para retornarlo
        return new Iterator< T >() {
            /** Contador para referenciar el elemento que actualmente se itera */
            private int i = 0;
            /**
             * Método que indica si existen mas elementos a recorrer o no
             * @return True si existen mas elementos para recorrer y false en caso contrario
             */
            public boolean hasNext() {
                return i < listSize;
            }
            /**
             * Devuelve el elemento donde se encuentra parado el iterador y lo avanza
             * @return
             */
            public T next() {
                i++;
                return array[i - 1];
            }
            /**
             * Método que le permite al iterador remover un elemento de forma segura
             * En la lista hay que tener cuidado cuando se remueve mientras se itera puesto
             * que la eliminación cambia el tamaño de la lista. Este método
             * no se encuentra soportado en esta version.
             */
            public void remove() {
                throw new UnsupportedOperationException();
            }
        };
    }
    /**
     * Método privado utilitario encargado de asegurar una capacidad en el arreglo
     * haciendo una copia de los elementos del arreglo viejo en el nuevo
     * @param newCapacity Nueva capacidad del arreglo
     */
    private void adjustCapacity(int newCapacity) {
        T newArray[] = (T[]) new Object[newCapacity];
        for(int i = 0; i < listSize; i++) {
            newArray[i] = array[i];
            array[i] = null;
        }
        array = newArray;
    }
}

La siguiente imagen muestra el diagrama correspondiente a la lista implementada con arreglos.

Lista implementada con arreglos
Figura 1. Lista implementada con arreglos

Observe que el tamaño del arreglo, es decir, su capacidad puede verse incrementada en la operación add, en la cual se puede duplicar el tamaño del arreglo; una practica común es reducir también el tamaño del arreglo cuando se remueve, y es común disminuir el tamaño del arreglo a un cuarto del mismo si la mitad del arreglo esta libre.

Es importante con lo anterior evitar que se hagan secuencias de operaciones que dupliquen – recorren el tamaño del arreglo, es decir add – remove – add – remove y así sucesivamente decrementando sustancialmente el rendimiento del arreglo.

2. Artículos de Interés

Estáticos y Constructores en Java

Los miembros Estáticos y Constructores en Java son muy útiles en el momento de desarrollar código el primero permite establecer una característica de la membresía y el segundo como se inicializan los atributos de los objetos y esto se logra con los constructores, en este post aprenderás ambos conceptos.

Si quieres aprender sobre la historia de Java da clic en este enlace.

1. Miembros estáticos Atributos y Métodos

Los miembros Estáticos en Java utilizan la palabra reservada static y permiten vincular un atributo o método con la clase directamente, en este punto es conveniente notar que los atributos son independientes entre los objetos, de tal manera que cada objeto tiene su propia copia de los atributos, sin embargo con los atributos estáticos no ocurre lo mismo ya que solamente existe una copia de los mismos para todas las instancias de una clase (objetos).

Con los métodos pasa algo similar, de por si los métodos tienen una sola copia ya que todos los objetos acceden a las mismas instrucciones, sin embargo las variables que utilizan si son independientes por objeto, con un método estático se limita el acceso de dicho método solo a atributos estáticos, esta regla impide por ejemplo que un método estático acceda a un miembro no estático.

Al estar asociado los miembros estáticos a la clase los mismos pueden acceder a través del operador punto y utilizando el nombre de la clase, alternativamente puede usarse en objetos.

1.1 Ejemplos de miembros estáticos Atributos y Métodos

Conceptos básicos para escribir código en java que incluyen Clases Métodos y Atributos. Tipos de datos palabras reservadas y escritura básica de código.

A fin de ejemplificar el uso de métodos y atributos estáticos consideremos el siguiente código

public class DemoStatic {
    public int i;
    public static void staticMethod() {
        i = 2;
    }
}

Aquí el acceso a la variable i no esta permitido dentro del método estático y la razón es simple: el atributo no es estático, piense en ello un momento ya que lo anterior implica que se pueda hacer un llamado a staticMethod desde la clase, algo como: DemoStatic.staticMethod(), pero al intentar acceder a la variable i ¿cuál valor de variable se debe usar? sabiendo que el llamado se hizo desde la propia clase, por lo anterior no esta permitido acceder a miembros no estáticos desde métodos estáticos. Lo anterior ocurre con frecuencia cuando se comienza a programar en situaciones como la siguiente.

public class DemoStatic {
    public int i;
    public static void main(String args[]) {
        i = 2;
    }
}

En esencia es el mismo código anterior, excepto que se esta haciendo uso del método main, para subsanar lo anterior hay dos alternativas: convertir la i en atributo estático o instanciar un nuevo objeto de la clase, ambas soluciones se muestran a continuación.

public class DemoStatic {
    public static int i;
    public static void main(String args[]) {
        i = 2;
    }
}
public class DemoStatic {
    public int i;
    public static void main(String args[]) {
        DemoStatic ds = new DemoStatic();
        ds.i = 2;
    }
}

2. Constructores, bloques y ámbitos en Java

Los Constructores en Java son métodos especiales diseñados para inicializar los atributos y se caracterizan por tener el mismo nombre de la clase y retornar nada.

Random r = new Random();

La variable r se encarga de referenciar en memoria a un objeto recién creado de la clase Ramdom y usando el método constructor por defecto.

2.1. Constructores

Existen tres tipos de constructores tradicionales que son:

  1. Los constructores por defecto no reciben ningún parámetro, Java incluye automáticamente en caso que el programador no especifique de forma explicita un constructor.
  2. Constructor con parámetros, que recibe parámetros referentes a los atributos y normalmente los asigna a los mismos.
  3. Constructor de copia, que recibe un objeto de la misma clase y realiza una copia de los atributos del parámetro en el nuevo objeto creado.

Según las reglas de sobrecarga de métodos pueden existir varios constructores, ya que un constructor es un método más.

Las reglas de sobrecarga establecen que los métodos pueden tener el mismo nombre y tipo de retorno siempre y cuando las firmas de los métodos difieran bien sea en tipos de datos de los parámetros o cantidad de parámetros u orden de los mismos o excepciones que arroje el método.

2.2. Inicializaciones de objetos

Un constructor inicializa los atributos que en general pueden inicializarse de tres formas.

  • Inicialización en línea: ocurre cuando en la misma línea de la declaración se inicializa el atributo, esta es la primera inicialización que tiene un atributo..
  • Inicialización en constructor: ocurre cuando se agrega lógica al constructor que inicializa la variable, esta es la última inicialización de un atributo.
  • Inicialización de instancia: ocurre en un bloque de inicialización, estas inicializaciones junto con las inicializaciones en línea se ejecutan en el orden que se encuentren en el código.

Recuerde que no es posible referirse a una variable que no ha sido inicializada. El siguiente código muestra cada uno de estos esquemas de inicialización.

public class InitExamples {
    public InitExamples() {
        // Inicialización en constructor
        i = 5;
    }
    public static void main(String[] args) {
        InitExamples ie = new InitExamples();
        System.out.println(ie.i);
    }
    // Inicialización en línea
    private int i = 3;
    // Bloque de inicialización de instancia
    { i = 4; }
}

¿Qué valor cree que se imprime? Si respondió 5 esta en lo correcto. Observe el bloque de inicialización el cual no tiene etiquetas, ni firmas de prototipos, en este bloque se puede incluir la lógica necesaria para inicializar la variable.

2.3. Ámbitos y variables

Respecto a los bloques de código es importante que el programador reconozca que los bloques son trozos de código encerrados entre llaves y que el ámbito se refiere a los bloques de código donde se puede referir alguna variable.

  • Variables locales: son aquellas declaradas dentro de los métodos y se pueden utilizar en el bloque fueron declaradas y en todo caso no antes de su declaración.
  • Variables de instancia: estas también son conocidas como atributos y se pueden usar en el bloque de su declaración o desde su objeto siempre y cuando cumpla con las reglas de los modificadores de acceso. Una variable de instancia solo se encuentra en memoria al igual que el objeto al cual pertenece, por lo tanto cuando un objeto se queda sin referencias es liberado de la memoria mediante el recolector de basura sucede lo mismo con las variables de instancia.
  • Variables de clase: estas variables son las conocidas como atributos estáticos y esta disponible en el bloque de su declaración y desde los objetos y clases siempre y cuando cumpla con las reglas de los modificadores de acceso. Una variable de clase esta disponible hasta que el programa termina.

Las variables de clase o de instancia pueden no ser inicializadas Java inicializa las variables según el tipo con los siguientes valores por defecto.

Tipo de variableValor inicial
booleanfalse
byte, short, int, long0
float, double0.0
char‘\0000’ (NUL)
Referenciasnull
Tabla 1. Valores iniciales de variables

2.4. Inicializaciones estáticas

Finalmente, y con respecto al tema de inicializaciones y bloques es importante para el programador tener en cuenta que los bloques de inicialización pueden ser marcados con la palabra reservada static de la siguiente manera static { }, este código se ejecutará cuando se cargue la clase y sirve para inicializar atributos estáticos, de manera que en un bloque de inicialización estático solo pueden referenciar en miembros estáticos, similar a como sucede con los método estáticos.

3. Artículos de Interés

Tipos Nativos Objetos Variables y Constantes en Java

Aprende la escancia del manejo de Objetos en Java y diferéncialos de los tipos Nativos. También te explicaremos el uso de Variables y Constantes y la diferencia que existe entre el paso por valor y el paso por referencia.

Si quieres aprender sobre estructura de datos comienza aquí.

1. Referencias, Wrappers y Tipos Nativos Código Java

Cuando aprendes a programar un punto inicial son los Tipos Nativos Objetos Variables y Constantes en Java y es clave poder diferenciarlos, aquí se mostrará todo el detalle necesario para comprender esas diferencias.

1.1. Tipos de Datos Definidos por el Usuario

Aunque Java puede tener muchas clases, que en general se conocen en el mundo de la programación como tipos de datos definidos por el usuario, en realidad Java solo tiene dos tipos de datos: tipos nativos y referencias.

Los tipos nativos son aquellos que almacenan el valor en la misma posición de memoria a la cual se refieren, mientras que las referencias almacenan la dirección de memoria donde reside el objeto.

1.2. Tipos nativos en Java

Para facilitar la comprensión de este concepto vamos a comenzar con los tipos de datos nativos los cuales se pueden ver en la siguiente tabla junto con la cantidad de memoria que ocupan y el rango de valores que admiten, note que un tipo nativo no permiten que se les asigne el valor null.

Tipo de datoTamaño
boolean8 bit (false, true)
byte8 bit (-128 a 127)
short16 bit (-2^15 a 2^15-1)
int32 bit (-2^31 a 2^31-1)
long64 bit (-2^63 a 2^63-1)
float32 bit (±3.4×10^-38 a ± 3.4×10^38)
double64 bit (±1.8×10^-308 a ± 1.8×10^308)
char16 bit (Valores Unicode)
Tabla 2. Tipos de Dato Nativo

En el caso de las referencias, el tamaño que ocupa depende de la arquitectura de la JVM si es de 32 bit o de 64 bit.

Los tipos nativos se caracterizan a su vez ser palabras reservadas, es importante comprender que estos tipos nativos no representan clases u objetos y que Java a incluido versiones objetuales de los tipos nativos, así por ejemplo existe Double e Integer.

2. Constantes en Java

Tipos Nativos Objetos Variables y Constantes en Java tienen una importancia crucial en la codificación en Java en esta sección aprenderás sobre el manejo de las constantes.

2.1. Constantes numéricas

Las constantes numéricas que aparecen en el código son tratadas con int si estas no tienen un punto, en caso que lo tengan son tratadas como constantes numéricas de tipo Double, así mismo se puede forzar a interpretar una constante entera como long si la constante tiene el sufijo L o l (se aconseja utilizar el primero ya que el segundo se asemeja mucho a un carácter 1, en el caso de las constantes numéricas de punto flotante se puede forzar a interpretarlas como float si se utiliza como sufijo la letra F o f y finalmente el sufijo para double es d o D, note que todos estos sufijos hacen referencia a tipos nativos y no a los Wrapper correspondientes. Para el caso del tipo de dato char es importante reconocer que los caracteres individuales se encierran entre comillas dobles mientas que las cadenas de caracteres se encierran en comillas dobles.

2.2. Literales

Las constantes numéricas, es decir, valores fijos numéricos que aparecen el código se denominan literales (también aplica para valores de texto) y Java automáticamente los trata como int si los mismos no tienen punto decimal, en caso que tengan punto decimal se tratan como double, así mismo los literales pueden usar el carácter _ como separador, el prefijo 0 para indicar base octal, el predijo 0x o 0X para base hexadecimal y el prefijo 0b o 0B para base binaria. Algunos ejemplos de literales se muestran a continuación.

long max = 1234567890123; // No permitido, el valor literal supera el tamaño del int
double d1 = _1000.00; // El separador no es permitido al principio
double d2 = 1000.00_; // El separador no es permitido al final
double d3 = 1000_.00; //El separador no es permitido al lado del punto decimal
double d4 = 1_00_0.0_0; // Válido

3. Creación de Objetos en Java

Tipos Nativos Objetos Variables y Constantes en Java tiene una similitud, esta sección explica los objetos y es algo que normalmente los programadores incluso los experimentados no diferencian con claridad, a continuación aprenderás uno de los grandes secretos: las referencias.

En la creación de un objeto es necesario comprender que realmente se crean dos espacios de memoria diferentes, uno para la referencia y otro para el objeto.

Cuando un objeto se queda sin referencias es habilitado para que el recolector de basura libere la memoria asociada a dicho objeto automáticamente, y lo anterior tiene sentido porque si un objeto se queda sin referencias no es posible acceder desde ningún punto del código, el gráfico a continuación ilustra la relación entre referencia y objeto para el siguiente código .

Person p1 = new Person()
Relación entre objetos y referencias
Figura 1. Relación objetos y referencias

Algo importante para notar es que una referencia se crea cuando se declara en cambio el objeto se crea cuando se usa el operador new, por lo tanto se debe comprender que la referencia almacena la dirección de memoria de donde se encuentra el objeto, realmente en Java todas las variables son referencias, es decir, almacenan direcciones de memoria, excepto para los tipos nativos.

4. Paso por valor y paso por referencia

Lo anterior nos lleva a explorar lo que sucede cuando pasamos parámetros a métodos ya que existen dos formas: paso por valor que aplica para atributos nativos y paso por referencia, que aplica para los objetos, a fin de explorar este concepto consideremos el siguiente código.

public static void main(String... args) {
    int a1 = 1;
    m1(a1);
    System.out.println("a: " + a1);
    Integer i = new Integer(5);
    m2(i);
    System.out.println("Integer i: " + i);
    String s = "hi";
    m3(s);
    System.out.println("s: " + s);
    StringBuffer sb = new StringBuffer("abc");
    m4(sb);
    System.out.println("sb: " + sb);
}
public static void m1(int a) {
    a = a + 1;
}
public static void m2(Integer i) {
    i = i + 1;
}
public static void m3(String s) {
    s = s + "1";
}
public static void m4(StringBuffer s) {
    s.append("d");
}

La pregunta es ¿qué se imprime? Lo ideal es revisar con calma antes de contestar. Ahora vamos con cada impresión a revisar el fondo.

4.1. Paso por valor

  • Primera impresión: la primera impresión trata la pregunta si el método m1, es decir, si este método afecta la variable externa, la respuesta es no, debido a que la variable a se pasa por valor al ser de un tipo nativo, termina sucediendo que la variable a del main contiene un valor independiente de la variable a del método m1, por tanto la modificación de la variable a no afecta la variable externa, de hecho el parámetro del método m1 podría incluso tener otro nombre.
  • Segunda impresión: este segundo caso tiene un poco más de truco. Si nos basamos en la teoría aprendida pensaríamos que si se modifica puesto que la variable no hace referencia a un tipo nativo sino a un wrapper, sin embargo en el momento dela suma, la variable i debe ser convertida de Integer a int para poder realizar la suma. Esta característica de Java se llama autoboxing y le permite al lenguaje escribir expresiones con tipos nativos o wrappers de forma equivalente para el programador.
  • Tercera impresión: esta impresión también tiene un pequeño truco, puesto que al igual que el caso anterior pensaríamos que se ve afectada la variable externa, sin embargo, esto no sucede ya que String es una clase con comportamientos muy diferentes al resto de clases de Java. Los String en Java son inmutables y se almacenan en una parte especial de la memoria, es decir, una vez definido un String este no cambiará jamás, por lo tanto el append que se observa en el método m3 no modifica el String y por esta razón el valor externo no cambia.

4.2. Paso por referencia

  • Cuarta impresión: esta impresión asociada al método m4 es el único que en realidad es un paso por referencia de manera que lo que hagamos dentro de este método afectará la variable externa ya que ambas variables sb y s referencia el mismo espacio de memoria, esto también se puede notar ya que solamente existe un new, es decir un objeto tipo StringBuffer en este código.

5. Manejo de Strings

Ahora que conoces los Tipos Nativos Objetos Variables y Constantes en Java es hora de entender una de las clases más importantes en Java y de hecho en cualquier lenguaje, los String que permiten manejar cadenas de texto.

Como particularidad de los String cabe anotar que los objetos de esta clase se pueden representar directamente en el código, por ejemplo "hola".length() note que en este caso no fue necesario hacer un nuevo objeto tipo String para invocar el método length().

5.1. Referencias tipo String

A fin de tener presente los puntos más importantes acerca del manejo de referencias, el programador de Java debe recordar que las referencias de tipos Wrappers y de tipo String tienen un manejo diferente al resto de referencias, las primeras por que les aplica el concepto de autoboxing y las segundas por que las cadenas de texto son almacenadas de forma inmutable, es decir, una vez definido un String este no puede cambiar durante la ejecución del programa, para ejemplificar este último concepto de la inmutabilidad de los String considere el siguiente código.

public static void main(String... args) {
    String str1 = "hola";
    String str2 = "hola";
    String str3 = "hola".trim();
    String str4 = "hola   ".trim();
    System.out.println(str1 == str2);
    System.out.println(str1 == str3);
    System.out.println(str1 == str4);
}

Uno pensaría que la primera impresión es true debido a que son referencias diferentes, pero dado que Java almacena los String de forma especial y en una zona especial de la memoria, la asignación de str1 y str2 terminan apuntando a la misma dirección de memoria.

La segunda impresión sigue siendo verdadero debido a que la función trim() que recorta los espacios en blanco al principio y final de una cadena, no realiza en realidad ninguna operación, debido a que no hay nada que recortar, pero algo curioso sucede con la tercera impresión y en este caso arroja false indicando que la referencia str4 termina apuntando a un lugar diferente de memoria, y por lo tanto terminan existiendo en memoria dos objetos String con la misma información hola, note que esto sucede porque trim() no puede modificar el objeto original y cuando lo modifica deja el resultado en una posición de memoria nueva y para ello no determina si ese objeto String ya existia.

5.2. Errores comunes con Strings

Note que debido a estas características de Java, un programa puede proliferar rápidamente la cantidad de String que tiene creados. Una nota final de los String y esto solamente le sucede a esta clase, y es que no requiere un new, no en el código anterior que se realizaron asignaciones sin necesidad de crear un objeto nuevo y esto es porque Java es capaz de tratar como objetos a las cadenas de texto directamente sobre el código, por lo mismo códigos como el siguiente funcionan correctamente: "hola".trim(). Respecto a la primera impresión del código anterior, que sucedería si en lugar de ser String fueran Integer? y para ello considere el siguiente código.

public static void main(String... args) {
    Integer i1 = 10;
    Integer i2 = 10;
    Integer i3 = new Integer(10);
    Integer i4 = new Integer(10);
    System.out.println(i1 == i2);
    System.out.println(i3 == i4);
}

Este código realmente puede ser muy desconcertante, ¿qué imprimirá?

La respuesta es que la primera impresión es true y la segunda es false, la respuesta es la forma en que se crearon los objetos, el primero se hizo usando la característica de autoboxing (recuerde que esta es la habilidad que tiene Java automáticamente de pasar del tipo nativo al Wrapper según se necesite), por lo tanto en la primera ocasión los objetos apuntan a la misma dirección, este caso funciona de forma similar a los String mientras que en la segunda forma los Integer son creados como objetos primero (lo cual hace que ambas referencias i3 e i4 apunten a direcciones diferentes) y luego se inicializan los valores de estas referencias respectivamente.

6. Destrucción de objetos

Los objetos son puestos en un lugar de memoria llamado Memory Heap. Java tiene un hilo de baja prioridad denominado Garbage Collector que elimina objetos que ya no son referenciados.

Se puede invocar manualmente usando System.gc() aunque nada garantiza que se libere la memoria en un momento dado del tiempo, llamar a este método es meramente una sugerencia para Java. Similar a como los constructores crean objetos los destructores se encargan de eliminarlos, el siguiente método se invoca cuando un objeto es elegido por el recolector y puede personalizar la liberación de recursos. En realidad no es muy usado, sin embargo recuerde que este método nunca se llama dos veces: protected void finalize();

7. Artículos de Interés

Paquetes en Java

Todo lo que necesitas saber de paquetes de Java lo encuentras en esta página web, esperamos que sea de utilidad.

Si quieres saber más sobre la historia y funcionamiento de Java visita este link.

1. Funcionamiento de los paquetes en java

Las clases realmente conforman activos de las organizaciones y de hecho muchas de ellas proveen valiosos mecanismos para reutilizar código, sin embargo, miles de clases se producen y debe existir una forma para organizarlas, dicha forma se conoce como empaquetado y el mismo funciona de manera jerárquica.

2. Generalidades de los paquetes

Los paquetes entonces no son más que contenedores de clases y permiten a los programadores agruparlas de forma lógica. Respecto a los paquetes hay dos cosas que quizás no son muy conocidas pero es importante tenerlas en cuenta a la hora de programar, la primera trata del hecho que en todo programa siempre se encuentra importado por defecto el paquete java.lang en este paquete se encuentran las utilidades y clases básicas del propio core de Java.

Por ejemplo, clases para el manejo de número o cadenas de texto y la segunda es que al estar las clases contenidas en paquetes se crea un nombre de clase que incluye la jerarquía de paquetes donde se encuentra.

3. Ejemplos de paquetes

La clase ArrayList se encuentra en java.util.ArrayList, a este último se le conoce como nombre completamente cualificado. Note que los nombres de los paquetes se separan por punto y que estos nombres al ser jerárquicos se suelen nombrar como nombres de dominio al revés. Por ejemplo el paquete com.ochoscar
También es importante indicar en nuestros archivos y programas que clases utilizamos, esto haciendo uso de la palabra reservada import

4. Errores comunes con paquetes

Cuando realizamos importaciones es conveniente tener presente que no hayan validaciones redundantes de clases que teniendo el mismo nombre se encuentren en paquetes diferentes, por ejemplo, la clase Date que se encuentra tanto en el paquete java.util como en el paquete java.sql. Considere el siguiente código.

import java.util.Date;
import java.sql.Date;
public class DemoImport {
    public static void main(String args[]) {
        Date date;
    }
}

Aquí la importación falla al tener la misma clase desde paquetes diferentes, pero ¿qué hacer si se quisiera instanciar un objeto del paquete java.util y a la vez del paquete java.sql? La mejor opción aquí es utilizar los nombres completamente cualificados como se muestra a continuación.

import java.util.Date;
public class DemoImport {
    public static void main(String args[]) {
        java.sql.Date date;
    }
}

5. Comodines wildcards y subpaquetes

Respecto a las importaciones hay dos temas importante, el primero se conoce como wildcard (*) y no es otra cosa que un comodín para importar todas las clases de un paquete, debemos tener cuidado por que el wildcard no incluye subpaquetes, un ejemplo de uso del wildcard sería import java.util.*;, a manera de nota es recomendable notar que los wildcard a su vez pueden producir conflictos de importación y el segundo punto a tener en cuenta son las importaciones estáticas que sirven para importar en el archivo los miembros estáticos definidas en otra clase, esto ahorra el hecho de referirnos a estos miembros usando el nombre de la clase, para referencia observe el siguiente ejemplo.

import static java.lang.Math.*;
public class DemoImportStatic {
    public static void main(String args[]) {
        double r = 2;
        double a = PI * r * r;
    }
}

Hasta este punto se han visto los componentes esenciales de los archivos de Java, es importante que estén en un orden adecuado para que puedan ser compilados por Java.

Se debe comenzar con las declaración del paquete, las importaciones, la definición de la clase y su contenido, este último normalmente se escribe primero los atributos y luego los métodos, teniendo siempre presente la correcta tabulación, los comentarios de documentación y los nombres adecuados para los identificadores.

6. Artículos de Interés

Series en Matemáticas y Cálculo

Las Series en Matemáticas y Cálculo tiene muchas aplicaciones debido a su poder, por ejemplo podemos expresar funciones como series infinitas o simplificar cálculos, estas páginas contienen un resumen completo de las series, sus aplicaciones y definiciones.

Si deseas iniciar en el mundo del álgebra lineal sigue este vínculo.

1. Sucesiones

Las sucesiones son números consecutivos que se escriben como:

$a_1,a_2.a_3,…,a_n$

Alternativamente una sucesión infinita se puede escribir de la siguiente manera: `{a_n}` Una sucesión `{a_n}` tiene límite `L` y se escribe:

$\lim_{n \to \infty}a_n=L$

Siempre y cuando podamos hacer los términos $a_n$ se acerquen a $L$ tanto como queramos al hacer $n$ lo suficientemente grande. Si el límite anterior existe se dice que la sucesión converge de lo contrario se dice que la sucesión es divergente. Por lo anterior todas las leyes de los límites son aplicables a las sucesiones, incluyendo el teorema de la compresión y el siguiente teorema que se da sin demostración

2. Teoremas y definiciones de Series en Matemáticas y Cálculo

2.1. Crecimiento y decrecimiento

  • Una sucesión ${a_n}$ es creciente si $a_n < a_{n+1}$ para toda $n \ge 1$
  • Una sucesión ${a_n}$ es decreciente si $a_n > a_{n+1}$ para toda $n \ge 1$
  • Una sucesión es monótona si es creciente o decreciente

2.2. Acotamiento

Una sucesión ${a_n}$ está acotada por arriba si existe un número $M$ tal que $a_n \le M$ para toda $n \ge 1$.

Una sucesión ${a_n}$ está acotada por debajo si existe un número $m$ tal que $a_n \ge m$ para toda $n \ge 1$.

Si la sucesión está acotada por encima y por debajo se dice que la sucesión está acotada.

2.3. Teoremas

Si $\lim_{n \to \infty}|a_n|=0$ entonces $\lim_{n \to \infty}a_n=0$.
La sucesión ${r^n}$ es convergente si $-1 \lt r \le 1$ y divergente para los demás valores de $r$.
Toda sucesión acotada y monótona es convergente

3. Series en Matemáticas y Cálculo

Una serie se obtiene al sumar los términos de una sucesión y la cual se representa de la siguiente manera

$\sum_{n=1}^\infty a_n$

Dada una serie, se denota con $s_n$ a su n-ésima suma parcial:

$s_n=\sum_{i=1}^n {a_i}=a_1+a_2+a_3+ \dots +a_n$

Si la sucesión ${s_n}$ es convergente y si existe el $\lim_{n\to\infty}{s_n}=s$ como un número real, entonces la serie $\sum{a_n}$ se llama convergente y el número $s$ se denomina suma de la serie. En otro caso se entiende la serie como divergente.

3.1. Serie en Matemáticas: Serie Geométrica

La serie geométrica está dada por la siguiente expresión:

$\sum_{n=1}^{\infty}{ar^{n-a}}$

Esta serie converge siempre y cuando $|r| \lt 1$, en caso contrario diverge.
Cuando la serie converge su suma es:

$\sum_{n=1}^{\infty}{ar^{n-a}}=\frac{a}{1-r}$

4. Serie Binomial

El teorema del binomio es una forma de factorización muy conocida y que se expresa como:

$(a+b)^k=a^k+ka^{k-1}b+\frac{k(k-1)}{2!}a^{k-2}b^{2}+\frac{k(k-1)(k-2)}{3!}a^{k-3}b^{3}+\dots+\frac{k(k-1)(k-2)\dots(k-n+1)}{n!}a^{k-n}b^{n}+\dots+kab^{k-1}+b^k$

La notación tradicional de los coeficientes es la siguiente:

$\binom{k}{0}=1$

$\binom{k}{n}=\frac{k(k-1)(k-2)\dots(k-n+1)}{nª}\text{ con }n=1,2,3, \dots ,k$

La notación anterior permite escribir el teorema del binomio así:

$(a+b)^k=\sum_{n=0}^{k}\binom{k}{n}a^{k-n}b^n$

Considerando el caso particular $a=1$ y $b=x$:

$(1+x)^k=\sum_{n=0}^{k}\binom{k}{n}x^n$

Esta fórmula es bien conocida para números $k$ que sean enteros positivos. Utilizando series de potencias y la serie de Maclaurin se puede expresar esta serie para otros casos de $k$ siendo fraccionario o negativo.
Si $k$ es un número real y $|x|<1$ entonces se puede expresar la serie binomial como:

$(1+x)^k=\sum_{n=0}^{\infty}\binom{k}{n}x^n$

5. Artículos de Interés

Integrales en Cálculo

Las Integrales en Cálculo son una poderosa herramienta que permite resolver un sin número de casos prácticos y modelar la naturaleza de forma muy precisa, su estudio esta presente en casi todas las ramas del conocimiento, aquí encontrarás material suficiente para estudiar las Integrales, entenderlas o repasarlas.

Si quieres iniciar en el mundo del Álgebra Lineal te recomendamos seguir ente link.

1. Áreas bajo Curvas

El problema del área bajo la curva se puede resolver inscribiendo rectángulos de base fija $\Delta x=\frac{b-a}{n}$ donde $n$ es el número de rectángulos que se inscriben en el intervalo $[a,b]$ de esta forma el área se obtiene sumando el área a individual de cada rectángulo y haciendo que $n \to \infty$ los rectángulos inscritos pueden tomarse con cualquier punto sobre la curva (puntos de muestra) por ejemplo se pueden tomar para que estén a la izquierda, a la derecha o en un punto medio. El área bajo la curva se puede obtener entonces evaluando el siguiente límite:

$A=\lim_{n \to \infty}[f(x_1)\Delta x+f(x_2)\Delta x+\dotsm+f(x_n)\Delta x]$

La siguiente gráfica ilustra este proceso:

Área bajo una curva
Figura 1. Área bajo una curva

Note que para poder hallar esta área se requiere que la función sea continua.

2. Integrales en Cálculo

2.1. Integral definida

A continuación se presenta la definición de integral definida. Si $f$ es una función continua definida para $a \le x \le b$, dividimos el intervalo $[a,b]$ en $n$ subintervalos de igual ancho $\Delta x=\frac{b−a}{n}$. Hacemos que $x_0(=a),x_1,x_2,\dotso,x_n(=b)$ sean los puntos extremos de estos subintervalos y elegimos $x_i^*$⋅ se encuentre en el i-esimo subintervalo $[x_{i-1},x_{i}]$, entonces la integral definida de $f$ desde $a$ hasta $b$, es:

$\int_{a}^{b}f(x)dx=\lim_{n \to \infty}\sum_{i=1}^{n}f(x_i^*)\Delta x$

En la notación anterior se tiene los límites de la integral definida, la función y la variable que se quiere integrar $dx$, esta es la notación de Leibniz. De otra parte la sumatoria es conocida como Suma de Riemann. Como se anotó antes este límite siempre existe y es independiente de la elección de los puntos de muestra siempre y cuando pertenezcan al subintervalo correspondiente. Este límite también se puede hallar si $f$ posee discontinuidades de tipo salto, pero no de tipo infinito. En caso que la función a integrar tome valores negativos (este por debajo del eje $x$), durante esos intervalos el área de la función será considerada como negativa y al tomar la integral sobre un intervalo mayor que abarque porciones de la función donde sea negativa y positiva, la integral definida al ser evaluada corresponderá a una diferencia de áreas y, por lo tanto, en estos casos no puede ser interpretado el resultado como un área.

2.2 Regla del punto medio

Una forma de mejorar las aproximaciones obtenidas con la suma de Riemann consiste en utilizar los puntos medios de cada subintervalo, a este procedimiento se le conoce como regla del punto medio y establece que:

$\int_a^bf(x)dx \approx \sum_{i=1}^nf(\overline{x_i})\Delta x$

Donde $\Delta x=\frac{b-a}{n}$ y $\overline{x_i}=\frac{1}{2}(x_{i-1}+x_i)$ es decir el punto medio del subintervalo $[x_{i-1},x_i]$

3. Propiedades de las integrales en Cálculo

Supongamos que $f$ y $g$ son funciones continuas, entonces se cumplen las siguientes propiedades:

  • $\int_b^af(x)dx=-\int_a^bf(x)dx$
  • Si $a=b$ entonces $\Delta x=0$ y $\int_a^af(x)dx=0$
  • $\int_a^bcdx=c(b-a)$
  • $\int_a^b(f(x)+g(x))dx=\int_a^bf(x)dx+\int_a^bg(x)dx$
  • $\int_a^bcf(x)dx=c\int_a^bf(x)dx$
  • $\int_a^b(f(x)-g(x))dx=\int_a^bf(x)dx-\int_a^bg(x)dx$
  • $\int_a^cf(x)dx+\int_c^bf(x)dx=\int_a^bf(x)dx$
  • Si $f(x) \ge 0$ para $a \le x \le b$, entonces $`\int_a^bf(x)dx \ge 0$
  • Si $f(x) \ge g(x)$ para $a \le x \le b$, entonces $\int_a^bf(x)dx \ge \int_a^bg(x)dx$
  • Si $m \le f(x) \le M$ para $a \le x \le b$, entonces $m(b-a) \le \int_a^bf(x)dx \le M(b-a)$

4. Teorema de evaluación

Si $f$ es continua sobre el intervalo $[a,b]$ entonces:

$\int_a^bf(x)dx=F(b)-F(a)$

Donde $F$ es cualquier antiderivada de $f$, es decir, $F’=f$ Esta expresión se relaciona con el teorema fundamental del cálculo. Existen varias notaciones adicionales para expresar la evaluación de esta integral como la que se muestra a continuación:

$\int_a^bf(x)dx=F(x)\biggr\rvert_a^b=F(x)\biggr]_a^b$

5. Integrales en Cálculo indefinidas

La notación más conveniente para una antiderivada es una integral indefinida, que se escribe como:

$\int f(x)dx=F(x)$

Significa que $F'(x)=f(x)$ Note que una integral indefinida es una familia de funciones mientras que una integral definida es un número. Las integrales definidas e indefinidas se pueden relacionar mediante el siguiente resultado:

$\int_a^bf(x)dx=\int f(x)dx\biggr\rvert_a^b$

Las integrales indefinidas siguen las mismas propiedades de las integrales definidas, adicionalmente es conveniente contar con una breve tabla de integrales que permitan encontrar rápidamente las antiderivadas. A continuación, se provee una breve tabla.

$\int \biggl[f(x) \pm g(x)\biggr]dx=\int f(x)dx \pm \int g(x)dx$

$\int cf(x)dx=c\int f(x)dx$

$\int x^ndx=\frac{x^{n+1}}{n+a}+C \text{ con }n \ne -1$

$\int \frac{1}{x}dx=\ln |x|+C$

$\int e^xdx=e^x+C$

$\int \sin x dx=-\cos x+C$

$\int \cos x dx=\sin x+C$

$\int \sec^2xdx=\tan x+C$

$\int \csc^2xdx=-\cot x+C$

$\int \sec x \tan xdx=\sec x+C$

$\int \csc x \cot xdx=-\csc x +C$

$\int \frac{1}{\sqrt{1-x^2}}dx=\sin ^{-1}x+C$

$\int -\frac{1}{\sqrt{1-x^2}}dx=\cos ^{-1}x+C$

$\int \frac{1}{x^2+1}dx=\tan^{-1}x+C$

6. Teorema del cambio total

De los resultados anteriores se puede escribir el siguiente teorema denominado teorema del cambio total: La integral de una razón de cambio es el cambio total:

$\int_a^bF'(x)dx=F(b)-F(a)$

7. Teorema fundamental del cálculo

El teorema fundamental del cálculo relaciona las dos ramas del cálculo, cálculo diferencial y cálculo integral y muestra como el proceso de integración es contrario o inverso al proceso de derivación y viceversa. Para expresar este hecho con una formulación matemática se puede plantear de la siguiente manera: Sea $f$ una función continua sobre el intervalo cerrado $[a,b]$, luego la función definida por:

$A(x)=\int_a^xf(t)dt\text{ con }a\le x \le b$

Es una antiderivada de $f$, es decir, $A'(x)=f(x)$ De forma alternativa se puede utilizar la notación de Leibniz:

$\frac{d}{dx}\int_a^xf(t)dt=f(x)$

Adicionalmente el teorema fundamental del cálculo establece que:

$\int_a^bf(x)dx=F(b)-F(a)$

Donde $F$ es cualquier antiderivada de $f$. Lo anterior implica que el teorema de evaluación está incluido en el Teorema Fundamental del Cálculo. La siguiente imagen ilustra la función $A$ (función de acumulación).

Función de acumulación
Figura 2. Función de acumulación

8. Integrales en Cálculo impropias

Algo muy importante cuando se tienen integrales definidas es si estas se evalúan sobre un intervalo que o bien es infinito o bien la función tiene una discontinuidad infinita, en ambos casos la integral recibe el nombre de integral impropia y debe evaluarse utilizando límites. A continuación se muestran las diferentes formas en las que una integral impropia debe evaluarse.

9. Integrales impropias por intervalos infinitos

Esta integral es comúnmente conocida como integral impropia de tipo 1 y presenta tres casos.

  • Si $\int_a^tf(x)dx$ existe para todo número $t \ge a$ entonces

$\int_a^\infty f(x)dx=\lim_{t \to \infty}\int_a^tf(x)dx$

  • Si $\int_t^bf(x)dx$ existe para todo número $t \le a$ entonces

$\int_{-\infty}^b f(x)dx=\lim_{t \to -\infty}\int_t^bf(x)dx$

Siempre y cuando el límite exista. Se dice que las integrales impropias son convergentes si el límite existe y divergentes si el límite no existe.

  • Si tanto $\int_a^{\infty}f(x)dx$ como $\int_{-\infty}^bf(x)dx$ son convergentes, entonces definimos

$\int_{-\infty}^{\infty}f(x)dx=\int_{-\infty}^af(x)dx+\int_a^{\infty}f(x)dx$

Donde $a$ es cualquier número real. Es importante realizar varias observaciones con este tipo de integrales. La primera de ellas consiste en que no se puede obviar las fórmulas dadas y estas integrales deben evaluarse a través del uso de límites para obtener resultados correctos. Otro resultado importante es el siguiente:

$\int_1^{\infty}\frac{1}{x}dx\text{ es divergente}$

$\int_1^{\infty}\frac{1}{x^2}dx\text{ es convergente}$

La siguiente gráfica muestra la función $f(x)=\frac{1}{x^2}$

Función para integrales con infinitos
Figura 3. Función $\frac{1}{x^2}

En términos generales se puede escribir:

$\int_1^{\infty}\frac{1}{x^p}dx\text{ converge si }p>1\text{ y diverge si }p \le 1$

10. Integrales impropias por discontinuidades infinitas

Esta integral es comúnmente conocida como integral impropia de tipo 2 y presenta tres casos.

  • Si $f$ es continua en $[a,b)$ y discontinua (infinitamente) en $b$ entonces

$\int_a^bf(x)dx=\lim_{t \to b^-}\int_a^tf(x)dx$

Si este limite existe.

  • Si $f$ es continua sobre $(a,b]$ y discontinua (infinitamente) en $a$ entonces

$\int_a^bf(x)dx=\lim_{t \to a^+}\int_t^bf(x)dx$

Si este límite existe.

Se dice que las integrales impropias son convergentes si el límite existe y divergentes si el límite no existe.

  • Si $f$ tiene un discontinuidad infinita en $c$ donde $a \lt c \lt b$ y tanto $\int_a^cf(c)dx$ como $\int_c^bf(x)dx$ son convergentes, entonces definimos

$\int_a^bf(x)dx=\int_a^cf(x)dx+\int_c^bf(x)dx$

11. Teorema de comparación

Este teorema es útil cuando no se puede calcular la integral impropia, pero se desea saber si es convergente o divergente, establece lo siguiente.

Suponga que $f$ y $g$ son funciones continuas $f(x) \ge g(x) \ge 0$ para $x \ge a$

  • Si $\int_a^{\infty}f(x)dx$ es convergente, entonces $\int_a^{\infty}g(x)dx$ también lo es.
  • Si $\int_a^{\infty}g(x)dx$ es divergente, entonces $\int_a^{\infty}f(x)dx$ también lo es.

12. Artículos de Interés

https://www.ochoscar.com/2022/08/16/series/

Derivadas en Cálculo

Esta página recopila todo el material necesario para abordar los conceptos de Derivadas en Cálculo, sus definiciones, reglas y usos. En estas secciones solo se considera el caso de derivadas en una sola variable.

Si quieres iniciar en el mundo del álgebra lineal da clic en este enlace.

1. Tangentes y razones de cambio

1.1. Tangentes

En una curva se puede trazar una recta secante que corte la curva en dos puntos, así las cosas la pendiente de esta recta esta dada por:

$m_{PQ}=\frac{f(p)-f(q)}{p-q}$

En el caso en que el punto $P$ se haga acercar al punto $Q$ de forma que la recta se transforme en tangente (toque la curva en un solo punto) se tendrá el siguiente cálculo de la pendiente de la recta:

$m=\lim_{x \to a}\frac{f(x)-f(a)}{x-a}$

Es importante advertir que este límite puede no existir en punto $x=a$ determinado. La siguiente gráfica ilustra ambas rectas:

Línea secante y tangente a una curva
Figura 1. Línea secante y tangente a una curva

La expresión para calcular la recta anterior se puede reescribir de la siguiente manera:

$\text{Sea }h=x-a \text{ y } x=a+h$

Entonces:

$m=\lim_{h \to 0}\frac{f(a+h)-f(a)}{h}$

1.2. Razones de cambio

Suponga que $y$ es una cantidad que depende de otra $x$, Por tanto, $y=f(x)$, Si $x$ cambia de $x_1$ a $x_2$ entonces se conoce como incremento a la cantidad representada por:

$\Delta x = x_1-x_2$

Se llama razón promedio de cambio de $y$ con respecto a $x$ sobre el intervalo $[x1,x2]$ al cociente de las diferencias:

$\text{razón promedio de cambio}=\frac{\Delta y}{\Delta x}=\frac{f(x_2)-f(x_1)}{x_2-x_1}$

Este se puede interpretar como la pendiente de la recta secante a $PQ$. De forma similar, si se toma el límite de la expresión anterior se obtiene la razón instantánea de cambio de $y$ respecto a $x$ así:

$\text{razón instantánea de cambio}=\lim_{\Delta x \to 0}\frac{\Delta y}{\Delta x}=\lim_{x_2 \to x_1}\frac{f(x_2)-f(x_1)}{x_2-x_1}$

2. Derivadas

Tal como se vio en la sección anterior sobre el cálculo de pendientes de rectas tangentes, y usando ese resultado se define: La derivada de una función $f$ en un punto $a$ y denotada $f'(a)$ como:

$f'(a)=\lim_{h \to 0}\frac{f(a+h)-f(a)}{h}$

Si el límite existe. Alternativamente se puede escribir:

$f'(a)=\lim_{x \to a}\frac{f(x)-f(a)}{x-a}$

De esta forma la derivada puede interpretarse de las siguientes formas:

  • La pendiente de la recta tangente de la función $f$ en el punto $a$
  • La razón instantánea de cambio de $f(x)$ con respecto a $x$ cuando $x=a$

3. Derivada como una función

Si bien es posible calcular la derivada de una función en un punto determinado también se puede calcular en cualquier punto $x$ y de esta forma obtener una nueva función denominada derivada de $f$, esta función está determinada por:

$f'(x)=\lim_{h \to 0}\frac{f(x+h)-f(x)}{h}$

A continuación se muestra gráficamente una función (rojo) y su correspondiente derivada (azul). Es importante observar que cuando la gráfica de la función tiene pendiente cero, la gráfica de la derivada corta el eje $x$.

La derivada como función
Figura 2. La derivada como función

Algunas notaciones alternativas para representar la deriva se muestran a continuación:

$f'(x)=y’=\frac{dy}{dx}=\frac{df}{dx}=\frac{d}{dx}f(x)=Df(x)=D_Xf(x)=\lim_{\Delta x \to 0}\frac{\Delta y}{\Delta x}$

4. Funciones derivables y no derivables

Una función es derivable en $a$ si $f'(a)$ existe, también puede ser derivable en un intervalo abierto o cerrado si es derivable en todo número perteneciente al intervalo.


Teorema Si $f$ es derivable en $a$, $f$ es continua en $a$, note que el recíproco de este teorema es falso, es decir que una función sea continua no implica que esta sea derivable. En general una función no es derivable cuando presenta picos, o su recta tangente tiene una pendiente infinita, veamos un caso y para ello trate de calcular la derivada de la función valor absoluto:

$f(x)=|x|$

Cuya gráfica se presenta a continuación:

Gráfica del valor absoluto
Figura 3. Gráfica del valor absoluto

En este caso:

$f'(x)=1 \text{ si } x>0 \text{ y }f'(x)=-1 \text{ si } x<0 $

Por lo tanto, no se tiene una recta pendiente para esta función en $x=0$. En resumen una función no es derivable en un punto $a$ si:

  • El límite de la definición de derivada no existe
  • La función no es continua en un punto $a$
  • La gráfica presenta picos en el punto $a$
  • La función presenta pendiente vertical en el punto $a$

5. Derivadas superiores

Si $f$ es una función derivable, entonces su derivada $f’$ también es una función, y, por lo tanto, $f’$ puede tener una derivada que se denota como:

$(f’)’=f”=\frac{d}{dx}\biggl(\frac{dy}{dx}\biggr)=\frac{d^2y}{dx^2}$

Se llama segunda derivada de $f$. De forma similar se puede extender el concepto a terceras derivadas o n-ésimas derivadas de una función.

6. Interpretación alternativa de las derivadas

La primera derivada expresa la pendiente de la curva $f(x)$, por lo tanto, podemos concluir que:

  • Si la primera derivada es cero la función $f(x)$ tiene pendiente cero.
  • Si la primera derivada es positiva en un intervalo, $f(x)$ es creciente en ese intervalo.
  • Si la primera derivada es negativa en un intervalo, $f(x)$ es decreciente en ese intervalo.

La siguiente gráfica aclara este concepto:

Primera derivada
Figura 4. Primera derivada

Note que en los puntos marcados como $a$ y $b$ la pendiente de la función (primera derivada) es cero. La segunda derivada también aporta información importante acerca de $f(x)$

  • Si la segunda derivada es cero existe en ese punto, un punto de inflexión para $f(x)$, es decir, un punto donde la concavidad de $f(x)$ cambia
  • Si la segunda derivada es positiva en un intervalo, la concavidad de $f(x)$ es hacia arriba en ese intervalo
  • Si la segunda derivada es negativa en un intervalo, la concavidad de $f(x)$ es hacia abajo en ese intervalo

La siguiente gráfica aclara este concepto:

Segunda derivada
Figura 5. Segunda derivada

Note que la segunda derivada indica si la primera derivada es creciente o decreciente.

7. Tangentes a curvas paramétricas

Si se tienen las ecuaciones de una curva paramétricas de la forma:

$x=f(t) \text{ y } y=g(t)$

Donde el parámetro $t$ varía, se puede calcular la pendiente de esta curva sin necesidad de eliminar el parámetro $t$ con la siguiente aplicación de la regla de la cadena.

$\frac{dy}{dx}=\frac{\frac{dy}{dt}}{\frac{dx}{dt}}$

8. Derivación implícita

Algunas ecuaciones son imposibles de resolver en términos de $y$, de forma que se puede hallar la derivada de una ecuación (como la de un círculo) sin necesidad de resolver la ecuación para $y$ derivando ambos lados de la ecuación y utilizando la regla de la cadena, este tipo de solución puede ahorrar mucho trabajo, pero es importante tener en cuenta la regla de la cadena.

9. Trayectorias ortogonales

Dos funciones (o familias de funciones) pueden ser ortogonales si en cada punto de intersección las pendientes de las rectas tangentes en esos puntos son perpendiculares. Recuerde que dos rectas son perpendiculares siempre y cuando sus pendientes multiplicadas den $-1$

10. Aproximaciones lineales

En ocasiones es conveniente trabajar con aproximaciones de funciones en lugar de la función como tal, esto se puede hacer porque la recta tangente en un punto aa es muy similar a la función cerca del punto aa, Se conoce como linealización de $f$ en $a$ a la ecuación de la recta tangente en ese punto. La linealización de una curva $f$ en $a$ se denota como $L$ y se puede obtener así:

$L=f(a)+f'(a)(x-a)$

11. Artículos de Interés

Límites en Cálculo

Los límites se han estudiado desde hace milenios con problemas muy famosos como el de la distancia o el de la tortuga y la liebre que contradicen el sentido común, solo hasta que se instauro el Límite en el Cálculo se pudo comprender la solución de estos problemas.

Si quieres iniciar desde lo básico, da clic en este link para estudiar matemáticas operativas.

1. Definición de Límites en Cálculo

Los límites aparecen en muchos ejemplos, uno de los más representativos es el problema de la pendiente, en el cual se quiere hallar la recta tangente a un punto de una curva, para ello se seleccionan dos puntos muy cercanos de la curva y se calcula la pendiente de la recta que pasa por esos puntos.

Línea secante a una curva
Figura 1. Línea secante a una curva

Acercar los puntos cada vez más conlleva a los límites, que se puede escribir como:

$\lim_{Q \to P}m_{PQ}$

En forma más general el límite de una función f$(x)$ cuando $x$ tiende a $a$ es igual $L$ y se denota como:

$\lim_{x \to a}f(x)=L$

Si podemos acercar arbitrariamente los valores de $f(x)$ a $L$ (tanto como deseemos) escogiendo una xx lo bastante cerca de $a$, pero no igual a $a$

2. Límites en Cálculo laterales

Se escribe:

$\lim_{x \to a^-}f(x)=L$

y se dice que el límite izquierdo de $f(x)$ cuando $x$ tiende a $a$ es igual a $L$, si se puede aproximar los valores de $f(x)$ a $L$ tanto como queramos, escogiendo una $x$ lo bastante cerca de $a$ pero menor que $a$. Similarmente el limite

$\lim_{x \to a^+}f(x)=L$

pero en esta ocasión escogiendo una $x$ lo bastante cerca de $a$ pero mayor que $a$. A los anteriores límites se les conoce como límites laterales. Como consecuencia de sus definiciones se tiene que:

$\lim_{x \to a}f(x)=L \text{ si y sólo si } \lim_{x \to a^-}f(x)=L \text{ y } \lim_{x \to a^+}f(x)=L$

3. Leyes de los Límites en Cálculo

Algunas leyes de límites ayudan al cálculo de los mismos, a continuación se presentan estas leyes. Suponiendo que $c$ es una constante y que $\lim_{x \to a}f(x)=L_1$ y $\lim_{x \to a}f(x)=L_2$ existen entonces:

$\lim_{x \to a}(f(x)+g(x))=\lim_{x \to a}f(x)+\lim_{x \to a}g(x)$

$\lim_{x \to a}(f(x)-g(x))=\lim_{x \to a}f(x)-\lim_{x \to a}g(x)$

$\lim_{x \to a}(cf(x))=c\lim_{x \to a}f(x)$

$\lim_{x \to a}(f(x)g(x))=\lim_{x \to a}f(x)\cdot\lim_{x \to a}g(x)$

$\lim_{x \to a}{\frac{f(x)}{g(x)}}=\frac{\lim_{x \to a}f(x)}{\lim_{x \to a}g(x)}\text{ si } \lim_{x \to a}f(x) \neq 0$
$\lim_{x \to a}(f(x)^n)=(\lim_{x \to a}f(x))^n$

$\lim_{x \to a}c=c$

$\lim_{x \to a}x=a$

$\lim_{x \to a}x^n=a^n \text{ con }n\in\mathbb{Z}^+$

$\lim_{x \to a}\sqrt[n]{f(x)}=\sqrt[n]{\lim_{x \to a}f(x)} \text{ con }n\in\mathbb{Z}^+$

4. Propiedad de sustitución

Si $f$ es un polinomio o una función racional y $a$ está en el dominio de $f$, entonces:

$\lim_{x \to a}f(x)=f(a)$

Otra importante y útil hecho acerca de los límites expresa que en ocasiones no se puede hallar el límite de una función, pero tal vez se pueda simplificar y hallar el límite de la función más sencilla, entonces Si $f(x)=g(x)$ cuando $x \ne a$ entonces $\lim_{x \to a}f(x)=\lim_{x \to a}g(x)$, en caso que exista el límite, esto sucede porque se considera el límite es cuando $x$ se aproxima a $a$ y no cuando $x$ en realidad es igual a $a$. Lo anterior permite simplificar una función y hallar el límite de la función más simple.

5. Teorema de la compresión

Antes de definir el teorema de la compresión, el cual es muy útil, consideremos el siguiente teorema:

Si $f(x) \leq g(x)$, cuando $x$ está cerca de $a$ (excepto posiblemente en $a$), y los límites de $f$ y $g$ existen cuando $x$ tiende a $a$:

$\lim_{x \to a}f(x) \leq \lim_{x \to a}g(x)$

El teorema de la compresión entonces plantea que:

Si $f(x) \leq g(x) \leq h(x)$, cuando $x$ está cerca de $a$ (excepto posiblemente en $a$), y los límites de $f$ y $h$ existen cuando $x$ tiende a $a$ y son iguales, es decir:

$\lim_{x \to a}f(x) = \lim_{x \to a}h(x) = L$

entonces:

$\lim_{x \to a}g(x)=L$

6. Continuidad de funciones

Una función $f$ es continua en un número $a$ si:

$\lim_{x \to a}f(x)=f(a)$

La anterior definición requiere dos hechos cosas:

  • $f(a)$ está definido, es decir,  $a\in\text{dominio de}f$
  • $\lim_{x\to a}f(x)$ existe, de modo que $f$ debe estar definida en un intervalo abierto que contenga $a$

De forma similar se puede alterar un poco la definición y decir que $f$ es continua desde la derecha en un número $a$ si:

$\lim_{x \to a^+}f(x)=f(a)$

Y continua desde la izquierda en un número $a$ si:

$\lim_{x \to a^-}f(x)=f(a)$

La función $f$ es continua sobre un intervalo si es continua en todo número en el intervalo, entendiendo en los puntos extremos del intervalo que la función es continua desde la derecha o continua desde la izquierda.
Las discontinuidades de una función pueden darse por varios hechos como son:

  • Discontinuidad en el infinito, cuando la función presenta asíntotas verticales
  • Discontinuidad por salto, aquellas que son producto de por ejemplo funciones piso o techo
  • Discontinuidad removible, aquellas que pueden solventar redefiniendo la función.

7. Teoremas y propiedades de los Límites en Cálculo

Algunos resultados importantes de la continuidad de funciones se recopilan a continuación: Si $f$ y $g$ son continuas en $a$ y $c$ es una constante entonces:

  • $f+g$ es continua
  • $f−g$ es continua
  • $cf$ es continua
  • $fg$ es continua
  • $\frac{f}{g}$ si $g(a) \ne 0$ es continua
  • Cualquier polinomio es continuo en $\mathbb R$
  • Cualquier función racional es continua, siempre que esté definida, es decir es continua en su dominio; sucede lo mismo con las funciones raíz, trigonométricas, trigonométricas inversas, exponenciales y logaritmos

Si $f$ es continua en $b$ y $\lim_{x \to a}g(x)=b$, entonces, $\lim_{x\to a}f(g(x))=f(b)$ en otras palabras:

$\lim_{x\to a}f(g(x))=f(\lim_{x\to a}g(x))$

Si $g$ es continua en $a$ y $f$ es continua en $g(a)$, entonces la función compuesta $f\circ g(x)=f(g(x))$ es continua en $a$


Finalmente se presenta el teorema del valor intermedio: suponga que $f$ es continua sobre el intervalo cerrado $[a,b]$ y sea $N$ cualquier número entre $f(a)$ y $f(b)$ donde $f(a) \ne f(b)$, entonces existe un número $c$ en $(a,b)$ tal que $f(c)=N$

8. Límites en el infinito

Una función como $f(x)=\frac{1}{x^2}$ presenta comportamientos como el que se muestra en la siguiente gráfica:

Gráfico de función
Figura 2. Gráfico de función

Cuando la función se acerca a cero los valores se pueden hacer tan grandes como se desee. Lo anterior se representa como:

$\lim_{x \to a}f(x)=\infty$

Quiere decir que la función puede tomar valores arbitrariamente grandes (tan grandes como se quiera) eligiendo una $x$ lo suficientemente cercana a $a$ pero no igual a $a$

8.1. Asíntota vertical

La recta $x=a$ se conoce como asíntota vertical de la función $f(x)$ siempre y cuando se cumpla por lo menos una de las siguientes proposiciones:

  • $\lim_{x \to a}f(x)=\infty$
  • $\lim_{x \to a^-}f(x)=\infty$
  • $\lim_{x \to a^+}f(x)=\infty$
  • $\lim_{x \to a}f(x)=-\infty$
  • $\lim_{x \to a^-}f(x)=-\infty$
  • $\lim_{x \to a^+}f(x)=-\infty$

Otro caso importante de estudio consiste en la función 

$f(x)=\frac{x^2-1}{x^2+1}$

 En esta función conforme los valores de $x$ crecen más (positiva y negativamente) el valor de la función se acerca más a $1$. Por lo tanto se puede expresar que:

$\lim_{x \to \infty}\frac{x^2-1}{x^2+1}=1$

De manera que sea una función $f$ definida en algún intervalo $(a,\infty )$ entonces:

$\lim_{x \to \infty}f(x)=L$

8.2. Asíntota horizontal

Se llama asíntota horizontal de $f(x)$ a la recta $y=L$ siempre y cuando se cumpla alguna de las siguientes proposiciones:

  • $\lim_{x \to \infty}f(x)=L$
  • $\lim_{x \to -\infty}f(x)=L$

9. Resultados importantes

Algunos resultados importantes que se obtienen en el estudio de límites en el infinito son los siguientes:

  • $\lim_{x \to \infty}\frac{1}{x^n}=0$
  • $\lim_{x \to -\infty}\frac{1}{x^n}=0$
  • $\lim_{x \to -\infty}e^x=0$ También es cierto para cualquier base $a$ con $a>0$

10. Regla de L’Hopital

Esta regla permite calcular límites de forma fácil y para ello se hace uso de la derivación. La regla funciona para las siguientes formas indeterminadas, es decir límites que arrojan resultados como: $\frac{0}{0}$ o $\frac{\infty}{\infty}$ o $0 \cdot \infty$ o $\infty – \infty$ o $0^0$ o $\infty^\infty$ o $1^\infty$

La regla afirma que: suponga que $f$ y $g$ son derivables y que $g'(x) \ne 0$ cerca de $a$ excepto quizás en $a$, suponga que:

$\lim_{x \to a}f(x)=0 \text{ y }\lim_{x \to a}g(x)=0$

o que

$\lim_{x \to a}f(x)=\pm\infty \text{ y }\lim_{x \to a}g(x)=\pm\infty$

En otras palabras se tiene la forma indeterminada $\frac{0}{0}` o `\frac{\infty}{\infty}$ entonces:

$\lim_{x \to a}\frac{f(x)}{g(x)}=\frac{\lim_{x \to a}f'(x)}{\lim_{x \to a}g'(x)}$

En el caso de la forma indeterminada del producto puede llevarse a una de las formas indeterminadas expresadas en la regla de L’Hopital si se recurre a la siguiente modificación:

$fg=\frac{f}{\frac{1}{g}}$

En el caso de las diferencias indeterminadas, también se debe recurrir alguna modificación, por ejemplo sacando algún factor común o racionalizando de manera que la forma indeterminada quede expresada en término de la regla de L’Hopital. Finalmente, para el caso de las potencias indeterminadas puede recurrir al logaritmo natural de manera que se lleve a un producto indeterminado, se proceda calculando el límite y finalmente tomando el exponencial del resultado.

13. Artículos de Interés

« Entradas anteriores

© 2024 ochoscar's blog

Tema por Anders NorenArriba ↑