Bessel-Funktionen im SymPy Symbolic Math Program

Einführung:
Mit der Anwendung von Bessel-Funktionen ist eine Vielzahl der unterschiedlichsten Probleme verbunden, die sich auf fast alle wichtigen Bereiche der mathematischen Physik beziehen und auf die Beantwortung aktueller technischer Fragen ausgelegt sind.

Bessel-Funktionen werden häufig zur Lösung von Problemen der Akustik, Radiophysik, Hydrodynamik sowie der Atom- und Kernphysik eingesetzt. Zahlreiche Anwendungen der Bessel-Funktionen auf die Theorie der Wärmeleitfähigkeit und die Theorie der Elastizität (Probleme bei Plattenschwingungen, Probleme der Schalentheorie, Probleme bei der Bestimmung der Spannungskonzentration in der Nähe von Rissen).

Diese Popularität von Bessel-Funktionen erklärt sich aus der Tatsache, dass das Lösen von Gleichungen der mathematischen Physik, die den Laplace-Operator in Zylinderkoordinaten enthalten, mit der klassischen Methode der Variablentrennung zu einer gewöhnlichen Differentialgleichung führt, die zur Bestimmung dieser Funktionen dient [1].

Bessel-Funktionen sind nach dem deutschen Astronomen Friedrich Bessel benannt, der 1824, als er die Bewegung von Planeten um die Sonne untersuchte, Wiederholungsrelationen für Bessel-Funktionen ableitete Jv(x) für ganze Zahlen empfangen v integrale Darstellung einer Funktion Jv(x) bewies die Existenz unzähliger Funktionsnullen J0(x) und kompilierte die ersten Tabellen für Funktionen J1(x) und J2(x) .

Zum ersten Mal jedoch eine der Funktionen von Bessel J0(x) Es wurde bereits 1732 von Daniel Bernoulli in einer Arbeit über die Schwingung schwerer Ketten betrachtet. D. Bernoulli fand einen Ausdruck der Funktion J0(x) in Form einer Potenzreihe und bemerkte (ohne Beweis), dass die Gleichung J0(x)=0 hat unzählige gültige Wurzeln.

Die nächste Arbeit, in der Bessel-Funktionen angetroffen werden, war die Arbeit von Leonardo Euler im Jahr 1738, die sich mit der Untersuchung der Schwingungen einer kreisförmigen Membran befasste. In dieser Arbeit fand L. Euler für ganze Zahlen v Bessel-Funktionsausdruck Jv(x) in Form einer Reihe von Kräften x und in nachfolgenden Veröffentlichungen wurde dieser Ausdruck auf den Fall beliebiger Indexwerte erweitert v . Darüber hinaus hat L. Euler bewiesen, dass für v gleich anderthalb ganze Zahlen, Funktionen Jv(x) ausgedrückt durch elementare Funktionen.

Er bemerkte (ohne Beweise), dass mit gültig v die Funktionen Jv(x) habe unzählige reelle Nullen und gab eine ganzzahlige Darstellung für Jv(x) . Einige Forscher glauben, dass die wichtigsten Ergebnisse in Bezug auf Bessel-Funktionen und ihre Anwendungen in der mathematischen Physik mit dem Namen L. Euler zusammenhängen.

Um die Eigenschaft von Bessel-Funktionen zu untersuchen und gleichzeitig Methoden zur Lösung von Gleichungen zu beherrschen, die auf Bessel-Funktionen reduziert sind, ermöglicht das frei verteilte Programm der symbolischen Mathematik SymPy - die Python-Bibliothek.

Im SymPy-Programm für symbolische Mathematik können Diagramme von Bessel-Funktionen der ersten Art von ganzzahligen Ordnungen unter Verwendung der Beziehung für die Summe einer Reihe erstellt werden:

Jp(x)= sum inftym=0 fracx2m+p(1)m22m+pm! Gamma(p+m+1)



Bessel-Funktionen der ersten Art
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() 




Mit der Beziehung für die Summe einer Reihe können wir die Eigenschaft dieser Funktionen für ganze Aufträge beweisen

J1(x)=J1(x):



Eigentum der Bessel-Funktion der ersten Art
 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() 





Um die Cauchy-Bedingungen zu demonstrieren, konstruieren wir eine Funktion J1/3(x) und seine Ableitung  fracdJ1/3(x)dx: ::

Bruchordnungsfunktion und ihre Ableitung
 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() 




Für praktische Berechnungen wird jedoch das wunderbare mpmath-Modul verwendet, mit dem nicht nur Gleichungen mit Bessel-Funktionen der ersten und zweiten Art numerisch gelöst werden können, einschließlich modifizierter Gleichungen aller zulässigen Ordnungen, sondern auch Diagramme mit automatischer Skalierung erstellt werden können.

Darüber hinaus benötigt das mpmath-Modul keine speziellen Tools für den Austausch symbolischer und numerischer Mathematik. Die Entstehungsgeschichte dieses Moduls und die Möglichkeit seiner Verwendung für die inverse Laplace-Transformation habe ich bereits in Veröffentlichung [2] betrachtet. Nun setzen wir die Diskussion über mpmath für die Arbeit mit Bessel-Funktionen fort [3].

Bessel-Funktion der ersten Art JN(x)
mpmath.besselj (n, x, Ableitung = 0) - ergibt eine Bessel-Funktion der ersten Art Jn(x) . Funktionen JN(x) ist eine Lösung für die folgende Differentialgleichung:

x2y+xy+(x2n2)y=0


Für das ganze Positive n verhält sich wie ein Sinus oder Cosinus, multipliziert mit einem Koeffizienten, der langsam mit abnimmt x rightarrow pm infty
Bessel-Funktion der ersten Art JN(x) ist ein Sonderfall der hypergeometrischen Funktion oF1 ::

Jn(x)= fracxn2n Gamma(n+1)oF1(n+1, fracx24)


Die Bessel-Funktion kann unterschieden werden m Zeiten vorausgesetzt, dass die m-te Ableitung ungleich Null ist:

 fracdmdxmJn(x)


Bessel-Funktion der ersten Art JN(x) für positive ganzzahlige Ordnungen n = 0,1,2,3 - die Lösung der Bessel-Gleichung:
 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] 


Bessel-Funktion der ersten Art JN(x) in der komplexen Ebene:
 from sympy import* from mpmath import* cplot(lambda z: besselj(1,z), [-8,8], [-8,8], points=50000) 


Beispiele:
Funktion besselj(N,x) liefert ein Ergebnis mit einer bestimmten Anzahl von Ziffern (mp.dps) nach dem Komma:
 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)) 

Ein Funktionsargument kann eine große Zahl sein:
 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)) 

Bessel-Funktionen der ersten Art erfüllen einfache Symmetrien in Bezug auf x=0 ::
 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)]) 

Die Wurzeln sind nicht periodisch, aber der Abstand zwischen aufeinanderfolgenden Wurzeln nähert sich asymptotisch 2π . Bessel-Funktionen der ersten Art haben folgenden Code:
 from mpmath import* print(quadosc(j0, [0, inf], period=2*pi)) print(quadosc(j1, [0, inf], period=2*pi)) 

Für n=1/2 oder n=1/2 Die Bessel-Funktion wird auf eine trigonometrische Funktion reduziert:
 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)) 

Derivate jeder Ordnung können berechnet werden, negative Ordnungen entsprechen der Integration :
 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])) 

Die Differenzierung mit nicht ganzzahliger Ordnung ergibt eine gebrochene Ableitung im Sinne des Riemann-Liouville-Differentialintegrals, die unter Verwendung der Funktion berechnet wird difint() ::
 from mpmath import* mp.dps = 15 print(besselj(1, 3.5, 0.75)) print(differint(lambda x: besselj(1, x), 3.5, 0.75)) 

Andere Möglichkeiten, die Bessel-Funktion der ersten Art von Null und erster Ordnung aufzurufen
mpmath.j0 (x) - Berechnet die Bessel-Funktion J0(x) ;;
mpmath.j1 (x) - Berechnet die Bessel-Funktion J1(x) ;;

Bessel-Funktionen der zweiten Art
bessely (n, x, Ableitung = 0) Berechnet die Bessel-Funktion zweiter Art aus der Beziehung:

Yn(x)= fracJn(x)cos( pi cdotn)Jn(x)sin( pi cdotn)


Für eine ganze Zahl n Die folgende Formel sollte als Grenze verstanden werden. Die Bessel-Funktion kann unterschieden werden m Zeiten vorausgesetzt, dass die m-te Ableitung ungleich Null ist:
 fracdmdxmYn(x)
Bessel-Funktion der zweiten Art Yn(x) für ganzzahlige positive Aufträge n=0,1,2,3 .
 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. Art Bessel-Funktion Yn(x) in der komplexen Ebene
 from sympy import* from mpmath import* cplot(lambda z: bessely(1,z), [-8,8], [-8,8], points=50000) 


Beispiele:
Einige Funktionswerte Yn(x) ::
 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)) 

Argumente können groß sein:
 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)) 

Derivate beliebiger Ordnung, einschließlich negativer, können berechnet werden:
 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)) 


Modifizierte Bessel-Funktion der ersten Art
 mpmath.besseli(n, x, derivative=0) 

Besseli (n, x, Ableitung = 0) modifizierte Bessel-Funktion der ersten Art

In(x)= mathitinJn(ix)


 fracdmdxmIn(x)


Modifizierte Bessel-Funktion In(x) für echte Bestellungen n=0,1,2,3 ::
 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]) 


Modifizierte Bessel-Funktion In(x) in der komplexen Ebene
 from mpmath import* cplot(lambda z: besseli(1,z), [-8,8], [-8,8], points=50000) 


Beispiele:
Einige Bedeutungen In(x)
 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)) 

Argumente können groß sein:
 from mpmath import* mp.dps = 25; mp.pretty = True print(besseli(2, 1000)) print(besseli(2, 10**10)) print(besseli(2, 6000+10000j)) 

Für ganze Zahlen n gilt die folgende ganzzahlige Darstellung:
 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)) 

Derivate beliebiger Ordnung können berechnet werden:
 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])) 

Modifizierte Bessel-Funktionen der zweiten Art,
 mpmath.besselk(n, x) 

besselk (n, x) modifizierte Bessel-Funktionen zweiter Art

Kn(x)= frac pi4 fracIn(x)In(x)sin( pi cdotn)


Für eine ganze Zahl n Diese Formel sollte als Grenze verstanden werden.
Modifizierte Bessel-Funktion der 2. Art Kn(x) für Material n=0,1,2,3 ::
 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]) 


Modifizierte Bessel-Funktion der 2. Art Kn(x)) in der komplexen Ebene
 from mpmath import* cplot(lambda z: besselk(1,z), [-8,8], [-8,8], points=50000) 


Beispiele:
Komplizierte und komplexe Argumente:
 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)) 

Argumente sind große Zahlen
 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))) 

Merkmale des Verhaltens einer Funktion an einem Punkt x=0 ::
 from mpmath import * print(besselk(0,0)) print(besselk(1,0)) for n in range(-4, 5): print(besselk(n, '1e-1000')) 


Bessel-Funktionsnullen
 besseljzero() mpmath.besseljzero(v, m, derivative=0) 

Für echte Ordnung  mathit nu geq0 und eine positive ganze Zahl m kehrt zurück j nu,m , die m-te positive Null der Bessel-Funktion der ersten Art J nu(z) (siehe besselj () ). Alternativ mit derivative=1 ergibt die erste nicht negative Primzahl Null j nu,m von J nu(z) . Indizierungsvereinbarungsbezeichnungen mit Abramowitz & Stegun und DLMF. Achten Sie auf einen Sonderfall. j0,1=0 während alle anderen Nullen positiv sind.

In der Realität werden nur einfache Nullen berechnet (alle Nullen der Bessel-Funktionen sind einfach, außer wenn z=0 ) und j nu,m wird eine monotone Funktion von  nu und m . Nullen wechseln sich je nach Ungleichung ab:

j nu,k<j nu,k<j nu,k+1


j nu,1<j nu+1,2<j nu,2<j nu+1,2<j nu,3 cdots


Beispiele:
Führende Nullen von Bessel-Funktionen J0(z) , J1(z) , J2(z)
 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)) 

Führende Nullen von Ableitungen von Bessel-Funktionen J0(z) , J1(z) , J2(z)
 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)) 

Nullen mit einem großen Index:
 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)) 

Nullen von Funktionen mit einer großen Bestellung:
 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)) 

Nullen von Funktionen mit gebrochener Ordnung:
 from mpmath import * mp.dps = 25; mp.pretty = True print(besseljzero(0.5,1)) print(besseljzero(1.5,1)) print(besseljzero(2.25,4)) 

Und J nu(z) . und J nu(z) kann als unendliche Produkte an ihren Nullen ausgedrückt werden:
 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) 

Für echte Ordnung  mathit nu geq0 und eine positive ganze Zahl m kehrt zurück y nu,m , m mth positive Null der zweiten Art der Bessel-Funktion Y nu(z) (siehe Bessely () ). Alternativ mit derivative=1 gibt die erste positive Null y nu,m von Y nu(z) . Nullen wechseln sich je nach Ungleichung ab:

y nu,k<y nu,k<y nu,k+1


y nu,1<y nu+1,2<y nu,2<y nu+1,2<y nu,3 cdots


Beispiele:
Führende Nullen von Bessel-Funktionen Y0(z) , Y1(z) , Y2(z)
 from mpmath import * mp.dps = 25; mp.pretty = True print(besselyzero(0,1)) print(besselyzero(0,2)) print(besselyzero(0,3)) print(besselyzero(1,1)) print(besselyzero(1,2)) print(besselyzero(1,3)) print(besselyzero(2,1)) print(besselyzero(2,2)) print(besselyzero(2,3)) 

Führende Nullen von Ableitungen von Bessel-Funktionen Y0(z) , Y1(z) , Y2(z)
 from mpmath import * mp.dps = 25; mp.pretty = True print(besselyzero(0,1,1)) print(besselyzero(0,2,1)) print(besselyzero(0,3,1)) print(besselyzero(1,1,1)) print(besselyzero(1,2,1)) print(besselyzero(1,3,1)) print(besselyzero(2,1,1)) print(besselyzero(2,2,1)) print(besselyzero(2,3,1)) 

Nullen mit einem großen Index:
 from mpmath import * mp.dps = 25; mp.pretty = True print(besselyzero(0,100)) print(besselyzero(0,1000)) print(besselyzero(0,10000)) print(besselyzero(5,100)) print(besselyzero(5,1000)) print(besselyzero(5,10000)) print(besselyzero(0,100,1)) print(besselyzero(0,1000,1)) print(besselyzero(0,10000,1)) 

Nullen von Funktionen mit einer großen Bestellung:
 from mpmath import * mp.dps = 25; mp.pretty = True print(besselyzero(50,1)) print(besselyzero(50,2)) print(besselyzero(50,100)) print(besselyzero(50,1,1)) print(besselyzero(50,2,1)) print(besselyzero(50,100,1)) 

Nullen von Funktionen mit gebrochener Ordnung:
 from mpmath import * mp.dps = 25; mp.pretty = True print(besselyzero(0.5,1)) print(besselyzero(1.5,1)) print(besselyzero(2.25,4)) 


Bessel-Funktionsanwendungen
Die Bedeutung von Bessel-Funktionen beruht nicht nur auf dem häufigen Auftreten der Bessel-Gleichung in Anwendungen, sondern auch auf der Tatsache, dass die Lösungen vieler anderer linearer Differentialgleichungen zweiter Ordnung in Form von Bessel-Funktionen ausgedrückt werden können. Um zu sehen, wie sie aussehen, beginnen wir mit der Bessel-Ordnungsgleichung p in Form von:

z2 fracd2wdz2+z fracdwdz+(z2p2)w=0,(1)


und hier ersetzen

w=x alpha,z=kx beta,(2)


Verwenden Sie dann (2) und führen Sie die Konstanten ein A,B,C aus Gleichung (1) erhalten wir:

x2y+Axy+(B+Cxq)y=0,(3)


A=12 alpha,B= alpha2 beta2p2,C= beta2k2,q=2 beta,(4)


Aus Gleichung (4) erhalten wir:

\ left \ {\ begin {matrix} \ alpha = \ frac {1-A} {2}, \\ \ beta = \ frac {q} {2}, \\ k = \ frac {2 \ sqrt {C. }} {q} \\ p = \ frac {\ sqrt {(1-A ^ {2} -4B}} {q} \\ \ end {matrix} \ right. (5)


Wenn C>0 , q neq0 , (1A)2 geqslant4B , dann die allgemeine Lösung (z x>0 ) von Gleichung (3) hat die Form:

y(x)=x alpha left[c1Jp(kx beta)+c2Jp(kx beta) rechts](6)


wo:  alpha ,  beta , k werden aus System (5) bestimmt. Wenn p Ist dann eine ganze Zahl Jp müssen ersetzt werden durch Yp .

Längsbiegung der vertikalen Säule
Wir werden nun eine Aufgabe betrachten, die für praktische Anwendungen wichtig ist. Bei dieser Aufgabe muss bestimmt werden, wann eine gleichmäßige vertikale Säule unter ihrem eigenen Gewicht gebogen wird. Wir nehmen an x=0 im freien oberen Ende der Spalte und x=L>0 an seiner Basis; wir nehmen an, dass die Basis starr in die Basis (in den Boden) eingeführt (d. h. bewegungslos fixiert) ist, möglicherweise in Beton.

Bezeichnen Sie die Winkelabweichung der Säule am Punkt x durch  theta(x) . Aus der Elastizitätstheorie unter diesen Bedingungen folgt:

EI fracd2 thetadx2+g rhox theta=0,(7)


wo E - Elastizitätsmodul des Säulenmaterials, I - Trägheitsmoment seines Querschnitts,  rho - lineare Dichte der Säule und g - Gravitationsbeschleunigung. Die Randbedingungen haben folgende Form:

 theta(0)=0, theta(L)=0,(8)


Wir werden das Problem mit (7) und (8) lösen mit:

 lambda= gamma2= fracg rhoEI(9)


Wir schreiben (7) unter Berücksichtigung von (9) unter Bedingung (8) neu:

 fracd2 thetadx2+ gamma2x theta=0; fracd thetadx=0, theta(L)=0.(10)


Eine Säule kann nur verformt werden, wenn es eine nicht triviale Lösung für das Problem gibt (10); Andernfalls bleibt die Säule in einer Position, die nicht von der Vertikalen abweicht (d. h. physisch nicht in der Lage ist, von der Vertikalen abzuweichen).
Die Differentialgleichung (10) ist eine Airy-Gleichung. Gleichung (10) hat die Form von Gleichung (3) für A=B=0 , C= gamma2 , q=3 . Aus dem Gleichungssystem (5) erhalten wir  alpha= frac12 ,  beta= frac32 , k= frac23 gamma , p= frac13 .
Daher hat die allgemeine Lösung die Form:

 theta(x)=x1/2 left[c1J1/3( frac23 gammax3/2)+c2J1/3( frac23 gammax3/2) right].(11)


Um die Anfangsbedingungen anzuwenden, ersetzen wir p= pm frac13 in

Jp= sum inftym=0 frac(1)mm! Gamma(p+m+1) left( fracx2 right)2m+p(12)


Nach der Transformation (12) erhalten wir unter Berücksichtigung der Lösung (11):

 theta(x)= fracc1 gamma1/331/3 Gamma(4/3) left(x frac gamma2x412+ frac gamma4x7504 cdot cdot cdot right)++ fracc231/3 gamma1/3 Gamma( frac23) left(1 frac gamma2x36+ frac gamma4x6180 cdot cdot cdot right).(13)


Wird am Startpunkt bereitgestellt  theta(0)=0 wir bekommen c1=0 , dann nimmt (11) die Form an:

 theta(x)=c2x1/2J1/3( frac23 gammax3/2),(14)


Wird am Endpunkt bereitgestellt  theta(L)=0 , aus (14) erhalten wir:

J1/3( frac23 gammaL3/2)=0(15)



Es ist zu beachten, dass die Transformationen (13), (14) nicht durchgeführt werden könnten, wenn die Funktionsgraphen erstellt würden J1/3(x),J1/3(x) Verwenden der berücksichtigten Funktionen des mpmath-Moduls:

 from mpmath import* mp.dps = 6; mp.pretty = True f=lambda x: besselj(-1/3,x) f1=lambda x: besselj(1/3,x) plot([f,f1], [0, 15]) 




Aus dem Diagramm folgt, dass für x = 0 die Funktion ist J1/3(0)=0 und unter Berücksichtigung der Lösung (11) erhalten wir sofort die notwendige Gleichung (15), es bleibt nur z zu finden, wie unten gezeigt wird.

Somit wird die Säule nur dann verformt, wenn z= frac23 gammaL3/2 Ist die Wurzel der Gleichung J1/3(z)=0 . Erstellen Sie eine Funktion J1/3(z) auf einem separaten Diagramm:
 from mpmath import* mp.dps = 6; mp.pretty = True f=lambda x: besselj(-1/3,x) plot(f, [0, 15]) 


Die Grafik zeigt, dass die erste Wurzel etwas kleiner als 2 ist. Suchen Sie die Wurzel z0 aus der Gleichung J1/3(z)=0 Mit der Findroot-Funktion (f, z0) können Sie den Suchpunkt gemäß der Grafik akzeptieren x0=1 und sechs Dezimalstellen mp.dps = 6 :
 from mpmath import* mp.dps = 6; mp.pretty = True f=lambda x: besselj(-1/3,x) print("z0=%s"%findroot(f, 1) 

Wir bekommen:
z0=1,86635
Wir berechnen die kritische Länge, zum Beispiel einen Fahnenmast, nach der Formel (15):
Fahnenmasthöhe für verschiedene Parameter im Abschnitt
 from numpy import* def LRr(R,r): E=2.9*10**11#/^2 rou=7900#/^3 g=9.8#/^2 I=pi*((Rr)**4)/4#^4 F=pi*(Rr)**2#^2 return 1.086*(E*I/(rou*g*F))**1/3 R=5*10**-3 r=0 L= LRr(R,r) print(round(L,2),"") R=7.5*10**-3 r=2*10**-3 Lr= LRr(R,r) print(round(Lr,2),"") 


Wir bekommen:
8,47 m
10,25 m

Ein hohler Fahnenmast kann höher sein als ein fester.

Wellenausbreitung in einer dünnen Membran.


Eine dünne Membran, wenn Schallwellen eintreten, schwingt nicht nur mit der Frequenz der Wellen. Die Form der Membranschwingungen kann in den Bessel-Funktionen gemäß der folgenden Auflistung unter Verwendung der Formeln besselj () und besseljzero () erhalten werden :

Membranwellenform
 from mpmath import* from numpy import* import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm def Membrana(r): mp.dps=25 return cos(0.5) * cos( theta) *float(besselj(1,r*besseljzero(1,1) ,0)) theta =linspace(0,2*pi,50) radius = linspace(0,1,50) x = array([r * cos(theta) for r in radius]) y = array([r * sin(theta) for r in radius]) z = array([Membrana(r) for r in radius]) 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() 




Alternative zum mpmath-Modul in speziellen Bessel-Funktionen der SciPy-Bibliothek



Ohne auf eine detaillierte Diskussion der Bessel-Funktionen aus der SciPy-Bibliothek [4] einzugehen, werde ich nur zwei Auflistungen zum Zeichnen von Funktionen der ersten und zweiten Art jv (v, x) , yv (v, x) geben :
jv (v, x)
 import numpy as np import pylab as py import scipy.special as sp x = np.linspace(0, 15, 500000) for v in range(0, 6): py.plot(x, sp.jv(v, x)) py.xlim((0, 15)) py.ylim((-0.5, 1.1)) py.legend(('$J_{0}(x)$', '$ J_{1}(x)$', '$J_{2}(x)$', '$J_{3}(x)$', '$ J_{4}(x)$','$ J_{5}(x)$'), loc = 0) py.xlabel('$x$') py.ylabel('${J}_n(x)$') py.grid(True) py.show() 




yv (v, x)
 import numpy as np import pylab as py import scipy.special as sp x = np.linspace(0, 15, 500000) for v in range(0, 6): py.plot(x, sp.yv(v, x)) py.xlim((0, 15)) py.ylim((-0.5, 1.1)) py.legend(('$Y_{0}(x)$', '$ Y_{1}(x)$', '$Y_{2}(x)$', '$Y_{3}(x)$', '$ Y_{4}(x)$','$ Y_{5}(x)$'), loc = 0) py.xlabel('$x$') py.ylabel('$Y_{n}(x)$') py.grid(True) py.show() 



Schlussfolgerungen:


Der Artikel beschreibt die Grundlagen der Arbeit mit Bessel-Funktionen unter Verwendung der Bibliotheken mpmath, sympy und scipy und enthält Beispiele für die Verwendung von Funktionen zum Lösen von Differentialgleichungen. Der Artikel kann nützlich sein, um die Gleichungen der mathematischen Physik zu studieren.

Referenzen:



1. Bessel-Funktionen
2. Verwenden der inversen Laplace-Transformation zur Analyse der dynamischen Verknüpfungen von Steuerungssystemen
3. Bessel-funktionbezogene Funktionen
4. Sonderfunktionen (scipy.special).

Source: https://habr.com/ru/post/de443628/


All Articles