Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compute a derivative using discrete methods

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.

like image 736
Ryan Avatar asked Mar 09 '09 16:03

Ryan


People also ask

What is derivative in discrete math?

Note the discrete derivative is the difference quotient of two consecutive points of the sequence with denominator equal to one. Since a sequence is indexed by the natural numbers, this is as close as we can get to the derivative of calculus.

Can we differentiate a discrete function?

With a discrete function representation, we can easily integrate and differentiate the function too.


3 Answers

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.

like image 78
Andrea Ambu Avatar answered Oct 29 '22 03:10

Andrea Ambu


There is quite a bit of theory (and established practice) in calculating numerical ("finite") derivatives. Getting all the details correct, such that you believe the result, is not trivial. If there's any way you can get the analytical derivative of the function (using pen and paper, or a computer algebra system such as Maple, Mathematica, Sage, or SymPy), this is by far the best option.

If you can't get the analytical form, or you don't know the function (just it's output), then numerical estimation are your only option. This chapter in Numerical Recipies in C is a good start.

like image 23
Barry Wark Avatar answered Oct 29 '22 02:10

Barry Wark


A simple method is to compute the change in f over a small value for each point of the derivative you're interested in. For example, to compute ∂f/∂x, you could use this:

epsilon = 1e-8
∂f/∂x(x, y, z) = (f(x+epsilon,y,z) - f(x-epsilon, y, z))/(epsilon * 2);

The other partials would be similar in y and z.

The value chosen for epsilon depends on the contents of f, the precision required, the floating point type used, and probably other things. I suggest you experiment with values for it with functions you're interested in.

like image 34
Jesse Rusak Avatar answered Oct 29 '22 02:10

Jesse Rusak