Jacobi

อ่านก่อน

Jacobi เป็นวิธีแก้ระบบสมการที่แปลกและเท่ห์ดี คือเริ่มโดยการเดาคำตอบ (เหมือนพวก genetic algorithm) แล้วก็ค่อยๆปรับปรุงคำตอบไปเรื่อยๆจนกระทั่งคำตอบลู่เข้า หรือเบื่อ (จำนวนรอบเกินกว่าที่ตั้งไว้)

อินพุท

  • m : Matrix1 ที่มีสัมประสิทธิ์ของตัวแปรแต่ละตัว และตัวเลขที่อยู่ฝั่งขวาของเครื่องหมายเท่ากับ
  • x0 : base-1 อาร์เรย์ที่เป็นการเดาเริ่มต้น
  • e : ค่าความผิดพลาดที่ยอมรับได้
  • round : จำนวนรอบสูงสุด
def jacobi(m, x0 = nil, e = 0.00001, round = 1000)

เอาท์พุท

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

โค้ดทั้งหมด

require_relative 'base1'

def jacobi(m, 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 = Array1.new(n)

  for r in 1..round
    for i in 1..n
      sum = 0
      for j in 1..n
        sum -= m[i,j] * x0[j] if i != j 
      end
      x1[i] = (sum + b[i]) / m[i,i]
    end
    return x1 if terminate(x1, x0, e)
    x0, x1 = x1, x0
  end
  
  raise "Solution does not converge"
end

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

การใช้งาน

แก้ระบบสมการ

5x + 3y = 41
2x + 7y = 57

m = Matrix1[[5,3,41],[2,7,57]]
puts jacobi(m).to_s

ผลการรัน

[4.0001065978699355, 7.000029006223111]

Python Jacobi

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

One thought on “Jacobi

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