/ / Range Funzione per float in piccoli intervalli - python, python-3.x, calcolo, differenziazione

Range Function per Floats in piccoli intervalli - python, python-3.x, calcolo, differenziazione

Voglio trovare la derivata di una funzione (x) (x - 1) usando la definizione di una derivata. Voglio che i miei incrementi siano 1e-2. In modo che simuli il limite andando a zero. Ho visto su Gamma per galleggianti che potrei usare le funzioni definite dall'utente per creare funzioni di intervallo che prendono variabili 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)

Quando eseguo il programma ottengo solo

[0.9992007221626509]

Che cosa sta succedendo che non sto ottenendo più di un derivato aggiunto alla lista?

risposte:

1 per risposta № 1

set Stai dicendo

x += jump

Questo imposta il valore di x su 2 + 1e-14 che è maggiore di 1e-2

Mentre leggo il codice, sembra che tu possa voler dire

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

x *= myjump # inside the loop

Questo moltiplicherà ogni ciclo di 100 nell'esempio ed elabora 1e-14, 1e-12, 1e-10 ... 1e-2

In alternativa, se intendevi aggiungerlo, allora avresti dovuto dirlo

x += myjump # inside the loop

o è necessario verificare che il salto sia in realtà una frazione abbastanza piccola da essere elaborata.


0 per risposta № 2

Ecco una versione ripulita:

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

che produce

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