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.
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.
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.
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.
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$.
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$
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.
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.
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.
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ó.
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.
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.
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.
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.
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.
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.
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:
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.
Constructor con parámetros, que recibe parámetros referentes a los atributos y normalmente los asigna a los mismos.
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 variable
Valor inicial
boolean
false
byte, short, int, long
0
float, double
0.0
char
‘\0000’ (NUL)
Referencias
null
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.
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.
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 dato
Tamaño
boolean
8 bit (false, true)
byte
8 bit (-128 a 127)
short
16 bit (-2^15 a 2^15-1)
int
32 bit (-2^31 a 2^31-1)
long
64 bit (-2^63 a 2^63-1)
float
32 bit (±3.4×10^-38 a ± 3.4×10^38)
double
64 bit (±1.8×10^-308 a ± 1.8×10^308)
char
16 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()
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.
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.
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();
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.
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.
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:
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:
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.
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:
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:
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:
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:
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 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).
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
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}$
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.
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.
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:
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$.
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:
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:
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:
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:
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.
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í:
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.
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.
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}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:
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:
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.