Введение: С использованием функций Бесселя связано большое количество самых разнообразных задач, относящихся почти ко всем важнейшим разделам математической физики и призванных ответить на текущие технические вопросы.
Функции Бесселя широко используются при решении задач акустики, радиофизики, гидродинамики, задач атомной и ядерной физики.
Многочисленные приложения функций Бесселя к теории теплопроводности и теории упругости (задачи о колебаниях пластин, задачи теории оболочек, задачи определения концентрации напряжений вблизи трещин).
Такая популярность функций Бесселя объясняется тем, что решение уравнений математической физики, содержащих оператор Лапласа в цилиндрических координатах, с использованием классического метода разделения переменных приводит к обыкновенному дифференциальному уравнению, служащему для определения этих функций [1].
Функции Бесселя названы в честь немецкого астронома Фридриха Бесселя, который в своей работе 1824 года, изучая движение планет вокруг Солнца, вывел рекуррентные соотношения для функций Бесселя.
, получил за целое
интегральное представление функции
, доказал существование бесконечного числа нулей функции
и составил первые таблицы для функций
И
.
Однако впервые одна из функций Бесселя
был рассмотрен еще в 1732 году Даниэлем Бернулли в работе, посвященной колебаниям тяжелых цепей.
Д.
Бернулли нашел выражение для функции
в виде степенного ряда и заметил (без доказательства), что уравнение
имеет бесчисленное множество реальных корней.
Следующей работой, в которой фигурируют функции Бесселя, стала работа Леонардо Эйлера 1738 года, посвященная изучению колебаний круговой мембраны.
В этой работе Л.
Файлер нашел для целых чисел
Выражение функции Бесселя
в виде ряда по степеням
, а в последующих работах распространил это выражение на случай произвольных значений индекса
.
Кроме того, Л.
Эйлер доказал, что для
, равная полуторному целому числу, функция
выражаются через элементарные функции.
Он заметил (без доказательства), что на самом деле
функции
имеют бесконечное число вещественных нулей и дали интегральное представление для
.
Некоторые исследователи полагают, что основные результаты, связанные с функциями Бесселя и их приложениями в математической физике, связаны с именем Л.
Эйлера.
Свободно распространяемая программа символьной математики SymPy, библиотека Python, позволяет изучать свойства функций Бесселя и одновременно осваивать методы решения уравнений, которые можно свести к функциям Бесселя.
В программе символьной математики SymPy графики функций Бесселя первого рода целых порядков можно построить с помощью соотношения для суммы ряда:
Функции Бесселя первого рода
from sympy import* from sympy.plotting import plot x,n, p=var('x,n, p') def besselj(p,x): return summation(((-1)**n*x**(2*n+p))/(factorial(n)*gamma(n+p+1)*2**(2*n+p)),[n,0,oo]) st="J_{p}(x)" p1=plot(besselj(0,x),(x,-20,20),line_color='b',title='$'+st+ '$',show=False) p2=plot(besselj(1,x),(x,-20,20),line_color='g',show=False) p3=plot(besselj(2,x),(x,-20,20),line_color='r',show=False) p4=plot(besselj(3,x),(x,-20,20),line_color='c',show=False) p1.extend(p2) p1.extend(p3) p1.extend(p4) p1.show()
Используя соотношение для суммы ряда, можно доказать свойство этих функций для целых порядков
Свойство функции Бесселя первого рода
from sympy import*
from sympy.plotting import plot
x,n, p=var('x,n, p')
def besselj(p,x):
return summation(((-1)**n*x**(2*n+p))/(factorial(n)*gamma(n+p+1)*2**(2*n+p)),[n,0,oo])
st="J_{1}(x)=-J_{-1}(x)"
p1=plot(besselj(1,x),(x,-10,10),line_color='b',title='$'+st+ '$',show=False)
p2=plot(besselj(-1,x),(x,-10,10),line_color='r',show=False)
p1.extend(p2)
p1.show()
Для демонстрации условий Коши построим функцию
и его производная
: Функция дробного порядка и ее производная
from sympy import*
from sympy.plotting import plot
x,n, p=var('x,n, p')
def besselj(p,x):
return summation(((-1)**n*x**(2*n+p))/(factorial(n)*gamma(n+p+1)*2**(2*n+p)),[n,0,oo])
st="J_{1/3}(x),J{}'_{1/3}(x)"
p1=plot(besselj(1/3,x),(x,-1,10),line_color='b',title='$'+st+ '$',ylim=(-1,2),show=False)
def dbesselj(p,x):
return diff(summation(((-1)**n*x**(2*n+p))/(factorial(n)*gamma(n+p+1)*2**(2*n+p)),[n,0,oo]),x)
p2=plot(dbesselj(1/3,x),(x,-1,10),line_color='g',show=False)
p1.extend(p2)
p1.show()
Однако для практических расчетов используется замечательный модуль mpmath, позволяющий не только численно решать уравнения с функциями Бесселя первого и второго рода, в том числе модифицированными всех допустимых порядков, но и строить графики с автоматическим масштабированием.
Кроме того, модуль mpmath не требует специальных инструментов для совместного использования символьной и числовой математики.
Об истории создания этого модуля и возможности его использования для обратного преобразования Лапласа я уже рассказывал в публикации [2].
Теперь продолжим рассмотрение mpmath для работы с функциями Бесселя [3].
Функция Бесселя первого рода
mpmath.besselj(n, x, производная=0) — дает функцию Бесселя первого рода
.
Функции
является решением следующего дифференциального уравнения:
Для положительных целых чисел
ведет себя как синус или косинус, умноженный на коэффициент, который медленно убывает по мере
Функция Бесселя первого рода
является частным случаем гипергеометрической функции
:
Функцию Бесселя можно дифференцировать
раз, при условии, что m-я производная не равна нулю:
Функция Бесселя первого рода
для натуральных порядков n = 0,1,2,3 - решение уравнения Бесселя:
from mpmath import*
j0 = lambda x: besselj(0,x)
j1 = lambda x: besselj(1,x)
j2 = lambda x: besselj(2,x)
j3 = lambda x: besselj(3,x)
plot([j0,j1,j2,j3],[0,14]
Функция Бесселя первого рода
в комплексной плоскости: from sympy import*
from mpmath import*
cplot(lambda z: besselj(1,z), [-8,8], [-8,8], points=50000)
Примеры:
Функция
выдает результат с заданным количеством цифр
после десятичной точки:
from mpmath import*
mp.dps = 15; mp.pretty = True
print(besselj(2, 1000))
nprint(besselj(4, 0.75))
nprint(besselj(2, 1000j))
mp.dps = 25
nprint( besselj(0.75j, 3+4j))
mp.dps = 50
nprint( besselj(1, pi))
Аргументом функции может быть большое число:
from mpmath import*
mp.dps = 25
nprint( besselj(0, 10000))
nprint(besselj(0, 10**10))
nprint(besselj(2, 10**100))
nprint( besselj(2, 10**5*j))
Функции Бесселя первого рода удовлетворяют простым симметриям относительно
: from sympy import*
from mpmath import*
mp.dps = 15
nprint([besselj(n,0) for n in range(5)])
nprint([besselj(n,pi) for n in range(5)])
nprint([besselj(n,-pi) for n in range(5)])
Корни не периодические, но расстояние между последовательными корнями асимптотически приближается
.
Функции Бесселя первого рода имеют следующий код:
from mpmath import*
print(quadosc(j0, [0, inf], period=2*pi))
print(quadosc(j1, [0, inf], period=2*pi))
Для
или
Функция Бесселя сводится к тригонометрической функции: from sympy import*
from mpmath import*
x = 10
print(besselj(0.5, x))
print(sqrt(2/(pi*x))*sin(x))
print(besselj(-0.5, x))
print(sqrt(2/(pi*x))*cos(x))
Производные любого порядка можно вычислить, отрицательные порядки соответствуют интегрированию :
from mpmath import*
mp.dps = 25
print(besselj(0, 7.5, 1))
print(diff(lambda x: besselj(0,x), 7.5))
print(besselj(0, 7.5, 10))
print(diff(lambda x: besselj(0,x), 7.5, 10))
print(besselj(0,7.5,-1) - besselj(0,3.5,-1))
print(quad(j0, [3.5, 7.5]))
Дифференцирование с нецелым порядком дает дробную производную в смысле дифференциального интеграла Римана-Лиувилля, вычисляемого с помощью функции
:
from mpmath import*
mp.dps = 15
print(besselj(1, 3.5, 0.75))
print(differint(lambda x: besselj(1, x), 3.5, 0.75))
Другие способы вызова функции Бесселя первого рода нулевого и первого порядков мпмат.j0(х) — Вычисляет функцию Бесселя
; мпмат.j1(х) — Вычисляет функцию Бесселя
; Функции Бесселя второго рода бессели(n, x, производная=0) Вычисляет функцию Бесселя второго рода по соотношению:
Для целого числа
следующую формулу следует понимать как предел.
Функцию Бесселя можно дифференцировать
раз, при условии, что m-я производная не равна нулю:
Функция Бесселя второго рода
для положительных целых порядков
.
from sympy import*
from mpmath import*
y0 = lambda x: bessely(0,x)
y1 = lambda x: bessely(1,x)
y2 = lambda x: bessely(2,x)
y3 = lambda x: bessely(3,x)
plot([y0,y1,y2,y3],[0,10],[-4,1])
Функция Бесселя 2-го рода
в сложной плоскости from sympy import*
from mpmath import*
cplot(lambda z: bessely(1,z), [-8,8], [-8,8], points=50000)
Примеры:
Некоторые значения функции
: from sympy import*
from mpmath import*
mp.dps = 25; mp.pretty = True
print(bessely(0,0))
print(bessely(1,0))
print(bessely(2,0))
print(bessely(1, pi))
print(bessely(0.5, 3+4j))
Аргументы могут быть большими: from sympy import*
from mpmath import*
mp.dps = 25; mp.pretty = True
print(bessely(0, 10000))
print(bessely(2.5, 10**50))
print(bessely(2.5, -10**50))
Производные любого порядка, в том числе отрицательные, можно вычислять: from sympy import*
from mpmath import*
mp.dps = 25; mp.pretty = True
print(bessely(2, 3.5, 1))
print(diff(lambda x: bessely(2, x), 3.5))
print(bessely(0.5, 3.5, 1))
print(diff(lambda x: bessely(0.5, x), 3.5))
print(diff(lambda x: bessely(2, x), 0.5, 10))
print(bessely(2, 0.5, 10))
print(bessely(2, 100.5, 100))
print(quad(lambda x: bessely(2,x), [1,3]))
print(bessely(2,3,-1) - bessely(2,1,-1))
Модифицированная функция Бесселя первого рода.
mpmath.besseli(n, x, derivative=0)
бессели(n, x, производная=0) модифицированная функция Бесселя первого рода
Модифицированная функция Бесселя
для реальных заказов
: from mpmath import*
i0 = lambda x: besseli(0,x)
i1 = lambda x: besseli(1,x)
i2 = lambda x: besseli(2,x)
i3 = lambda x: besseli(3,x)
plot([i0,i1,i2,i3],[0,5],[0,5])
Модифицированная функция Бесселя
в сложной плоскости from mpmath import*
cplot(lambda z: besseli(1,z), [-8,8], [-8,8], points=50000)
Примеры:
Некоторые значения
from mpmath import*
mp.dps = 25; mp.pretty = True
print(besseli(0,0))
print(besseli(1,0))
print(besseli(0,1))
print(besseli(3.5, 2+3j))
Аргументы могут быть большими: from mpmath import*
mp.dps = 25; mp.pretty = True
print(besseli(2, 1000))
print(besseli(2, 10**10))
print(besseli(2, 6000+10000j))
Для целых чисел n имеет место следующее интегральное представление: from mpmath import*
mp.dps = 15; mp.pretty = True
n = 3
x = 2.3
print(quad(lambda t: exp(x*cos(t))*cos(n*t), [0,pi])/pi)
print(besseli(n,x))
Производные любого порядка можно вычислить: from mpmath import*
mp.dps = 25; mp.pretty = True
print(besseli(2, 7.5, 1))
print(diff(lambda x: besseli(2,x), 7.5))
print(besseli(2, 7.5, 10))
print(diff(lambda x: besseli(2,x), 7.5, 10))
print(besseli(2,7.5,-1) - besseli(2,3.5,-1))
print(quad(lambda x: besseli(2,x), [3.5, 7.5]))
Модифицированные функции Бесселя второго рода mpmath.besselk(n, x)
бесселк(n, x) модифицированные функции Бесселя второго рода
Для целого числа
эту формулу следует понимать как предел.
Модифицированная функция Бесселя 2-го рода.
серьезно
: from mpmath import*
k0 = lambda x: besselk(0,x)
k1 = lambda x: besselk(1,x)
k2 = lambda x: besselk(2,x)
k3 = lambda x: besselk(3,x)
plot([k0,k1,k2,k3],[0,8],[0,5])
Модифицированная функция Бесселя 2-го рода.
в сложной плоскости from mpmath import*
cplot(lambda z: besselk(1,z), [-8,8], [-8,8], points=50000)
Примеры:
Сложные и сложные аргументы: from mpmath import *
mp.dps = 25; mp.pretty = True
print(besselk(0,1))
print(besselk(0, -1))
print(besselk(3.5, 2+3j))
print(besselk(2+3j, 0.5))
Аргументы — это большие числа.
from mpmath import *
mp.dps = 25; mp.pretty = True
print(besselk(0, 100))
print(besselk(1, 10**6))
print(besselk(1, 10**6*j))
print(besselk(4.5, fmul(10**50, j, exact=True)))
Особенности поведения функции в точке
: from mpmath import *
print(besselk(0,0))
print(besselk(1,0))
for n in range(-4, 5):
print(besselk(n, '1e-1000'))
Нули функции Бесселя besseljzero()
mpmath.besseljzero(v, m, derivative=0)
Для реального заказа
и положительное целое число
возвращает
, m-й положительный нуль функции Бесселя первого рода
(см.
бессель () ).
Альтернативно, с
, дает первый неотрицательный простой нуль
от
.
Обозначение по соглашению об индексации с использованием Abramowitz & Stegun и DLMF. Обратите внимание на особый случай
, а все остальные нули положительны.
В действительности учитываются только простые нули (все нули функций Бесселя являются простыми, за исключением случаев, когда
), И
становится монотонной функцией
И
.
Нули чередуются согласно неравенствам:
Примеры:
Ведущие нули функций Бесселя
,
,
from mpmath import *
mp.dps = 25; mp.pretty = True
print(besseljzero(0,1))
print(besseljzero(0,2))
print(besseljzero(0,3))
print(besseljzero(1,1))
print(besseljzero(1,2))
print(besseljzero(1,3))
print(besseljzero(2,1))
print(besseljzero(2,2))
print(besseljzero(2,3))
Ведущие нули производных функций Бесселя
,
,
from mpmath import *
mp.dps = 25; mp.pretty = True
print(besseljzero(0,1,1))
print(besseljzero(0,2,1))
print(besseljzero(0,3,1))
print(besseljzero(1,1,1))
print(besseljzero(1,2,1))
print(besseljzero(1,3,1))
print(besseljzero(2,1,1))
print(besseljzero(2,2,1))
print(besseljzero(2,3,1))
Нули с большим индексом: from mpmath import *
mp.dps = 25; mp.pretty = True
print(besseljzero(0,100))
print(besseljzero(0,1000))
print(besseljzero(0,10000))
print(besseljzero(5,100))
print(besseljzero(5,1000))
print(besseljzero(5,10000))
print(besseljzero(0,100,1))
print(besseljzero(0,1000,1))
print(besseljzero(0,10000,1))
Нули функций старшего порядка: from mpmath import *
mp.dps = 25; mp.pretty = True
print(besseljzero(50,1))
print(besseljzero(50,2))
print(besseljzero(50,100))
print(besseljzero(50,1,1))
print(besseljzero(50,2,1))
print(besseljzero(50,100,1))
Нули функций дробного порядка: from mpmath import *
mp.dps = 25; mp.pretty = True
print(besseljzero(0.5,1))
print(besseljzero(1.5,1))
print(besseljzero(2.25,4))
И
.
И
могут быть выражены как бесконечные произведения их нулей: from mpmath import *
mp.dps = 6; mp.pretty = True
v,z = 2, mpf(1)
nprint((z/2)**v/gamma(v+1) * \
nprod(lambda k: 1-(z/besseljzero(v,k))**2, [1,inf]))
print(besselj(v,z))
nprint((z/2)**(v-1)/2/gamma(v) * \
nprod(lambda k: 1-(z/besseljzero(v,k,1))**2, [1,inf]))
print(besselj(v,z,1))
besselyzero()
mpmath.besselyzero(v, m, derivative=0)
Для реального заказа
и положительное целое число
возвращает
,
, m-й положительный нуль функции Бесселя второго рода
(см.
Бессели() ).
Альтернативно, с
, дает первый положительный ноль
Теги: #Разработка для Windows #python #математика #программирование #SciPy #sympy #уравнение Бесселя #mpmath модуль
-
Идеальные Системы Для 3D-Рендеринга
19 Oct, 24 -
Парадигма
19 Oct, 24 -
Рендеринг Облаков На Мобильных Устройствах
19 Oct, 24 -
Микро Бд Для Настройки На Микроконтроллере
19 Oct, 24