Compute a derivative using discrete methods

Ryan picture Ryan · Mar 9, 2009 · Viewed 21.6k times · Source

I am looking for a method to compute a derivative using a discrete and fast method. Since now I do not know the type of equation I have, I am looking for discrete methods analog to the ones that we can find for the integral such as, the Euler method.

Answer

Andrea Ambu picture Andrea Ambu · Mar 10, 2009

I think you are looking for the derivative calculated in a point. If this is the case, here there is a simple way to do that. You need to know the derivative in a point, say a. It is given by the limit of the difference quotient for h->0:

difference quotient

You actually need to implement the limit function. So you:

  • Define an epsilon, set it more small to be more precise, bigger to be faster
  • calculate the difference quotient in a starting h, suppose h=0.01, store it in f1
  • Now in a DO-WHILE loop:

    1- divide h by 2 (or by 10, the important thing is to make it smaller)
    2- calculate again the difference quotient with the new value of h, store this in f2
    3- set diff = abs(f2-f1)
    4- assign f1 = f2
    5- repeat from point 1 while (diff>epsilon)

  • You can finally return f1 (or f2) as the value of your f'(a)

Remember: You are assuming the function is differentiable in a. Every result you will get will be wrong due of errors of the finite decimal digit your computer can handle, there is no escape from this.

Example in python:

def derive(f, a, h=0.01, epsilon = 1e-7):
    f1 = (f(a+h)-f(a))/h
    while True: # DO-WHILE
        h /= 2.
        f2 = (f(a+h)-f(a))/h
        diff = abs(f2-f1)
        f1 = f2
        if diff<epsilon: break
    return f2

print "derivatives in x=0"
print "x^2: \t\t %.6f" % derive(lambda x: x**2,0)
print "x:\t\t %.6f" % derive(lambda x: x,0)
print "(x-1)^2:\t %.6f" % derive(lambda x: (x-1)**2,0)

print "\n\nReal values:"
print derive(lambda x: x**2,0)
print derive(lambda x: x,0)
print derive(lambda x: (x-1)**2,0)

Output:

derivatives in x=0
x^2:         0.000000
x:       1.000000
(x-1)^2:     -2.000000


Real values:
7.62939453125e-08
1.0
-1.99999992328

The first time I've got "precise" value" because of using only the first 6 digits of the result, note I used 1e-7 as epsilon. The REAL calculated values are printed after that, and they are obviously mathematically wrong. The choose of how small epsilon is depends on how precise you want your results to be.