2016-01-27 3 views
0

Je veux trouver la dérivée d'une fonction (x) (x - 1) en utilisant la définition d'une dérivée. Je veux que mes incréments soient 1e-2. Alors qu'il simule la limite allant à zéro. J'ai vu sur Range for Floats que je pourrais utiliser des fonctions définies par l'utilisateur pour créer des fonctions de plage qui prennent des variables flottantes.Fonction de plage pour les flottants dans les petits intervalles

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) 

Quand je lance le programme que je ne reçois que

[0.9992007221626509] 

ce qui se passe que je ne reçois pas plus d'un dérivé ajouté à la liste?

+2

'jump' est' 2' vous allez donc de '1E-14' à' 1E-2' immédiatement . –

+1

Vous pouvez également différencier symboliquement en utilisant [sympy] (http://docs.sympy.org/latest/tutorial/calculus.html#derivatives) '(x * (x-1)) .diff (x)' -> ' 2 * x - 1' -> '.subs ({x: 1})' -> '1', et en utilisant quelques [autres méthodes] (http://stackoverflow.com/questions/9876290/how-do- i-compute-derived-using-numpy) – SiggyF

Répondre

1

ensemble Vous dites

x += jump 

Ceci définit la valeur de x 2 + 1E-14, qui est supérieure à 1e-2

Comme je l'ai lu le code, il semble que vous pouvez dire

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

x *= myjump # inside the loop 

Cela multiplie chaque boucle par l'intermédiaire de 100 dans l'exemple et procédé 1E-14 1E-12 1E-10 ... 1e-2

Sinon, si vous vouliez ajouter, alors vous devriez avoir dit

x += myjump # inside the loop 

ou vous devez tester ce saut est en fait une fraction qui est assez petit pour être traité.

+0

Je pense qu'ils veulent avancer d'une fraction décimale. –

+0

@PeterWood Si tel était le cas, il n'aurait pas utilisé la valeur 2 dans son exemple. Basé sur l'exemple, c'est pourquoi j'ai lu son code comme voulant 1e2 comme le saut et l'utilisant comme multiplicateur. S'il voulait ajouter une valeur, il aurait mis une fraction explicitement. J'ajouterai la possibilité à ma réponse – sabbahillel

0

Voici une version assainis:

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() 

qui produit

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