使用离散方法计算导数

Rya*_*yan 10 discrete-mathematics derivative

我正在寻找一种使用离散和快速方法计算导数的方法.从现在起我不知道我所拥有的等式的类型,我正在寻找类似于我们可以找到的积分的离散方法,例如欧拉方法.

And*_*mbu 10

我认为你正在寻找一个点计算的导数.如果是这种情况,这里有一个简单的方法.你需要知道一个点的导数,比如a.它由h-> 0的差商的极限给出:

差商

您实际上需要实现限制功能.那么你:

  • 定义一个epsilon,将其设置得更小,更精确,更大,更快
  • 计算起始h中的差商,假设h = 0.01,将其存储在f1中
  • 现在在DO-WHILE循环中:

    1-将h除以2(或10,重要的是使其变小)
    2再次计算与h的新值的差商,将其存储在f2
    3- set diff = abs(f2-f1)
    4 - 指定f1 = f2
    5-重复点1,而(diff> epsilon)

  • 你最终可以返回f1(或f2)作为你的f'(a)的值

记住:你假设函数在a中是可微.由于计算机可以处理的有限十进制数字的错误,您将得到的每个结果都是错误的,没有逃脱.

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)
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

第一次我得到"精确"值"因为只使用结果的前6位数字,注意我使用1e-7作为epsilon.之后打印出REAL计算值,它们显然在数学上是错误的.选择小ε是多少取决于您希望结果的精确程度.


Bar*_*ark 7

在计算数值("有限")导数时,有相当多的理论(和惯例).获得所有细节是正确的,这样您相信结果并非易事.如果有任何方法可以获得函数的分析导数(使用笔和纸,或计算机代数系统,如Maple,Mathematica,SageSymPy),这是迄今为止最好的选择.

如果您无法获得分析表格,或者您不知道该功能(只是它的输出),那么数值估算是您唯一的选择.C中的数字接收这一是一个好的开始.


duf*_*ymo 0

我假设您的函数比您发布的简单函数更复杂,因为封闭式解决方案太简单了。

当您使用“离散”这个词时,我认为您需要“有限差异”。您需要一些离散化来计算近似值。

Df/Dx ~ (f2-f1)/(x2-x1) 等