Perdón por mencionar esto después de 6 años. Sin embargo, estaba buscando una biblioteca de este tipo para mi proyecto y he visto que @eduffy sugiere FADBAD++. He leído la documentación y volví a tu pregunta. Siento que mi respuesta será beneficiosa, por lo tanto, el siguiente código es para su caso.
#include <iostream>
#include "fadiff.h"
using namespace fadbad;
F<double> func(const F<double>& x, const F<double>& y)
{
return x*x + y*y;
}
int main()
{
F<double> x,y,f; // Declare variables x,y,f
x=1; // Initialize variable x
x.diff(0,2); // Differentiate with respect to x (index 0 of 2)
y=1; // Initialize variable y
y.diff(1,2); // Differentiate with respect to y (index 1 of 2)
f=func(x,y); // Evaluate function and derivatives
double fval=f.x(); // Value of function
double dfdx=f.d(0); // Value of df/dx (index 0 of 2)
double dfdy=f.d(1); // Value of df/dy (index 1 of 2)
std::cout << " f(x,y) = " << fval << std::endl;
std::cout << "df/dx(x,y) = " << dfdx << std::endl;
std::cout << "df/dy(x,y) = " << dfdy << std::endl;
return 0;
}
La salida es
f(x,y) = 2
df/dx(x,y) = 2
df/dy(x,y) = 2
Otro ejemplo, digamos que estamos interesados en la primera derivada de sin()
. Analíticamente, es cos
. Esto es genial porque necesitamos comparar la derivada verdadera de una función dada y su contraparte numérica para calcular el error verdadero.
#include <iostream>
#include "fadiff.h"
using namespace fadbad;
F<double> func(const F<double>& x)
{
return sin(x);
}
int main()
{
F<double> f,x;
double dfdx;
x = 0.0;
x.diff(0,1);
f = func(x);
dfdx=f.d(0);
for (int i(0); i < 8; ++i){
std::cout << " x: " << x.val() << "\n"
<< " f(x): " << f.x() << "\n"
<< " fadDfdx: " << dfdx << "\n"
<< "trueDfdx: " << cos(x.val()) << std::endl;
std::cout << "==========================" << std::endl;
x += 0.1;
f = func(x);
dfdx=f.d(0);
}
return 0;
}
El resultado es
x: 0
f(x): 0
fadDfdx: 1
trueDfdx: 1
==========================
x: 0.1
f(x): 0.0998334
fadDfdx: 0.995004
trueDfdx: 0.995004
==========================
x: 0.2
f(x): 0.198669
fadDfdx: 0.980067
trueDfdx: 0.980067
==========================
x: 0.3
f(x): 0.29552
fadDfdx: 0.955336
trueDfdx: 0.955336
==========================
x: 0.4
f(x): 0.389418
fadDfdx: 0.921061
trueDfdx: 0.921061
==========================
x: 0.5
f(x): 0.479426
fadDfdx: 0.877583
trueDfdx: 0.877583
==========================
x: 0.6
f(x): 0.564642
fadDfdx: 0.825336
trueDfdx: 0.825336
==========================
x: 0.7
f(x): 0.644218
fadDfdx: 0.764842
trueDfdx: 0.764842
==========================
Rolando uno mismo sería una mala idea. Tomé un curso de postgrado en Álgebra computacional, y las cosas ni siquiera son completas. La diferenciación simplificada podría hacerse aplicando las reglas de maty y luego tratar de sustituir y evaluar ... difícil de hacer en C/C++. – Calyth
Vea también http://stackoverflow.com/questions/627055/compute-a-derivative-using-discrete-methods y tal vez etiquete su pregunta derivada –