파이썬에서 Dirichlet 조건을 가진 2D Laplace에 대한 SOR 솔루션이 있습니다. 오메가가 1.0으로 설정되면 (Jacobi 방법으로), 솔루션이 잘 수렴합니다. 그러나 주어진 omegas를 사용하면 솔루션이 어떤 지점에서 너무 거칠어 수렴하지 못하기 때문에 대상 오류에 도달 할 수 없습니다. 왜 그것은 주어진 오메가 공식으로 수렴하지 않을까요? live example on repl.itSOR 방법이 수렴하지 않습니다
from math import sin, exp, pi, sqrt
m = 16
m1 = m + 1
m2 = m + 2
grid = [[0.0]*m2 for i in xrange(m2)]
newGrid = [[0.0]*m2 for i in xrange(m2)]
for x in xrange(m2):
grid[x][0] = sin(pi * x/m1)
grid[x][m1] = sin(pi * x/m1)*exp(-x/m1)
omega = 2 #initial value, iter = 0
ro = 1 - pi*pi/(4.0 * m * m) #spectral radius
print "ro", ro
print "omega limit", 2/(ro*ro) - 2/ro*sqrt(1/ro/ro - 1)
def next_omega(prev_omega):
return 1.0/(1 - ro * ro * prev_omega/4.0)
for iteration in xrange(50):
print "iter", iteration,
omega = next_omega(omega)
print "omega", omega,
for x in range(1, m1):
for y in range(1, m1):
newGrid[x][y] = grid[x][y] + 0.25 * omega * \
(grid[x - 1][y] + \
grid[x + 1][y] + \
grid[x][y - 1] + \
grid[x][y + 1] - 4.0 * grid[x][y])
err = sum([abs(newGrid[x][y] - grid[x][y]) \
for x in range(1, m1) \
for y in range(1, m1)])
print err,
for x in range(1, m1):
for y in range(1, m1):
grid[x][y] = newGrid[x][y]
print
고마워요, 지금은 사실 들쭉날쭉하지 않고 정말 수렴 중입니다! – epicenter