busqueda

martes, 11 de junio de 2013

DERIVACIÓN NUMÉRICA C++

DERIVACIÓN NUMÉRICA C++

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);
}

No hay comentarios:

Publicar un comentario