module Mathpack::SLE
Constants
- EPS
Public Class Methods
make_null_column(step)
click to toggle source
# File lib/mathpack/sle.rb, line 32 def self.make_null_column(step) (step + 1).upto(@number - 1) do |i| alpha = -@matrix[i][step] / @matrix[step][step].to_f step.upto(@number - 1) do |j| @matrix[i][j] += @matrix[step][j] * alpha end @f[i] += @f[step] * alpha end end
solve(params)
click to toggle source
# File lib/mathpack/sle.rb, line 7 def self.solve(params) type = params[:f].class @matrix = Marshal.load(Marshal.dump(params[:matrix])).to_a @f = params[:f].to_a.flatten fail 'Incorrect size of array or vector' unless @matrix.length == @matrix.first.length && @matrix.length == @f.length @number = @f.length @x = Array.new(@number) { |i| i + 1 } fail 'Matrix is singular' unless solve_direct type == Matrix ? Matrix.row_vector(solve_reverse) : solve_reverse end
solve_direct()
click to toggle source
# File lib/mathpack/sle.rb, line 42 def self.solve_direct 0.upto(@number - 1) do |i| maximum = 0.0 max_line = i max_column = i i.upto(@number - 1) do |line| i.upto(@number - 1) do |column| maximum, max_line, max_column = @matrix[line][column].abs, line, column if @matrix[line][column].abs > maximum end end return false if maximum < EPS swap_lines(i, max_line) if (max_line != i) swap_columns(i, max_column) if (max_column != i) make_null_column(i) end true end
solve_reverse()
click to toggle source
# File lib/mathpack/sle.rb, line 60 def self.solve_reverse result_vector = Array.new(@number) (@number - 1).downto(0) do |i| if i == (@number - 1) result_vector[@x[i] - 1] = @f[i] / @matrix[i][i] else sum = 0.0 (i + 1).upto(@number - 1) do |j| sum += @matrix[i][j] * result_vector[@x[j] - 1] end result_vector[@x[i] - 1] = (@f[i] - sum) / @matrix[i][i] end end result_vector end
swap_columns(first_column, second_column)
click to toggle source
# File lib/mathpack/sle.rb, line 25 def self.swap_columns(first_column, second_column) 0.upto(@number - 1) do |i| @matrix[i][first_column], @matrix[i][second_column] = @matrix[i][second_column], @matrix[i][first_column] end @x[first_column], @x[second_column] = @x[second_column], @x[first_column] end
swap_lines(first_line, second_line)
click to toggle source
# File lib/mathpack/sle.rb, line 18 def self.swap_lines(first_line, second_line) 0.upto(@number - 1) do |j| @matrix[first_line][j], @matrix[second_line][j] = @matrix[second_line][j], @matrix[first_line][j] end @f[first_line], @f[second_line] = @f[second_line], @f[first_line] end