методы численного интегрирования вопрос python - PullRequest
0 голосов
/ 12 ноября 2018

Я пытаюсь интегрировать следующую формулу:

enter image description here

Ниже приведена моя попытка выполнить эту интеграцию с использованием домашней схемы для f(a) = sin(a).

def func(x):
    return math.sin(x)

def integration (f, n, r, a, dtheta ):

    summation = 0
    theta = 0
    while theta <= 2*np.pi:

        f_arg = a + r*np.exp(1j*theta)
        second = np.exp(-1j*theta*n)

        summation += f(f_arg) * second * dtheta
        theta += dtheta

    return math.factorial(n)*summation / (2*np.pi*r**n)

integration(func, n=1, r=1, a=0, dtheta=2*np.pi/10000)

Первая производная (n=1) f(a) = sin(a) равна f'(a) = cos(a).При оценке на a = 0 это должно дать cos(0) = 1, но это не так.Куда я иду не так?

1 Ответ

0 голосов
/ 12 ноября 2018

Похоже, ваша проблема в функции 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...