martes, 4 de diciembre de 2012

DERIVACIÓN NUMÉRICA

El cálculo de derivadas por ordenador se tiene que realizar de manera numérica, y dentro de la relativa sencillez es un proceso complejo, que dependiendo de cada caso no se podrá saber si está bien condicionado.

El cálculo por ordenador se puede hacer aplicando la definición en forma de limite de derivada, y trabajando con números pequeños (pero no tan pequeños como nos premita el ordenador puesto que esto derivará en errores enormes).  Mediante el polinomio de Taylor se pueden obtener otras expresiones capaces de obtener un valor mejor de la derivada en un punto, trabajando con números mayores, y por lo tanto, más aconsejable.

Aqui les dejo un documento interesante (pero que se salta los pasos de como llegar a las expresiones finales) a cerca de la derivación numérica:
http://mmc2.geofisica.unam.mx/anum/Ejemplitos/DerivadaIntegral/derivacion.pdf

A continuación se muestran dos programas que calculan la derivada de una función (En este caso polinómica, pero basta con cambiar la función en el código fuente para usar otra). El primero trabaja con variables de tipo float, y el segundo con variables de tipo double:

(Las funciones D1,D2 y D3 muestran los direntes métodos para obtener la derivada, y H representa el valor límite que idealemente debería ser 0)

CON FLOAT:


#include <stdio.h>
#include <math.h>

const float pre=0.1;

float funcion(float x);
float D1(float x, float h);
float D2(float x, float h);
float D3(float x, float h);

int main(void)
{
    int i;
    float precision;
    float val;
   
    printf("\n Programa para calcular derivadas por WWW.CYPASCAL.BLOGSPOT.COM");
    printf("\n\n\n Introducir en punto en el que calcular la derivada:");
    scanf("%f",&val);
    printf("\n\n\n  VALOR DE H    TIPO D1    TIPO D2    TIPO D3\n\n");

    precision=pre;
    for(i=1;i<=10;i++)
    {
        printf("%10e %12f %12f %12f    \n\n",precision,D1(val,precision),
                D2(val,precision),D3(val,precision));
       
        precision=precision*pre;
    }
}

float funcion(float x)
{
    float a;
   
    a=x*x*x*x*x*x;//x^6
    return(a);
}

float D1(float x, float h)
{
    float a;
   
    a=(funcion(x+h)-funcion(x))/h;
   
    return(a);
}

float D2(float x, float h)
{
    float a;
   
    a=(-3*funcion(x)+4*funcion(x+h)-funcion(x+2*h))/(2*h);
   
    return(a);
}

float D3(float x, float h)
{
    float a;
   
    a=(funcion(x-2*h)-8*funcion(x-h)+8*funcion(x+h)-funcion(x+2*h))/(12*h);
   
    return(a);
}










CON DOUBLE:


#include <stdio.h>
#include <math.h>

const double pre=0.1;

double funcion(double x);
double D1(double x, double h);
double D2(double x, double h);
double D3(double x, double h);

int main(void)
{
    int i;
    double precision;
    float val;
   
    printf("\n Programa para calcular derivadas por WWW.CYPASCAL.BLOGSPOT.COM");
    printf("\n\n\n Introducir en punto en el que calcular la derivada:");
    scanf("%f",&val);
    printf("\n\n\n  VALOR DE H      TIPO D1      TIPO D2      TIPO D3\n\n");

    precision=pre;
    for(i=1;i<=20;i++)
    {
        printf("%10e %12f %12f %12f     \n\n",precision,D1(val,precision),
                D2(val,precision),D3(val,precision));
       
        precision=precision*pre;
    }
}

double funcion(double x)
{
    double a;
   
    a=x*x*x*x*x*x;
    return(a);
}

double D1(double x, double h)
{
    double a;
   
    a=(funcion(x+h)-funcion(x))/h;
   
    return(a);
}

double D2(double x, double h)
{
    double a;
   
    a=(-3*funcion(x)+4*funcion(x+h)-funcion(x+2*h))/(2*h);
   
    return(a);
}

double D3(double x, double h)
{
    float a;
   
    a=(funcion(x-2*h)-8*funcion(x-h)+8*funcion(x+h)-funcion(x+2*h))/(12*h);
   
    return(a);
}



Aquí les dejo otros artículos interesantes sobre derivación numérica:

-Codigos en C, relacionados con derivación numérica (Inglés).
-Biblioteca (librería) para derivación numérica (GNU).
-PDF de introducción a la derivación numérica (Programado en MATLAB).

Un saludo.

3 comentarios:

  1. una preguntota me puedes decir que metodo utilizaste para esto y que es val; y precision;
    otra me puedes mostrar un ejemplo resuelto para estudiarlos y si me explicas con tus palabras las formulas que utilizas esque no llego a comprender algunas por favor me seria de mucha utilidad

    ResponderEliminar
    Respuestas
    1. Intentare ayudarte lo mejor que pueda.
      El programa muestra 3 valores de la derivada en un punto
      (TIPO D1, TIPO D2, TIPO D3). Lo que hace que estos valores sean diferentes es la expresión utilizada para su cálculo.
      En TIPO D1 se aplica unicamente la expresión en forma de límite de la derivada tal que:
      D1(x)= Lim(h->0)de F(X+h)+F(X)/h;
      (El papel de h(una cantidad muy pequeña) es el que juega "precisión" en el programa. Por otro lado, X sería el punto en el que quieres calcular la derivada, que en el programa estaria representado por "val")
      En los TIPOS D2 y D3, se emplea una expresión proveniente del desarrolo del polinomio de Taylor, en las proximidades del punto en el que se quiere calcular la derivada. La diferencia entre estos dos tipos de derivadas, es el numero de terminos que se han tomado de la serie de taylor para aproximar la derivada. (Esto último así como las expresiones matemáticas utilizadas en el programa, están en el enlace que puse en la entrada)

      No tengo ningún ejemplo, pero si te interesa tengo una hoja escrita a mano explicando, más o menos, como se llega a la expresión final para el tipo D2.

      Espero haberte ayudado algo. Un Saludo

      Eliminar
  2. Intentare ayudarte lo mejor que pueda.
    El programa muestra 3 valores de la derivada en un punto
    (TIPO D1, TIPO D2, TIPO D3). Lo que hace que estos valores sean diferentes es la expresión utilizada para su cálculo.
    En TIPO D1 se aplica unicamente la expresión en forma de límite de la derivada tal que:
    D1(x)= Lim(h->0)de F(X+h)+F(X)/h;
    (El papel de h(una cantidad muy pequeña) es el que juega "precisión" en el programa. Por otro lado, X sería el punto en el que quieres calcular la derivada, que en el programa estaria representado por "val")
    En los TIPOS D2 y D3, se emplea una expresión proveniente del desarrolo del polinomio de Taylor, en las proximidades del punto en el que se quiere calcular la derivada. La diferencia entre estos dos tipos de derivadas, es el numero de terminos que se han tomado de la serie de taylor para aproximar la derivada. (Esto último así como las expresiones matemáticas utilizadas en el programa, están en el enlace que puse en la entrada)

    No tengo ningún ejemplo, pero si te interesa tengo una hoja escrita a mano explicando, más o menos, como se llega a la expresión final para el tipo D2.

    Espero haberte ayudado algo. Un Saludo

    ResponderEliminar