module Mathpack::NonlinearEquations
Public Class Methods
derivative(xk, &function)
click to toggle source
# File lib/mathpack/nonlinear_equations.rb, line 34 def self.derivative(xk, &function) eps = 1e-5 (function.call(xk + eps) - function.call(xk - eps)) / (2 * eps) end
invert(vector)
click to toggle source
# File lib/mathpack/nonlinear_equations.rb, line 26 def self.invert(vector) vector.map{ |element| -element } end
plus(first_array, second_array)
click to toggle source
# File lib/mathpack/nonlinear_equations.rb, line 30 def self.plus(first_array, second_array) Array.new(first_array.length) { |i| first_array[i] + second_array[i] } end
solve(params = {}, &function)
click to toggle source
# File lib/mathpack/nonlinear_equations.rb, line 3 def self.solve(params = {}, &function) xk1 = params[:start] loop do xk = xk1 xk1 = xk - function.call(xk) / derivative(xk, &function) break if (xk1 - xk).abs < params[:eps] end xk1 end
solve_system(params = {})
click to toggle source
# File lib/mathpack/nonlinear_equations.rb, line 13 def self.solve_system(params = {}) xk1 = params[:start].dup loop do xk = xk1.dup w_xk = params[:w_matrix].call(*xk, *params[:additional_params]) f = params[:f].call(*xk, *params[:additional_params]) delta = Mathpack::SLE.solve(matrix: w_xk, f: invert(f)) xk1 = plus(xk, delta) break if Mathpack::IO.count_diff(xk1, xk) <= params[:eps] end xk1 end