# `Sidereon.IOD`
[🔗](https://github.com/neilberkman/sidereon-ex/blob/main/lib/sidereon/iod.ex#L1)

Initial Orbit Determination methods.

Given observations (position vectors, angles, or times), determine
the orbit of a satellite.

# `vec3`

```elixir
@type vec3() :: {number(), number(), number()}
```

# `gauss`

```elixir
@spec gauss(
  number(),
  number(),
  number(),
  number(),
  number(),
  number(),
  number(),
  number(),
  number(),
  number(),
  number(),
  number(),
  vec3(),
  vec3(),
  vec3()
) :: {{float(), float(), float()}, {float(), float(), float()}}
```

Gauss angles-only IOD: determine orbit from three angular observations.

Algorithm 52, Vallado 2022, pp. 448-459.

## Parameters

  * `decl1..3` - declinations in radians
  * `rtasc1..3` - right ascensions in radians
  * `jd1..3`, `jdf1..3` - Julian dates (whole + fraction)
  * `site1..3` - ECI site position vectors in km as `{x, y, z}` tuples

## Returns

`{r2, v2}` - position and velocity at the middle observation.

# `gibbs`

```elixir
@spec gibbs(vec3(), vec3(), vec3()) ::
  {{float(), float(), float()}, float(), float(), float()}
```

Gibbs method: determine velocity at r2 from three coplanar position vectors.

Algorithm 54, Vallado 2022, pp. 460-467.

## Parameters

  * `r1`, `r2`, `r3` - ECI position vectors in km as `{x, y, z}` tuples

## Returns

`{v2, theta12, theta23, copa}` where:
  * `v2` - velocity at r2 in km/s
  * `theta12`, `theta23` - angles between position vectors in radians
  * `copa` - coplanarity angle in radians

# `hgibbs`

```elixir
@spec hgibbs(vec3(), vec3(), vec3(), number(), number(), number()) ::
  {{float(), float(), float()}, float(), float(), float()}
```

Herrick-Gibbs method: determine velocity at r2 from three closely-spaced
position vectors with timestamps.

Algorithm 55, Vallado 2022, pp. 467-472.

## Parameters

  * `r1`, `r2`, `r3` - ECI position vectors in km
  * `jd1`, `jd2`, `jd3` - Julian day fractions (only differences matter)

---

*Consult [api-reference.md](api-reference.md) for complete listing*
