Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 8, 2017 22:56:56

zorba
Зарегистрирован: 2017-04-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

пример из книги Васильева А.Н. о дифференцировании помогите разобраться

 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 (Апрель 9, 2017 02:25:02)

Офлайн

#2 Апрель 8, 2017 22:58:48

zorba
Зарегистрирован: 2017-04-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

пример из книги Васильева А.Н. о дифференцировании помогите разобраться

Васильев А.Н. “Python на примерах (Просто о сложном)” 2016г.
страница 169

Офлайн

#3 Апрель 9, 2017 02:15:54

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9995
Репутация: +  857  -
Профиль   Отправить e-mail  

пример из книги Васильева А.Н. о дифференцировании помогите разобраться

Используй теги кода, чтобы код точно отобразить.

[code python][/code]



Офлайн

#4 Апрель 9, 2017 02:27:36

zorba
Зарегистрирован: 2017-04-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

пример из книги Васильева А.Н. о дифференцировании помогите разобраться

py.user.next
Используй теги кода, чтобы код точно отобразить.
спс

Офлайн

#5 Апрель 9, 2017 04:19:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9995
Репутация: +  857  -
Профиль   Отправить e-mail  

пример из книги Васильева А.Н. о дифференцировании помогите разобраться

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



Офлайн

#6 Апрель 9, 2017 10:55:19

zorba
Зарегистрирован: 2017-04-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

пример из книги Васильева А.Н. о дифференцировании помогите разобраться

да округлить я и сам могу…
мне интересно, почему прога дает 0.4009999999999986->0.4099999999999999->0.4
значения, вместо 0,401 -> 0,41 -> 0,4 которые получились у меня без проги.
почти одно и тоже, но я не врублюсь.

Офлайн

#7 Апрель 9, 2017 12:20:31

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2825
Репутация: +  185  -
Профиль   Отправить e-mail  

пример из книги Васильева А.Н. о дифференцировании помогите разобраться

> почти одно и тоже, но я не врублюсь.

Потому что арифметические операции над числами с плавающей запятой является не точными.
https://habrahabr.ru/post/112953/



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version