Successive Over-Relaxation (SOR)

อ่านก่อน

SOR เป็นวิธีที่ผสมกันระหว่าง Jacobi กับ Gauss-Seidel โดยมีค่า w ปรับว่าจะหนักไปทางไหน โค้ดต่างจาก Gauss-Seidel แค่บรรทัดเดียว

อินพุท

  • m : Matrix1 ที่มีสัมประสิทธิ์ของตัวแปรแต่ละตัว และตัวเลขที่อยู่ฝั่งขวาของเครื่องหมายเท่ากับ
  • w : ค่าน้ำหนัก อยู่ในช่วง [0, 2] ถ้าเป็น 0 คือ Jacobi, 1 คือ Gauss-Seidel ถ้ามากกว่า 1 ให้ลู่เข้าเร็วขึ้น ถ้าน้อยกว่า 1 ให้ลู่กลับ
  • x0 : base-1 อาร์เรย์ที่เป็นการเดาเริ่มต้น
  • e : ค่าความผิดพลาดที่ยอมรับได้
  • round : จำนวนรอบสูงสุด
def sor(m, w = 1.25, x0 = nil, e = 0.00001, round = 1000)

เอาท์พุท

  • อาร์เรย์ของคำตอบ base-1

โค้ดทั้งหมด

require_relative 'base1'

def sor(m, w = 1.25, x0 = nil, e = 0.00001, round = 1000)
  n  = m.row_count
  b  = m.column(n+1)
  x0 = Array1.new(n, 0.0) if x0 == nil 
  x1 = x0.clone

  for r in 1..round
    for i in 1..n
      sum = 0.0
      for j in 1..n
        sum -= m[i,j] * x1[j] if i != j   
      end
      x1[i] = w * (sum + b[i]) / m[i,i] + (1.0 - w) * x0[i]     # change
    end
    return x1 if terminate(x1, x0, e)
    x0.fill { |i| x1[i] }
  end
  
  raise "Solution does not converge"
end

def terminate(x1, x0, e)
  x1.each_index { |i| return false if ((x1[i] - x0[i]) / x1[i]) >= e }
  return true
end

การใช้งาน


ผลการรัน

หากจะนำโค้ดหรือข้อความไปใช้ ต้องแสดงที่มา และห้ามใช้ในเชิงพาณิชย์

Advertisements

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s