Die Lösung der elliptischen partiellen Differentialgleichung mit Python wird beschrieben.
Qiita Artikel Wissenschaftliche / technische Berechnung durch Python Numerische Lösung der zweidimensionalen Laplace-Poisson-Gleichung für die elektrostatische Position nach der Jacobi-Methode, elliptische partielle Differentialgleichung, Randwertproblem [1]
Dann wurde die Laplace-Gleichung unter Verwendung der Jacobi-Methode gelöst. Die Jacobi-Methode soll langsam konvergieren und unpraktisch sein. ** In diesem Artikel lösen wir die Laplace-Gleichung mit der Gauß-Seidel-Methode und der sequentiellen Überrelaxationsmethode (SOR-Methode), die angeblich schneller als die Jacobi-Methode sind, und vergleichen die Konvergenzgeschwindigkeiten. ** ** **
** Fazit: Die SOR-Methode ist überwältigend schnell (unter optimalen Bedingungen) </ font> **
Die Methode wird im Anhang kurz zusammengefasst. Bitte beziehen Sie sich darauf.
Verwenden Sie fast den gleichen Berechnungscode wie in Qiita-Artikel.
Vergleichen Sie die Konvergenzgeschwindigkeiten der Jacobi-Methode, der Gauß-Seidel-Methode und der SOR-Methode. Insbesondere wird die Anzahl der Iterationen für die Anzahl der Maschen N in jedem Schema untersucht. N wählte vier Punkte: N = 100, 1000, 10000, 100000.
Die SOR-Methode wird in besonderen Fällen zur Gauß-Seidel-Methode.
SOR
%%time
"""
Laplace-Gleichung:Numerische Lösung,SOR-Methode:
ω =Gauß bei 1-Werden Sie zur Seidel-Methode
Rechteckbereich
14 Aug. 2017
"""
#%matplotlib nbagg
import numpy as np
import matplotlib.pyplot as plt
#
delta_Lx=0.03
delta_Ly=0.03
LLx = 10 #Rechteckbreite(x Richtung)
LLy= 10 #Rechteckbreite(y Richtung)
Lx = int(LLx/delta_Lx)
Ly = int(LLy/delta_Ly)
V = 2.0 #Stromspannung
convegence_criterion = 10**-5
phi = np.zeros([Lx+1,Ly+1])
phi_Bound= np.zeros([Lx+1,Ly+1])
phi_Bound[0,:] = V #Randbedingung
# for SOR method
aa_recta=0.5*(np.cos(np.pi/Lx)+np.cos(np.pi/Ly)) #
omega_SOR_recta = 2/(1+np.sqrt(1-aa_recta**2)) #Optimale Beschleunigungsparameter für rechteckige Bereiche
print("omega_SOR_rect=",omega_SOR_recta)
#Maine
delta = 1.0
n_iter=0
conv_check=[]
while delta > convegence_criterion:
phi_in=phi.copy()
if n_iter % 40 ==0: #Überwachung des Konvergenzstatus
print("iteration No =", n_iter, "delta=",delta)
conv_check.append([n_iter, delta])
for i in range(Lx+1):
for j in range(Ly+1):
if i ==0 or i ==Lx or j==0 or j==Ly:
phi[i,j] = phi_Bound[i,j]
else:
phi[i,j] = phi[i,j]+omega_SOR_recta *((phi[i+1,j] + phi[i-1,j] + phi[i,j+1] + phi[i,j-1])/4-phi[i,j]) #Update nach SOR-Methode
delta = np.max(abs(phi- phi_in))
n_iter+=1
print ("The number of total iteration =",n_iter)
print("data_points=",Lx*Ly)
#for plot
plt.xlabel('X')
plt.ylabel('Y')
plt.imshow(phi,cmap='hsv')
plt.show()
Zunächst ist die Lösung der Laplace-Gleichung selbst in der folgenden Abbildung dargestellt. Dies wird aus Qiita-Artikel entnommen. Berechnet mit 100x100 mesh.
Die Tabelle zeigt die Abhängigkeit der Datenbewertung ($ Nx \ times Ny $) von der Anzahl der zur Konvergenz erforderlichen Iterationen.
Anzahl der Gitter: |
SOR-Methode | Gauß-Seidel-Methode | Jacobi-Methode |
---|---|---|---|
100 (10x10) | 21 | 89 | 166 |
1089 (33x33) | 68 | 721 | 1302 |
10000 (100x100) | 201 | 4416 | 7476 |
110889 (333x333) | 663 | 22334 | 30913 |
** Sie können sehen, dass die SOR-Methode überwältigend schnell ist </ font>. ** ** ** Es ist auch ersichtlich, dass die Anzahl der Wiederholungen der [Addendum] ** SOR-Methode erwartungsgemäß proportional zu N ist. Die Konvergenzgeschwindigkeit der Gauß-Seidel-Methode ist etwa doppelt so hoch wie die der Jacobi-Methode. Es gibt jedoch immer noch einen bemerkenswerten Geschwindigkeitsunterschied zur SOR-Methode, und dies ist nicht praktikabel.
Ein doppeltes logarithmisches Diagramm dieser Tabelle ist unten gezeigt. Die Steigung zeigt die Abhängigkeit der Gitterbewertung von der Anzahl der Iterationen.
Die horizontale Achse zeigt die Anzahl der Gitterpunkte und die vertikale Achse zeigt die Anzahl der Iterationen, die erforderlich sind, damit die vertikale Achse konvergiert. Die lineare Änderung zeigt an, dass der Leistungsindex der Gitterwertabhängigkeit von der Anzahl der Iterationen konstant ist. Es ist ersichtlich, dass die Steigung der SOR-Methode kleiner als die der Gauß-Seidel-Jakobi-Methode ist und die Konvergenzreihenfolge groß ist.
** Wenn Sie die optimalen Beschleunigungsparameter kennen, sollten Sie die SOR-Methode verwenden. </ font> Eine realistische Berechnung ($ Nx, Ny \ gt $ 100) ist mehr als 20-mal schneller als die Gauß-Seidel-Methode. ** ** **
[Gauß-Seidel-Methode](https://ja.wikipedia.org/wiki/%E3%82%AC%E3%82%A6%E3%82%B9%EF%BC%9D%E3%82%B6% E3% 82% A4% E3% 83% 87% E3% 83% AB% E6% B3% 95) ist der Jacobi im Nachtrag zu Qiita-Artikeln Gesetzliche Formel (12)
$ \phi(x_i,y_j) = \frac{1}{4} [\phi(x_{i+1},y_{j})+\phi(x_{i-1},y_{j})+\phi(x_{i},y_{j+1})+\phi(x_{i},y_{j-1})]+\frac{\rho(x_{i},y_{j})}{4\epsilon_0}\Delta^2 $
$ (N + 1) $ Schrittdarstellung
$ \phi(x_i,y_j)^{(n+1)} = \frac{1}{4} [\phi(x_{i+1},y_{j})^{(n)}+\phi(x_{i-1},y_{j})^{(n)}+\phi(x_{i},y_{j+1})^{(n)}+\phi(x_{i},y_{j-1})^{(n)}]+\frac{\rho(x_{i},y_{j})}{4\epsilon_0}\Delta^2 \tag{1} $
In sind $ \ phi (x_ {i-1}, y_j) ^ {(n)} $ und $ \ phi (x_ {i}, y_ {j-1}) ^ {(n)} $ tatsächlich ** Da es im Voraus aktualisiert wurde, wird der Wert des $ n $ -Schritts nicht verwendet. Verwenden Sie $ \ phi (x_ {i-1}, y_j) ^ {(n + 1)} $ und $ \ phi (x_ {i}, y_ {j-1}) ^ {(n + 1)} $ Methode **. Mit anderen Worten
$ \phi(x_i,y_j)^{(n+1)} = \frac{1}{4} [\phi(x_{i+1},y_{j})^{(n)}+\phi(x_{i-1},y_{j})^{(n+1)}+\phi(x_{i},y_{j+1})^{(n)}+\phi(x_{i},y_{j-1})^{(n+1)}]+\frac{\rho(x_{i},y_{j})}{4\epsilon_0}\Delta^2 \tag{2} $ Und. Dadurch wird ** nacheinander $ \ phi (x_i, y_j) $ aktualisiert, wodurch die Verwendung des Codespeichers im Vergleich zur Jacobi-Methode gespart wird ** Es ist zu erwarten, dass die Konvergenz etwas schneller ist als bei der Jacobi-Methode (die Anzahl der Iterationen für ein großes Netz beträgt etwa die Hälfte der Anzahl der Jacobi-Methode [1]), aber diese Methode konvergiert auch langsam.
Einer der praktischen Algorithmen ist die ** sequentielle Überrelaxationsmethode (SOR-Methode [2]) **. Wie unten gezeigt, beschleunigt diese Methode die Aktualisierung von $ \ phi (x_i, y_j) ^ {(n)} $ durch die ** Gauss-Seidel-Methode durch Anwenden des Beschleunigungsparameters $ \ omega $. ** ** **
Der iterative Prozess der Gauß-Seidel-Methode kann wie folgt umgeschrieben werden [1].
Hier repräsentiert $ \ Delta \ phi (x, y) $ den Aktualisierungsbetrag von $ \ phi (x, y) ^ {(n)} $ nach der Gauß-Seidel-Methode. Übrigens ** Bei der Gauß-Seidel-Methode ändert sich $ \ phi (x, y) ^ {(n)} $ im iterativen Prozess häufig monoton **. Als Beispiel zeigt die Abbildung die Änderungen im iterativen Prozess einiger $ \ phi $ -Werte beim Lösen der Laplace-Gleichung auf einem 10x10-Netz. Sie können sehen, dass es sich monoton ändert.
Änderungen in $ \ phi $ während des iterativen Prozesses.
** Die SOR-Methode ist eine Methode, um diese monotone Änderung aktiv zu nutzen. Da sich $ \ phi $ monoton ändert, kann der durch das Gauß-Seidel-Verfahren vorhergesagte Aktualisierungsbetrag $ \ Delta \ phi (x, y) $ (Gleichung (4)) vergrößert werden, um die Konvergenzgeschwindigkeit zu erhöhen. Korrekt. ** Diese Idee ist die Essenz der SOR-Methode.
Daher iterativer Prozess des Multiplizierens von $ \ Delta \ phi (x, y) $ von Gleichung (4) mit $ \ omega_ {SOR} $
$ \phi(x_i,y_j)^{(n+1)} = \phi(x_i,y_j)^{(n)}+\omega_{SOR}[\frac{\phi(x_{i+1},y_{j})^{(n)}+\phi(x_{i-1},y_{j})^{(n)}+\phi(x_{i},y_{j+1})^{(n)}+\phi(x_{i},y_{j-1})^{(n)}}{4} +\frac{\rho(x_{i},y_{j})}{4\epsilon_0}\Delta^2-\phi(x_i,y_j)^{(n)}]\tag{5} $
Denk an.
** Dies ist die SOR-Methode. $ \ Omega_ {SOR} $ wird als Überentspannungsparameter bezeichnet. Wenn $ \ omega_ {SOR} $ = 1 ist, wird dies zur Gauß-Seidel-Methode. ** ** **
Es gibt eine Option, wie $ \ omega_ {SOR} $ angegeben werden kann. Wenn Sie die optimale auswählen können (die mit der besten Konvergenzrate), ist die Konvergenz möglicherweise viel schneller als die Gauß-Seidel-Methode. Es wurden verschiedene Wege untersucht, um das beste $ \ omega_ {SOR} $ zu finden [2].
** Wir kennen das optimale $ \ omega_ {SOR} $ für die Laplace (Poisson) -Gleichung im rechteckigen Bereich, **
Ist. Für ein ausreichend großes Gitter $ Nx \ mal Ny >> 1 $ wird es zu $ \ omega_ {SOR} \ ca. 2 $.
Sagen wir ** $ Nx = Ny = N $. Zu diesem Zeitpunkt ist die Anzahl der Iterationen, die für die Konvergenz der Berechnung unter Verwendung der SOR-Methode erforderlich sind, proportional zu $ N ^ 1 $. Die der Jacobi-Methode und der Gauß-Seidel-Methode ist proportional zu $ N ^ 2 $. Wenn N groß genug ist, ist die Konvergenzgeschwindigkeit der SOR-Methode erheblich schneller als die der Gauß-Seidel-Methode und der Jacobi-Methode [2] </ font> **. Die in diesem Artikel untersuchten Ergebnisse unterstützen dies nachdrücklich.
Beachten Sie, dass ** einfach zu implementieren **. Verwenden Sie $ \ omega_ {SOR} $, um Gleichung (5) unverändert zu lassen
phi[i,j] = phi[i,j]+omega_SOR*((phi[i+1,j] + phi[i-1,j] + phi[i,j+1] + phi[i,j-1])/4-phi[i,j])
Alles was Sie tun müssen, ist zu schreiben [2].
[1] Mein Qiita-Artikel, [[Wissenschaftlich-technische Berechnung von Python] Numerische Lösung der zweidimensionalen Laplace-Poisson-Gleichung nach der Jacobi-Methode für die elektrostatische Position, elliptische partielle Differentialgleichung, Randwertproblem](http: // qiita. com / sci_Haru / items / 6b80c7eb8d4754fb5c2d)
[2] ["Numerisches Rezept in der japanischen Seeversion - Rezept für die numerische Berechnung in C-Sprache"](https://www.amazon.co.jp/%E3%83%8B%E3%83%A5 % E3% 83% BC% E3% 83% A1% E3% 83% AA% E3% 82% AB% E3% 83% AB% E3% 83% AC% E3% 82% B7% E3% 83% 94-% E3% 82% A4% E3% 83% B3-% E3% 82% B7% E3% 83% BC-% E6% 97% A5% E6% 9C% AC% E8% AA% 9E% E7% 89% 88- C% E8% A8% 80% E8% AA% 9E% E3% 81% AB% E3% 82% 88% E3% 82% 8B% E6% 95% B0% E5% 80% A4% E8% A8% 88% E7% AE% 97% E3% 81% AE% E3% 83% AC% E3% 82% B7% E3% 83% 94-Press-William-H / dp / 4874085601 / ref = dp_return_1? _ Codierung = UTF8 & n = 465392 & s = Bücher) Technical Review, 1993.
Recommended Posts