Kugelflächenfunktionen in 3D visualisieren

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Benutzeravatar
MagBen
User
Beiträge: 767
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Sonntag 13. Juli 2014, 12:25

Kugelflächenfunktionen werden in der Physik z.B. für Atommodelle benutzt. Hier soll es aber nicht um die Theorie, sondern um die Visualisierung gehen,
z.B. auf Wikipedia: http://en.wikipedia.org/wiki/Spherical_ ... monics.png

Und hier meine Visualisierung mit Hilfe von Numpy, Scipy und Matplotlib:
BildBildBild

Den Python-Code und noch ein paar Abbildungen gibt's auf
http://www.magben.de/?h1=mathematik_fue ... funktionen
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
MagBen
User
Beiträge: 767
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Mittwoch 26. August 2015, 14:29

Die Kugelflächenfunktionen
Bild
sind ein wesentlicher Bestandteil der Atomorbitale vom Wasserstoffatom:
Bild.
Hier (http://www.magben.de/?h1=mathematik_fue ... orbital_2d) gibt's nun 2D Visualisierungen dazu. An der 3D Visualisierung arbeite ich noch.
BildBildBildBildBild
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
MagBen
User
Beiträge: 767
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Mittwoch 27. Dezember 2017, 12:36

Mit Mayavi
http://docs.enthought.com/mayavi/mayavi/mlab.html#id5

Bild

Code: Alles auswählen

import numpy as np
from scipy.special import sph_harm 
from mayavi import mlab

theta_1d = np.linspace(0,   np.pi,  91) # 2 GRAD Schritte
phi_1d   = np.linspace(0, 2*np.pi, 181) # 2 GRAD Schritte

theta_2d, phi_2d = np.meshgrid(theta_1d, phi_1d)
xyz_2d = np.array([np.sin(theta_2d) * np.sin(phi_2d),
                   np.sin(theta_2d) * np.cos(phi_2d),
                   np.cos(theta_2d)]) 

# Animierte Ansicht von Y_lm
def show_Y_lm(l, m, camera):
    Y_lm = sph_harm(m,l, phi_2d, theta_2d)
    r = np.abs(Y_lm.real)*xyz_2d
    
    for i in range(camera.shape[0]):
        azimuth,elevation,distance,roll = camera[i]
        mlab.figure(size=(500,500))
        s = mlab.mesh(r[0], r[1], r[2], scalars=Y_lm.real, colormap="cool")
        mlab.view(azimuth=azimuth, elevation=elevation, distance=distance, roll=roll)
        mlab.savefig("plot/Y_%i_%i_%02i.png" % (l,m, i))

# kamerafuehrung
nf = 40
camera = np.zeros((nf,4))
camera[:,0] = np.linspace( 70, 55,nf) # azimuth
camera[:,1] = np.linspace( 50,130,nf) # elevation
camera[:,2] = np.linspace(  3,1.2,nf) # distance
camera[:,3] = np.linspace(-50,-50,nf) # roll

show_Y_lm(l=3,m=0, camera=camera)
mlab.show()

#convert -delay 10 -duplicate 1,-2-1 -loop -0 plot/*.png Y_3_0.gif
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
MagBen
User
Beiträge: 767
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Donnerstag 28. Dezember 2017, 09:42

Update

Code: Alles auswählen

import numpy as np
from scipy.special import sph_harm 
from mayavi import mlab

theta_1d = np.linspace(0,   np.pi,  91) # 2 GRAD Schritte
phi_1d   = np.linspace(0, 2*np.pi, 181) # 2 GRAD Schritte

theta_2d, phi_2d = np.meshgrid(theta_1d, phi_1d)
xyz_2d = np.array([np.sin(theta_2d) * np.sin(phi_2d),
                   np.sin(theta_2d) * np.cos(phi_2d),
                   np.cos(theta_2d)]) 

# Animierte Ansicht von Y_lm
def show_Y_lm(l, m, camera):
    Y_lm = sph_harm(m,l, phi_2d, theta_2d)
    r = np.abs(Y_lm.real)*xyz_2d
    
    mlab.figure(size=(500,500))
    s = mlab.mesh(r[0], r[1], r[2], scalars=Y_lm.real, colormap="cool")
    for i in range(camera.shape[0]):
        azimuth,elevation,distance,roll = camera[i]
        mlab.view(azimuth=azimuth, elevation=elevation, distance=distance, roll=roll)
        mlab.savefig("plot/Y_%i_%i_%02i.png" % (l,m, i))

# kamerafuehrung
nf = 40
camera = np.zeros((nf,4))
camera[:,0] = np.linspace( 70, 55,nf) # azimuth
camera[:,1] = np.linspace( 50,130,nf) # elevation
camera[:,2] = np.linspace(  3,1.2,nf) # distance
camera[:,3] = np.linspace(-50,-50,nf) # roll

show_Y_lm(l=3,m=0, camera=camera)
mlab.show()

#convert -delay 10 -duplicate 1,-2-1 -loop -0 plot/*.png Y_3_0.gif
a fool with a tool is still a fool, www.magben.de, YouTube
Sirius3
User
Beiträge: 7778
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 28. Dezember 2017, 10:04

@MagBen: über den Index zu iterieren ist ein Antipattern, weil man auch direkt über die Elemente iterieren kann. Wenn man trotzdem einen Index braucht, nimmt man enumerate:

Code: Alles auswählen

def show_Y_lm(l, m, camera):
    Y_lm = sph_harm(m, l, phi_2d, theta_2d)
    r = abs(Y_lm.real) * xyz_2d
   
    mlab.figure(size=(500, 500))
    s = mlab.mesh(r[0], r[1], r[2], scalars=Y_lm.real, colormap="cool")
    for i, (azimuth,elevation,distance,roll) in enumerate(camera):
        mlab.view(azimuth=azimuth, elevation=elevation, distance=distance, roll=roll)
        mlab.savefig("plot/Y_%i_%i_%02i.png" % (l, m, i))
Benutzeravatar
MagBen
User
Beiträge: 767
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Donnerstag 28. Dezember 2017, 12:11

enumerate kommt bei Nicht-Software-Entwicklern schlecht an.

Der Clou von dem Post war auch eher folgendes:
  1. Ich kann bei Mayavi die gleichen Datenstrukturen benutzen wie bei Matplotlib.
  2. Ich brauche weniger Code für das Plotten.
  3. Die 3D-Plots sehen bei Mayavi mehr nach 3D aus als bei Matplotlib.
  4. Ich kann sogar die selbe Farbskala benutzen.
a fool with a tool is still a fool, www.magben.de, YouTube
__deets__
User
Beiträge: 2849
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 28. Dezember 2017, 12:36

Und für die Aussage das enumerate unbeliebt ist hast du sicher einen Beleg, oder?
Benutzeravatar
MagBen
User
Beiträge: 767
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Donnerstag 28. Dezember 2017, 14:06

__deets__ hat geschrieben:Und für die Aussage das enumerate unbeliebt ist hast du sicher einen Beleg, oder?
Foto vom Gesichtsausdruck oder war stellst du dir als Beleg vor?
a fool with a tool is still a fool, www.magben.de, YouTube
__deets__
User
Beiträge: 2849
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 28. Dezember 2017, 14:10

Das DU enumerate nicht magst, das glaube ich sofort, und ohne Beleg. Aber Bei Aussagen über von Gruppen von Leuten reicht ein Datenpunkt nicht. Wenn du behauptest, nicht-Softwareentwickler (geschätzt 7 Milliarden Menschen) mögen etwas nicht, dann sollte man das schon belegen können. Oder nicht?
Antworten