I spent an evening with old friends just after Christmas. One of their sons is fascinated by Space, and always has great questions for me about it. This year he asked how much he would weigh on Jupiter. I admitted that I didn’t know the answer, but that a) It wasn’t a single number, as the surface of Jupiter (if one exists) is not very well understood and different heights in the atmosphere would give different weights and b) I would find out. It took a little Googling to find some information about the density profile of Jupiter, which includes information about Saturn too. The paper is the following, with abstract:

Taken from http://www.nature.com/nature/journal/v520/n7546/full/nature14278.html

Taken from http://www.nature.com/nature/journal/v520/n7546/full/nature14278.html

In this paper is the following pair of graphs:

Taken from http://www.nature.com/nature/journal/v520/n7546/images/nature14278-sf4.jpg

Which is all we need to calculate how much Dougie weighs on Jupiter. In the lower plot we see two different models of the density of Jupiter at different heights. We will use both of these profiles and see that they would give very different effects if an explorer Dougie were to dive into Jupiter and check out different parts of the atmosphere, or the surface. In one of the models here there is a solid surface at around 0.2 times the radius of Jupiter, while in the other, there is a smoother increase in the density from the outer limb of the gas giant to the centre.

However, before we do that, we first need to be able to take this graphic and convert it into data that we can use in the calculation. We use Mathematica for this and in particular we take hints from here. Let’s go through the code to transform this into something usable.

First we import the graphics into Mathematica. We have downloaded the file and called it Jupiter.jpg:


image = Import[“/Users/mydirectorystructure/Jupiterprofile.jpg”]


We can make sure that the image data is all in integer values with:


data = Round[ImageData<li class="fusion-carousel-item"><div class="fusion-carousel-item-wrapper"><div class="fusion-image-wrapper"><img src="" width="" height="" alt="" /></div></div></li>,1]


And then perform a transformation of the numbers sending all values {0,0,0} to 1 and everything else to 0. This produces a negative of the image.


binImage = Image@Replace[data, {{0, 0, 0} -> 1, _ :> 0}, {2}]


We then apply a gaussian filter to remove some of the spurious points (though in this case there aren’t many)


curve = ImageApply[{0, 0, 0} &, binImage,  Masking -> ColorNegate[Binarize[GaussianFilter[binImage, 5]]]]


From the curve data we can now pull out the white pixel positions of the lines:


curvLoc = (Reverse/@Position[ImageData[curve, DataReversed -> True], {1., 1., 1.}])


Here we still have the axes, and the labels, and the two plots. Of course we only want the Jupiter plot.Here is the data that we have now having applied all the transformations above:



The following pulls out the two lines from the Jupiter plot, though it’s not perfect yet:

First get the exact region that we want:


selection=Select[curvLoc, 95 < #[[2]] < 380 && 935 > #[[1]] > 160 &];
Then we get the top curve, by taking only the tops of each line (as the lines are of finite thickness, and we just want a single point for each x-value).


larger = Sort[Sort[#, #1[[2]] > #2[[2]] &][[1]] & /@ Gather[selection, First[#1] == First[#2] &]];


and delete some spurious points


Position[Sign[Differences[larger[[;; , 2]]]], 1][[-1]] + 1
larger2 = Delete[larger, {{621}, {622}, {623}}];


Then we do the same thing for the lower curve


smaller =Sort[Sort[#, #1[[2]] > #2[[2]] &][[-1]] & /@Gather[selection, First[#1] == First[#2] &]];
Position[Sign[Differences[smaller[[;; , 2]]]], 1][[-1]]
smaller2 = Delete[smaller, 622];


Plotting these gives:


ListLinePlot[{smaller2, larger2}, PlotRange -> All]


smalllargewhich is a good start, but we see that the two curves swap round at around the 320th point. We swap this around with:


lowerline = Sort[Join[smaller2[[;; 150]], larger2[[156 ;;]]]];
upperline = Sort[Join[larger2[[;; 156]], smaller2[[156 ;;]]]];


Now the x-axis of the above graph is not what we want, and nor is the y-axis, but we can do some scaling. We want the x-axis to go from 0 to the radius of Jupiter. You will find different values, but the one which works best (in terms of giving the total mass of Jupiter once you integrate over the interior) for the following is:


radiusofjupiter = 714921000


This is in meters. Now we want to scale these lines appropriately, smooth them (using a moving average), and create interpolating functions:


lowerfunc = Interpolation[MovingAverage[{radiusofjupiter (#[[1]] – Min[lowerline[[;; , 1]]])/(Max[lowerline[[;; , 1]]] – Min[lowerline[[;; , 1]]]),
4300 (#[[2]] – Min[lowerline[[;; , 2]]])/(Max[lowerline[[;; , 2]]] – Min[lowerline[[;; , 2]]])} & /@ lowerline, 20]];

upperfunc = Interpolation[MovingAverage[{radiusofjupiter (#[[1]] – Min[upperline[[;; , 1]]])/(Max[upperline[[;; , 1]]] – Min[upperline[[;; , 1]]]),
16500 (#[[2]] – Min[upperline[[;; , 2]]])/(Max[upperline[[;; , 2]]] – Min[upperline[[;; , 2]]])} & /@ upperline, 20]];


The values of 4300 and 16500 are values taken from the original graphs, but tuned a little so that we end up with the right total mass of Jupiter when we integrate over the densities.

Let’s look at these plots:


Plot[{upperfunc[x], lowerfunc[x]}, {x, 0, radiusofjupiter}, PlotRange -> All]


finallinesComparing this with the original picture, we see that it’s not perfect, but it’s also not bad. We only want a rough estimate and this will certainly be good enough.

The two density curves (called upper and lower) can be used to work out the mass inside a given radius of Jupiter. We simply need to multiply the density at a given radius by the surface area of a shell at that radius multiplied by dr and then add up all these thin shells:


mass_{r_{upto}}=\int_0^{r_{upto}} 4 \pi r^2 density[r] dr


masstoRupper[rupto_] := NIntegrate[4 \[Pi] r^2 upperfunc[r], {r, 0, rupto}, Method -> {Automatic, “SymbolicProcessing” -> 0}]

masstoRlower[rupto_] := NIntegrate[4 \[Pi] r^2 lowerfunc[r], {r, 0, rupto}, Method -> {Automatic, “SymbolicProcessing” -> 0}]


Checking that this gives roughly the right answer we can integrate all the way to the radius of Jupiter:




These give roughly 1.8\times 10^{27}kg which is pretty close to the mass of Jupiter, so we are along the right lines.

Now we want to be able to calculate the weight of somebody on Jupiter at a given radius. Their weight is a function only of the mass held within that radius, so we use Newton’s inverse square law, with Newton’s constant, and divide by 10 to convert (roughly) between Newtons and kilograms:






weightlower[R_] := 6.64 10^-11 (masstoRlower[R] massofDougie)/(R^2 10)
weightupper[R_] := 6.64 10^-11 (masstoRupper[R] massofDougie)/(R^2 10)


This gives the following weight profile as you go from the outer rim of Jupiter through to the core (if you could tunnel through the solid surface, in the model in which there is one:

DougieweightNote that here we’ve been a little sloppy by what we mean by weight, but in this context it’s the value that would show up on a set of scales calibrated on Earth’s surface if Dougie were to stand on the scales at a given height in the atmosphere of Jupiter.

We see that out on the outer limb of Jupiter’s atmosphere, a 30 kg Dougie would weigh around 71 kilos, while in the model with a solid core, Dougie would appear to weigh around 190 kilos while on the surface. ie. his weight would appear to be around 6 times more than it is on Earth.

The largest weight ever lifted was by Paul Anderson, and was around 3000 kilos and given that this is substantially more than six times his weight, it seems that the strongest human beings of all time might be able to temporarily stand on the surface of Jupiter, but given that the greatest squats of all time are more like three-four times the weight of the lifter, it is unlikely that you could possibly get yourself off the surface if you every sat down.

How clear is this post?