| schnudl |
Verfasst am: 28. Jan 2018 02:13 Titel: |
|
Nachdem ich hier lange herumgrübelte, weiß ich nun, wie man das Randwertproblem lösen kann:
Es handelt sich ja um ein Neumann Randwertproblem für die Laplacegleichung, wo auf der Umrandung vorgegeben ist, dass kein Strom den Rand der Fläche verlassen darf. In anderen Worten: der Gradient des Potenzials an den Rändern der Fläche verschwindet.
Oben und unten hat man innerhalb der Kontur einen positiven bzw. negativen Einspeisepunkt für den Strom, was Dirac'schen Punktquellen entspricht.
Um die Randbedingungen einzuhalten kann man die Methode der Spiegelladungen verwenden, wie dies aus der Elektrostatik bekannt ist. Damit die Normalableitung verschwindet, wird jede vorhandene Punktquelle an den vier Seitenflächen (=Symmetrieachsen) gespiegelt - aber ohne das Vozeichen zu tauschen - das wäre bei einer Dirichlet Bedingung.
Es ist sinnvoll, zunächst anzunehmen, dass die Quellen und Senken ganz leicht innerhalb liegen und nicht direkt auf dem Rand. Somit werden die Quellen gleich auf die andere Seite gespiegelt - im Grenzfall kann man diese nahe beieinander liegenden Quellen dann zu einer Doppelquelle vereinen.
Die Doppelquelle wird sodann an der anderen Achse gespiegelt. Dies wiederholt sich horizontal und vertikal, bis der gesamte 2D-Raum mit Spiegelquellen in einem Gitter befüllt ist. Es wechseln sich in der y Richtung Reihen mit positiven und negativen Quellen ab.
Die Einheitszelle der Kontur wird somit vertikal und horizontal zu einem Punktgitter vervielfältigt.
Nun muss man nur noch für jeden Aufpunkt die Summe der Potenziale aller positiven und negativen Quellen aufsummieren.
Da dieser Ansatz nach einer klassischen Foriertransformation schreit, könnte man wahrscheinlich auch in den k-Raum transformieren und das Problem dort lösen. Ich habe das aber nicht probiert.
Das folgende Python Programm führt die Rechnung für die 40x40=1600 nächstgelegenen Elementarzellen aus (insgesamt 3600 Quellen). Das Raster ist 200*200 Punkte; es werden daher insgesamt 3600*200*200 = 128 Mio Einzelberechnungen durchgeführt.
Es war für mich total überraschend, dass dieses ganz simple Programm das erwartete Verhalten in weniger als drei Sekunden liefert. Man sieht, dass entlang der Stromflussrichtung das Potenzial fast linear absinkt, und es an den Einspeisungen (Dirac-Deltafunktion) zu entsprechenden Überhöhungen kommt.
Das Äquipotenzialbild zeigt, dass die Randbedingungen eingehalten werden.
Es ist nun ein ganz leichtes Spiel, statt einer Punkteinspeisung eine flächige Einspeisung zu nehmen, welcher der in etwa kreisförmigen Kontur an den Rändern entspricht. Somit kann der Gesamtwiderstand einer solchen Geometrie anhand der Äquipotenzialflächen simpel berechnet werden.
Klar wird aber schon jetzt, dass bei sehr dünnen Kontaktierungen der überwiegende Spannungsabfall an der Kontaktstelle entsteht.
Falls es jemanden interessiert: Python 3.6.1
| Code: |
'''
Stromfluss durch eine rechteckige Platte
'''
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import numpy as np
def phi_source(x, y):
phi = 0*x
for ix in range(-20, 21):
for iy in range(-20, 21):
xq = ix*2
yq = iy*4 + 1
phi = phi + 1/np.sqrt((x-xq)**2+(y-yq)**2)
return phi
def phi_sink(x, y):
phi = 0*x
for ix in range(-20, 21):
for iy in range(-20, 21):
xq = ix*2
yq = iy*4 - 1
phi = phi - 1/np.sqrt((x-xq)**2+(y-yq)**2)
return phi
fig = plt.figure()
ax = fig.gca(projection='3d')
# Make data.
X = np.arange(-0.99, 0.99, 0.01)
Y = np.arange(-0.99, 0.99, 0.01)
X, Y = np.meshgrid(X, Y)
Z = phi_source(X, Y) + phi_sink(X, Y)
plt.figure()
CS = plt.contour(X, Y, Z, 500)
#plt.clabel(CS, inline=1, fontsize=3)
plt.title('Äquipotenziallinien')
# Plot the surface.
#surf = ax.plot_surface(X, Y, Z, cmap=cm.coolwarm, linewidth=40, antialiased=False, vmin=-1, vmax=1)
#surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, color="white", shade=False, edgecolor="blue")
# Plot a basic wireframe.
ax.plot_wireframe(X, Y, Z)
# Customize the z axis.
ax.set_zlim(-40, 40)
ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
# Add a color bar which maps values to colors.
#fig.colorbar(surf, shrink=0.5, aspect=5)
plt.show() |
|
|