[Wissenschaftlich-technische Berechnung nach Python] Vergleich der Konvergenzgeschwindigkeiten der SOR-Methode, der Gauß-Seidel-Methode und der Jacobi-Methode für die Laplace-Gleichung, die partielle Differentialgleichung und das Randwertproblem

Einführung

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.


Inhalt

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()

Ergebnis (1) Anzeige der Lösung

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.

t.png


Ergebnis (2) Vergleich der Konvergenzgeschwindigkeit

Die Tabelle zeigt die Abhängigkeit der Datenbewertung ($ Nx \ times Ny $) von der Anzahl der zur Konvergenz erforderlichen Iterationen.

Anzahl der Gitter: N\times N 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.

tt.png

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.


Fazit

** 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. ** ** **


Nachtrag

Nachtrag (1): Gauß-Seidel-Methode: - Leichte Verbesserung der Jacobi-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.

Nachtrag (2): Numerische Lösung: SOR-Methode: - Leichte Verbesserung der Jacobi-Methode -

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].

\phi(x_i,y_j)^{(n+1)} = \phi(x_i,y_j)^{(n)}+\Delta \phi(x,y)^{(n)} \tag{3}

\Delta \phi(x,y)^{(n)}=\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-\phi(x_i,y_j)^{(n)} \tag{4}

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.

tt.png Ä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, **

\omega_{SOR} = \frac{2}{1-\sqrt(\lambda^2)}\tag{5} \lambda=\frac{1}{2}[cos\frac{\pi}{N_x}+cos\frac{\pi}{N_y}] \tag{6}

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].


Verweise

[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