В вашем коде есть по крайней мере некоторые проблемы:
- Ваш пробел начинается с
0
, поэтому при оценке функции для интеграции в началетрапецеидальный интеграл, у вас есть: sin(0)/0 = nan
.Вы должны использовать числовой ноль вместо точного нуля (в приведенном ниже примере я использовал 1e-12
) - Когда вы получите первый
nan
, nan + 1.0 = nan
: это означает, что в вашем коде, когда вы суммируете интеграл по интервалам, первый nan
запутывает все ваши результаты. - только для Python 2 : Деление
2/256
- это деление между двумя целыми числами, и результат равен 0
.Вместо этого попробуйте 2.0/256.0
(спасибо @MaxU за указание на это).
Это ваш код исправлен (я запускаю его в python2, это то, что установлено на компьютере, яиспользуя сейчас):
from scipy import integrate
import numpy as np
exact = integrate.quad(lambda x : (np.sin(x))/x, 0, 2*np.pi)[0]
print("Exact value of integral:", exact)
# Approx of sin(x)/x by Trapezoidal rule
x = np.linspace(1e-12, 2*np.pi, 257) # <- 0 has become a numeric 0
f = lambda x : (np.sin(x))/x
approximation = np.trapz(f(x), x)
print ("Estimated value of trapezoidal O(h^2):", round(approximation, 5),
'+', round((2.0/256.0)**2, 5))
print ("real error:", exact - approximation)
# Approx of sin(x)/x by Simpsons 1/3 rule
approximation = integrate.simps(f(x), x)
print("Estimated value of simpsons O(h^4):", round(approximation, 9),
'+', round((2/256)**4, 9))
print ("real error:", exact - approximation)
с его выводом:
('Exact value of integral:', 1.4181515761326284)
('Estimated value of trapezoidal O(h^2):', 1.41816, '+', 6e-05)
('real error:', -7.9895502944626884e-06)
('Estimated value of simpsons O(h^4):', 1.418151576, '+', 0.0)
('real error:', 2.7310242955991271e-10)
Discalimer Предел sin(x)/x -> 1 for x -> 0
, но из-за плавающего округления для sin(1e-12)/1e-13 = 1
!