class Multilateration::Solver

Attributes

receivers[R]
time_of_arrival_strategy[R]
wave_speed[R]

Public Class Methods

new(unsorted_receivers, time_of_arrival_strategy) click to toggle source
# File lib/multilateration/solver.rb, line 6
def initialize(unsorted_receivers, time_of_arrival_strategy)
  @receivers  = unsorted_receivers.sort_by { |r| time_of_arrival_strategy.toa(r) }
  @wave_speed = time_of_arrival_strategy.wave_speed
  @time_of_arrival_strategy = time_of_arrival_strategy
end

Public Instance Methods

solved_vector() click to toggle source
# File lib/multilateration/solver.rb, line 12
def solved_vector
  Vector.elements (ai_matrix * bi_matrix).flat_map.to_a
end

Private Instance Methods

ai(i) click to toggle source
# File lib/multilateration/solver.rb, line 26
def ai(i)
  2*(   ( distance(tdoa_between_receivers_first_and_last) * ( i             - first_receiver )) \
      - ( distance(tdoa_between_receivers_first_and(i))   * ( last_receiver - first_receiver )) )
end
ai_matrix() click to toggle source
# File lib/multilateration/solver.rb, line 18
def ai_matrix
  Matrix.rows(middle_receivers.map { |i| ai(i) }).inverse
end
bi(i) click to toggle source
# File lib/multilateration/solver.rb, line 31
def bi(i)
    ( distance(tdoa_between_receivers_first_and(i))   * ( distance_sq(tdoa_between_receivers_first_and_last) - inner_product_sq(last_receiver)                  )) \
  + ( inner_product_sq(first_receiver)                * ( distance(tdoa_between_receivers_first_and(i))      - distance(tdoa_between_receivers_first_and_last)  )) \
  + ( distance(tdoa_between_receivers_first_and_last) * ( inner_product_sq(i)                                - distance_sq(tdoa_between_receivers_first_and(i)) ))
end
bi_matrix() click to toggle source
# File lib/multilateration/solver.rb, line 22
def bi_matrix
  Matrix.columns([middle_receivers.map { |i| bi(i) }])
end
distance(time, exp=1) click to toggle source
# File lib/multilateration/solver.rb, line 57
def distance(time, exp=1)
  (wave_speed**exp) * (time**exp)
end
distance_sq(time) click to toggle source
# File lib/multilateration/solver.rb, line 61
def distance_sq(time)
  distance(time, 2)
end
first_receiver() click to toggle source
# File lib/multilateration/solver.rb, line 41
def first_receiver
  receivers.first
end
inner_product_sq(vector) click to toggle source
# File lib/multilateration/solver.rb, line 65
def inner_product_sq(vector)
  vector.inner_product(vector)
end
last_receiver() click to toggle source
# File lib/multilateration/solver.rb, line 45
def last_receiver
  receivers.last
end
middle_receivers() click to toggle source
# File lib/multilateration/solver.rb, line 37
def middle_receivers
  receivers - [first_receiver, last_receiver]
end
tdoa_between_receivers_first_and(other_receiver) click to toggle source
# File lib/multilateration/solver.rb, line 53
def tdoa_between_receivers_first_and(other_receiver)
  time_of_arrival_strategy.tdoa(other_receiver, first_receiver)
end
tdoa_between_receivers_first_and_last() click to toggle source
# File lib/multilateration/solver.rb, line 49
def tdoa_between_receivers_first_and_last
  tdoa_between_receivers_first_and(last_receiver)
end