Summary Files Commits Branches @commit @diff @stats
path: root / Year 4 / Celestial mechanics / Exercise2.R
blob: 7d5af5e0dc2af7ead843c56a3ac985478c523fab (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# Изменя величината спрямо подадено изменение и дата във векове от началото на епохата
atDay <- function(epochConstant, rate, t) {
  epochConstant + t * rate
}

# Принтира аргументът, така че всички цифри да имат 8 знака прецизност
p <- function(x) {
  formatC(x, format="f", digits = 21)
}

# Аргумент на перихелия
g <- function(omega, theta) {
  omega - theta
}

# Средна аномалия
l <- function(lambda, omega) {
  lambda - omega
}

gamma <- function(mu) { 1 + mu }
m <- function(mu) { mu / (1 + mu) }
L <- function(m, gamma, a) { m * sqrt(gamma) * sqrt(a) }
G <- function(L, e) { L * sqrt(1 - e^2) }
Theta <- function(G, i) { G * cos(i) }

# Елементи на Делоне по подадени константи
delaunay <- function(t, mu, a2000, da, e2000, de, i2000, di, lambda2000, dlambda, omega2000, domega, theta2000, dtheta) {
  a <- atDay(a2000, da, t)
  e <- atDay(e2000, de, t)
  i <- atDay(i2000, di, t)
  lambda <- atDay(lambda2000, dlambda, t)
  omega <- atDay(omega2000, domega, t)
  theta <- atDay(theta2000, dtheta, t)

  m <- m(mu)
  gamma <- gamma(mu)

  L <- L(m, gamma, a)
  G <- G(L, e)
  Theta <- Theta(G, i)
  l <- l(lambda, omega)
  g <- g(omega, theta)

  c(L, G, Theta, l, g, theta)
}

# Елементи на Делоне в моета дата на раждане
delaunayAtBirth <- function() {
  birthDate <- 0.023203285421
  rbind(
    delaunay(birthDate, 0.00000016601367952719,    # Меркурии
               0.38709927,    0.00000037, 0.20563593, 0.00001906, 0.12225995, -0.00010380,
               4.40259868, 2608.79030501, 1.35189358, 0.00280085, 0.84353100, -0.00218761),
    delaunay(birthDate, 0.00000244783833966454,    # Венера
               0.72333566,    0.00000390, 0.00677672, -0.00004107, 0.05924827, -0.00001377,
               3.17613446, 1021.32854958, 2.29689636,  0.00004683, 1.33831572, -0.00484668),
    delaunay(birthDate, 0.0000030404326333266,     # EM Bary
               1.00000261,   0.00000562, 0.01671123, -0.00004392, -0.00000027, -0.00022596,
               1.75343756, 628.30757790, 1.79660147,  0.00564219,  0.0,         0.0),
    delaunay(birthDate, 0.00000032271514450539,    # Марс
                1.52371034,   0.00001847,  0.09339410, 0.00007882, 0.03228321, -0.00014192,
               -0.07947238, 334.06130168, -0.41789517, 0.00775643, 0.86497713, -0.00510637),
    delaunay(birthDate, 0.00095479193842432214,    # Юпитер
               5.20288700, -0.00011607, 0.04838624, -0.00013253, 0.02276602, -0.00003206,
               0.60033114, 52.96631189, 0.25706047,  0.00370929, 1.75360053,  0.00357253),
    delaunay(birthDate, 0.0002858859806661029,     # Сатурн
               9.53667594, -0.00125060, 0.05386179, -0.00050991, 0.04338874,  0.00003379,
               0.87186604, 21.33653879, 1.61615531, -0.00731244, 1.98378354, -0.00503838),
    delaunay(birthDate, 0.00004366244043351564,    # Уран
               19.18916464, -0.00196176, 0.04725744, -0.00004397, 0.01348507, -0.00004240,
                5.46703627,  7.47842217, 2.98371499,  0.00712187, 1.29183904,  0.00074012),
    delaunay(birthDate, 0.00005151389020535497,    # Нептун
               30.06992276, 0.00026291, 0.00859048,  0.00005105, 0.03089309,  0.00000617,
               -0.96202600, 3.81283674, 0.78478315, -0.00562720, 2.30006864, -0.00008878)
  )
}

# Елементи на Поанкаре от първи род в моета дата на раждане
poincare1 <- function() {
  data <- delaunayAtBirth()
  result <- c()
  for (planet in 1:8) {
    L <- data[planet,1]; G <- data[planet,2]; Theta <- data[planet,3]
    l <- data[planet,4]; g <- data[planet,5]; theta <- data[planet,6]
    result <- rbind(
      result,
      c(L, L - G, G - Theta, l + g + theta, - g - theta, - theta)
    )
  }
  result
}

# Елементи на Поанкаре от втори род в моета дата на раждане
poincare2 <- function() {
  data <- delaunayAtBirth()
  result <- c()

  for (planet in 1:8) {
    L <- data[planet,1]; G <- data[planet,2]; Theta <- data[planet,3]
    l <- data[planet,4]; g <- data[planet,5]; theta <- data[planet,6]

    result <- rbind(
      result,
      c(L,              sqrt(2*(L-G)) * cos(g + theta),  sqrt(2*(G-Theta)) * cos(theta),
        l + g + theta, -sqrt(2*(L-G)) * sin(g + theta), -sqrt(2*(G-Theta)) * sin(theta))
    )
  }

  result
}

p(delaunayAtBirth())
p(poincare1())
p(poincare2())