Skip to content

Instantly share code, notes, and snippets.

@wfarr
Created March 15, 2009 09:44
Show Gist options
  • Select an option

  • Save wfarr/79378 to your computer and use it in GitHub Desktop.

Select an option

Save wfarr/79378 to your computer and use it in GitHub Desktop.
#!/usr/bin/env ruby1.9
require 'mathn'
A = Matrix[[4,1],
[2,3]]
b = Vector[6,
8]
def jacobi(matrix,vector)
a11 = matrix[0,0]
a12 = matrix[0,1]
a21 = matrix[1,0]
a22 = matrix[1,1]
b1 = vector[0]
b2 = vector[1]
x_1 = ->(x){ b1.fdiv(a11) - (a12.fdiv(a11) * x) }
x_2 = ->(x){ b2.fdiv(a22) - (a21.fdiv(a22) * x) }
prev,curr,prev2,curr2,iter = 0,0,0,0,0
while true
prev = curr
prev2 = curr2
curr = x_1[prev2]
curr2 = x_2[prev]
iter += 1
puts "=== Iteration #{iter} ==="
puts "x1: (#{b1}/#{a11}) - ((#{a12}/#{a11}) * %.3f) = %.3f" % [prev,curr]
puts "x2: (#{b2}/#{a22}) - ((#{a21}/#{a22}) * %.3f) = %.3f" % [prev2,curr2]
break if (curr - prev).abs <= 0.001 && (curr2 - prev2).abs <= 0.001
end
puts "result: %.3f %.3f" % [curr,curr2]
end
puts "=================
= Jacobi Method =
================="
jacobi(A,b)
def gauss_seidel(matrix,vector)
a11 = matrix[0,0]
a12 = matrix[0,1]
a21 = matrix[1,0]
a22 = matrix[1,1]
b1 = vector[0]
b2 = vector[1]
x_1 = ->(x){ b1.fdiv(a11) - (a12.fdiv(a11) * x) }
x_2 = ->(x){ b2.fdiv(a22) - (a21.fdiv(a22) * x) }
prev,curr,prev2,curr2,iter = 0,0,0,0,0
while true
prev = curr
prev2 = curr2
curr = x_1[prev2]
curr2 = x_2[curr]
iter += 1
puts "=== Iteration #{iter} ==="
puts "x1: (#{b1}/#{a11}) - ((#{a12}/#{a11}) * %.3f) = %.3f" % [prev,curr]
puts "x2: (#{b2}/#{a22}) - ((#{a21}/#{a22}) * %.3f) = %.3f" % [curr,curr2]
break if (curr - prev).abs <= 0.001 && (curr2 - prev2).abs <= 0.001
end
puts "result: %.3f %.3f" % [curr,curr2]
end
puts "=======================
= Gauss-Seidel Method =
======================="
gauss_seidel(A,b)
#def power_method
#end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment