2016-01-27 21 views
0

我想使用导数的定义来找到函数(x)(x-1)的导数。我想我的增量是1e-2。以便它模拟限制为零。我在Range for Floats上看到我可以使用用户定义的函数创建采用浮点变量的范围函数。小范围花车的量程功能

def frange(x, y, jump): 
    while x < y: 
     yield x 
     x += jump 

    def drange(start, stop, step): 
    r = start 
    while r < stop: 
     yield r 
     r += step 

i = frange(1e-14,1e-2,2) 

for k in i: 
    set = [] 
    x = 1 
    dvt = ((x + k) * (x + k - 1) - x*(x - 1))/k 

    set.append(dvt) 
    print(set) 

当我运行程序我只得到

[0.9992007221626509] 

这是怎么回事,我没有得到一个以上的衍生添加到列表中?

+2

'jump'是'2'让你从'1E-14'去'立即1E-2' 。 –

+1

您也可以使用[sympy](http://docs.sympy.org/latest/tutorial/calculus.html#derivatives)'(x *(x-1))。diff(x)' - >' 2 * x - 1' - >'.subs({x:1})' - >'1',并使用一些[其他方法](http://stackoverflow.com/questions/9876290/how-do- i-compute-derivative-derivative-numpy) – SiggyF

回答

1

集你是说

x += jump 

这套X 2 + 1E-14的值大于1E-2

当我阅读代码,看来你可能意味着

myjump = pow(10, jump) #outside the loop 

x *= myjump # inside the loop 

这将在实施例和过程1E-14通过乘以每个回路100,1E-12,1E-10 1E ...-2

另外,如果你的意思是添加它,那么你应该说

x += myjump # inside the loop 

,或者你需要测试跳实际上是一小部分,小到足以进行处理。

+0

我认为他们想要小数部分。 –

+0

@PeterWood如果是这样的话,他不会在他的例子中使用值2。基于这个例子,这就是为什么我将他的代码读为1e2作为跳转并将其用作乘法器。如果他想增加一个价值,他会明确地放入一小部分。我会给我的答案增加可能性 – sabbahillel

0

这里是一个清理的版本:

def fn(x): 
    return x * (x - 1) 

def numerical_diff(fn, x, delta): 
    return (fn(x + delta) - fn(x))/delta 

def geometric_series(a, r, n): 
    value = a 
    for i in range(n): 
     yield value  # a * r ** i 
     value *= r 

def main(): 
    x = 1. 
    for delta in geometric_series(0.01, 0.01, 7): 
     print(
      "x = {:5.3f} f(x) = {:5.3f} delta = {:16.14f} f'(x) = {:16.14f}" 
      .format(x, fn(x), delta, numerical_diff(fn, x, delta)) 
     ) 

if __name__ == "__main__": 
    main() 

产生

x = 1.000 f(x) = 0.000 delta = 0.01000000000000 f'(x) = 1.01000000000000 
x = 1.000 f(x) = 0.000 delta = 0.00010000000000 f'(x) = 1.00009999999989 
x = 1.000 f(x) = 0.000 delta = 0.00000100000000 f'(x) = 1.00000099991773 
x = 1.000 f(x) = 0.000 delta = 0.00000001000000 f'(x) = 1.00000000392253 
x = 1.000 f(x) = 0.000 delta = 0.00000000010000 f'(x) = 1.00000008284037 
x = 1.000 f(x) = 0.000 delta = 0.00000000000100 f'(x) = 1.00008890058334 
x = 1.000 f(x) = 0.000 delta = 0.00000000000001 f'(x) = 0.99920072216265