One of my son’s Cub Scout “adventures” requires him to create a scale model of the solar system. We sketched the calculations on the back of a receipt over lunch. We started with the distance we figured that we would use (length of our street, 387 feet) and then calculated the distances to each planet based on this. I figured it would be neat to create a function in R that would return a table of the relative distances based on a given model solar system radius.
Here are the relative distances from the sun for each planet.
solar_system <- data.frame(
solar_object = c("Sun", "Mercury", "Venus", "Earth", "Mars", "Jupiter",
"Saturn", "Uranus", "Neptune"),
distance_km = c(0, 57.9e6, 108.2e6, 149.6e6, 227.8e6, 778.3e6,
1427e6, 2871e6, 4497.1e6),
diam_km = c(1.392e6, 4878, 12104, 12756, 6787, 142792, 120660,
51118, 48600)
)
solar_system
## solar_object distance_km diam_km
## 1 Sun 0 1392000
## 2 Mercury 57900000 4878
## 3 Venus 108200000 12104
## 4 Earth 149600000 12756
## 5 Mars 227800000 6787
## 6 Jupiter 778300000 142792
## 7 Saturn 1427000000 120660
## 8 Uranus 2871000000 51118
## 9 Neptune 4497100000 48600
We can use some data manipulation from the dplyr
package to calculate the new distance and diameters. I based the model solar system distance (radius) on my street length, which is approximately 387 feet.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
solar_system <- tbl_df(solar_system)
model_total_distance <- 387 # feet
actual_total_distance <- solar_system$distance_km[9]
solar_system <- solar_system %>%
mutate(model_distance = distance_km * model_total_distance /
actual_total_distance,
model_diam = diam_km * model_total_distance /
actual_total_distance)
solar_system
## # A tibble: 9 × 5
## solar_object distance_km diam_km model_distance model_diam
## <fctr> <dbl> <dbl> <dbl> <dbl>
## 1 Sun 0 1392000 0.000000 0.1197891975
## 2 Mercury 57900000 4878 4.982611 0.0004197785
## 3 Venus 108200000 12104 9.311201 0.0010416153
## 4 Earth 149600000 12756 12.873897 0.0010977234
## 5 Mars 227800000 6787 19.603433 0.0005840584
## 6 Jupiter 778300000 142792 66.976963 0.0122880310
## 7 Saturn 1427000000 120660 122.801139 0.0103834516
## 8 Uranus 2871000000 51118 247.065220 0.0043989829
## 9 Neptune 4497100000 48600 387.000000 0.0041822953
We can put everything into a function for more automatic usage.
solar_model <- function(distance) {
require(dplyr)
solar_system <- data.frame(
solar_object = c("Sun", "Mercury", "Venus", "Earth", "Mars", "Jupiter",
"Saturn", "Uranus", "Neptune"),
distance_km = c(0, 57.9e6, 108.2e6, 149.6e6, 227.8e6, 778.3e6,
1427e6, 2871e6, 4497.1e6),
diam_km = c(1.392e6, 4878, 12104, 12756, 6787, 142792, 120660,
51118, 48600)
)
solar_system <- tbl_df(solar_system)
model_total_distance <- distance
actual_total_distance <- solar_system$distance_km[9]
solar_system <- solar_system %>%
mutate(model_distance = distance_km * model_total_distance /
actual_total_distance,
model_diam = diam_km * model_total_distance /
actual_total_distance)
print(solar_system)
}
Here’s the model for 100 meters.
solar_model(100)
## # A tibble: 9 × 5
## solar_object distance_km diam_km model_distance model_diam
## <fctr> <dbl> <dbl> <dbl> <dbl>
## 1 Sun 0 1392000 0.000000 0.0309532810
## 2 Mercury 57900000 4878 1.287496 0.0001084699
## 3 Venus 108200000 12104 2.405995 0.0002691512
## 4 Earth 149600000 12756 3.326588 0.0002836495
## 5 Mars 227800000 6787 5.065487 0.0001509195
## 6 Jupiter 778300000 142792 17.306709 0.0031752018
## 7 Saturn 1427000000 120660 31.731560 0.0026830624
## 8 Uranus 2871000000 51118 63.841142 0.0011366881
## 9 Neptune 4497100000 48600 100.000000 0.0010806964
We can see that the diameter for the planets is too small to really draw (Earth is 0.0002 m or 0.2 mm in diameter).
We can trial and error to see how much space we would need to make the Earth a decent size (like 5 mm). We can try 1000 m.
solar_model(1000)
## # A tibble: 9 × 5
## solar_object distance_km diam_km model_distance model_diam
## <fctr> <dbl> <dbl> <dbl> <dbl>
## 1 Sun 0 1392000 0.00000 0.309532810
## 2 Mercury 57900000 4878 12.87496 0.001084699
## 3 Venus 108200000 12104 24.05995 0.002691512
## 4 Earth 149600000 12756 33.26588 0.002836495
## 5 Mars 227800000 6787 50.65487 0.001509195
## 6 Jupiter 778300000 142792 173.06709 0.031752018
## 7 Saturn 1427000000 120660 317.31560 0.026830624
## 8 Uranus 2871000000 51118 638.41142 0.011366881
## 9 Neptune 4497100000 48600 1000.00000 0.010806964
Still too small. That’s only 2 mm. Let’s try 2000 m.
solar_model(2000)
## # A tibble: 9 × 5
## solar_object distance_km diam_km model_distance model_diam
## <fctr> <dbl> <dbl> <dbl> <dbl>
## 1 Sun 0 1392000 0.00000 0.619065620
## 2 Mercury 57900000 4878 25.74993 0.002169398
## 3 Venus 108200000 12104 48.11990 0.005383025
## 4 Earth 149600000 12756 66.53176 0.005672989
## 5 Mars 227800000 6787 101.30973 0.003018390
## 6 Jupiter 778300000 142792 346.13418 0.063504036
## 7 Saturn 1427000000 120660 634.63121 0.053661248
## 8 Uranus 2871000000 51118 1276.82284 0.022733762
## 9 Neptune 4497100000 48600 2000.00000 0.021613929
With that, the Sun is 62 cm in diameter and the Earth is about 0.5 cm. That’s at a scale of 2000 meters, or about 1.25 miles. Wow!
Interestingly enough we can also try to place the nearest star (other than the Sun) on our scale. Proxima Centauri is 4.246 light years away, and 1 light year is 9.461 x 10^12 kilometers. Its radius is 0.141 the radius of the sun (0.141 * 695,700 km).
solar_model_PC <- function(distance) {
require(dplyr)
solar_system <- data.frame(
solar_object = c("Sun", "Mercury", "Venus", "Earth", "Mars", "Jupiter",
"Saturn", "Uranus", "Neptune", "Proxima Centauri"),
distance_km = c(0, 57.9e6, 108.2e6, 149.6e6, 227.8e6, 778.3e6,
1427e6, 2871e6, 4497.1e6, 9.461e12*4.246),
diam_km = c(1.392e6, 4878, 12104, 12756, 6787, 142792, 120660,
51118, 48600, 0.141*2*6.957e5)
)
solar_system <- tbl_df(solar_system)
model_total_distance <- distance
actual_total_distance <- solar_system$distance_km[9]
solar_system <- solar_system %>%
mutate(model_distance = distance_km * model_total_distance /
actual_total_distance,
model_diam = diam_km * model_total_distance /
actual_total_distance)
print(solar_system)
}
After adding in the distance to Proxima Centauri and is diameter to the model, we can recalculate on a scale where the Sun to Neptune is 100 m.
solar_model_PC(100)
## # A tibble: 10 × 5
## solar_object distance_km diam_km model_distance model_diam
## <fctr> <dbl> <dbl> <dbl> <dbl>
## 1 Sun 0.000000e+00 1392000.0 0.000000e+00 0.0309532810
## 2 Mercury 5.790000e+07 4878.0 1.287496e+00 0.0001084699
## 3 Venus 1.082000e+08 12104.0 2.405995e+00 0.0002691512
## 4 Earth 1.496000e+08 12756.0 3.326588e+00 0.0002836495
## 5 Mars 2.278000e+08 6787.0 5.065487e+00 0.0001509195
## 6 Jupiter 7.783000e+08 142792.0 1.730671e+01 0.0031752018
## 7 Saturn 1.427000e+09 120660.0 3.173156e+01 0.0026830624
## 8 Uranus 2.871000e+09 51118.0 6.384114e+01 0.0011366881
## 9 Neptune 4.497100e+09 48600.0 1.000000e+02 0.0010806964
## 10 Proxima Centauri 4.017141e+13 196187.4 8.932736e+05 0.0043625314
So our nearest star turns out to be 890 kilometers away on this scale. Put another way, if we had this 100 meter model in Los Angeles, where the Earth is again 0.2 mm in size, the nearest star would be around Salt Lake City!