Найти - Пользователи
Полная версия: пример из книги Васильева А.Н. о дифференцировании помогите разобраться
Начало » Python для новичков » пример из книги Васильева А.Н. о дифференцировании помогите разобраться
1
zorba
 def D(f):
    def df(x, dx=0.001):
        return (f(x+dx)-f(x))/dx
    return df
def f1(x):
    return x**2
def show(F,Nmax,Xmax,dx,f):
    for i in range (Nmax + 1):
        x = i*Xmax/Nmax
       	print (F(x), F(x,dx), f(x), sep = '->')
F1 = D(f1)
print("производная (х**2)' = 2x:")
show (F1,5,1,0.01,lambda x: 2*x)

# результат работы программы
0.001->0.01->0.0
0.4009999999999986->0.4099999999999999->0.4
0.8009999999999962->0.8099999999999996->0.8
1.2010000000000076->1.21->1.2
1.6009999999999636->1.6100000000000003->1.6
2.0009999999996975->2.0100000000000007->2.0

# пытаюсь высчитывать на коленке с помощью калькулятора, чтобы понять каждый шаг итерации
получаются отнюдь не приближенные значения, а точные:
для i = 1 получаем х = 1*1/5=0,2
далее для приращения по умолчанию dx = 0,001 получаем ((0,2+0,001)**2-0,2**2)/0,001 = 0,401
для приращения dx = 0,01 получаем соответственно ((0,2+0,01)**2 - 0,2**2)/0,01 = 0,41

что делаю не так?

zorba
Васильев А.Н. “Python на примерах (Просто о сложном)” 2016г.
страница 169
py.user.next
Используй теги кода, чтобы код точно отобразить.
[code python][/code]
zorba
py.user.next
Используй теги кода, чтобы код точно отобразить.
спс
py.user.next
  
>>> def D(f):
...     def df(x, dx=0.001):
...         return (f(x + dx) - f(x)) / dx
...     return df
... 
>>> def f1(x):
...     return x ** 2
... 
>>> def show(F, Nmax, Xmax, dx, f):
...     for i in range(Nmax + 1):
...         x = i * Xmax / Nmax
...         print(i, end=': ')
...         print(round(F(x), 2), round(F(x, dx), 2), f(x), sep=' -> ')
... 
>>> F1 = D(f1)
>>> 
>>> print("производная (х**2)' = 2x:")
производная (х**2)' = 2x:
>>> 
>>> show(F1, 5, 1, 0.001, lambda x: 2 * x)
0: 0.0 -> 0.0 -> 0.0
1: 0.4 -> 0.4 -> 0.4
2: 0.8 -> 0.8 -> 0.8
3: 1.2 -> 1.2 -> 1.2
4: 1.6 -> 1.6 -> 1.6
5: 2.0 -> 2.0 -> 2.0
>>>
zorba
да округлить я и сам могу…
мне интересно, почему прога дает 0.4009999999999986->0.4099999999999999->0.4
значения, вместо 0,401 -> 0,41 -> 0,4 которые получились у меня без проги.
почти одно и тоже, но я не врублюсь.
Rodegast
> почти одно и тоже, но я не врублюсь.

Потому что арифметические операции над числами с плавающей запятой является не точными.
https://habrahabr.ru/post/112953/
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB