19 декабря 2016

Специальные функции (scipy.special)


Основной особенностью пакета  scipy.special является определение множества специальных функций математической физики. Доступные функции включают в себя функцию Э́йри, эллиптические, бесселевы, гамма, бета, гипергеометрический, параболический цилиндр, Матье, сферическую волну, Струве и Кельвина. Есть также некоторые статистические функции низкого уровня, которые не предназначены для общего использования в качестве более простого интерфейс к этим функциям используется модуль статистики . Большинство из этих функций могут принимать массивы и возвращают результаты массива по тем же правилам, что и другие математические функции в численном Python. Многие из этих функций также принимают комплексные числа в качестве входных данных. Для получения полного списка доступных функций с описанием типа одной строкой >>> help(special). Каждая функция также имеет свою собственную документацию, доступную с помощью справки. Если вы не видите нудную вам функцию, рассмотрите возможность написания документации и внесения ее в библиотеку. Вы можете написать функцию на любом языке: C, Fortran, или Python. Посмотрите исходный код библиотеки для примеров каждого из этих видов функций.

Функции Бесселя вещественного порядка (jn, jn_zeros)


Функции Бесселя представляют собой семейство решений дифференциального уравнения Бесселя с вещественного или комплексного альфа порядка:



Помимо прочего, эти функции возникают в задачах распространения волн, таких как колебательных мод тонкой головки барабана. Ниже приведен пример круглой барабанной перепонки:

>>> from scipy import special
>>> def drumhead_height(n, k, distance, angle, t):
...    kth_zero = special.jn_zeros(n, k)[-1]
...    return np.cos(t) * np.cos(n*angle) * special.jn(n, distance*kth_zero)
>>> theta = np.r_[0:2*np.pi:50j]
>>> radius = np.r_[0:1:50j]
>>> x = np.array([r * np.cos(theta) for r in radius])
>>> y = np.array([r * np.sin(theta) for r in radius])
>>> z = np.array([drumhead_height(1, 1, r, theta, 0.5) for r in radius])

>>> import matplotlib.pyplot as plt
>>> from mpl_toolkits.mplot3d import Axes3D
>>> from matplotlib import cm
>>> fig = plt.figure()
>>> ax = Axes3D(fig)
>>> ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap=cm.jet)
>>> ax.set_xlabel('X')
>>> ax.set_ylabel('Y')
>>> ax.set_zlabel('Z')
>>> plt.show()