2016-01-27 2 views
0

Я хочу найти производную функции (x) (x - 1), используя определение производной. Я хочу, чтобы мои приращения были 1e-2. Так что он имитирует лимит, равный нулю. Я видел на Range for Floats, что я мог бы использовать пользовательские функции для создания функций диапазона, которые принимают переменные float.Функция диапазона для поплавков в малых интервалах

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-производная-использование-numpy) – SiggyF

ответ

1

набора Вы говорите

x += jump 

Это устанавливает значение х на 2 + 1e-14, которая больше, чем 1e-2

Как я прочитал код, кажется, что вы можете означать

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

x *= myjump # inside the loop 

Это будет умножить каждую петлю через на 100 в примере, и процесс 1e-14, 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 
Смежные вопросы