2016-01-27 20 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