Похоже, ваша проблема в функции math.sin
, которая не поддерживает сложные аргументы:
i = np.exp(.5j * np.pi)
math.sin(i), np.sin(i)
(6.123233995736766e-17, (9.44864380126377e-17+1.1752011936438014j))
Также выдается предупреждение (но не ошибка ...):
ComplexWarning: Casting complex values to real discards the imaginary part
Использование np.sin
вместо этого решает проблему.
В общем, реализация может быть проще выразить (и легче отладить) с большим использованием numpy, например
def integration(func, a, n, r, n_steps):
z = r * np.exp(2j * np.pi * np.arange(0, 1, 1. / n_steps))
return math.factorial(n) * np.mean(func(a + z) / z**n)
np.allclose(1., integration(np.sin, a=0., n=1, r=1., n_steps=100))
True