Myself and Das Obersturmfuhrer — henceforth known as J — were considering taking on an expression differentiator (in Lisp) recently, in his investigations J found some nice Python to do this and wondered how one might go about it in C[++]. The result of a few minutes experimentation was the following:
#include <iostream>
using namespace std;
class d
{
private:
double (*f)(double);
double h;
public:
d(double (*function)(double)) : f(function), h(0.0001) {;}
double operator()(double arg)
{
return (((*f)(arg+h)-(*f)(arg))/h);
}
};
double square(double arg)
{
return arg*arg;
}
int main()
{
cout << "square(5) = " << square(5) << endl;
cout << "d(&square)(5) = " << d(&square)(5)<< endl;
return 0;
}
If some templates were added to the functor d this would allow an open ended solution for differentiating numerical functions (albeit in a pretty crude manner); all the same I was surprised at how elegant the end result looked!
– PostScript —
Jason expounds upon the Lisp implementation:
http://jasonmc.wordpress.com/2007/01/24/fun-with-lisp/
…Being a Collection of Musings on just about anything I feel like talking about.
Sunday 21 January 2007
Subscribe to:
Post Comments (Atom)
4 comments:
hey, I just got a free $5000.00 Gift Card. you can redeem yours at Abercrombie Fitch All you have to do to get yours is Click Here to get a $5000 free gift card for your backtoschool wardrobe
Hmmm… that is an insightful point tianshangfei, but I'm not sure if I'm swayed by your argument, exactly how good is this free $5000.00 Gift Card at differentiating mathematicak functions at runtime in C[++]?
A fake trackback:
http://jasonmc.wordpress.com/2007/01/24/fun-with-lisp/
A more informed explanation available here: http://www.cs.princeton.edu/introcs/94diffeq/
Post a Comment