Calculating the apparent magnitude of a satellite

I'm writing a program that involves calculating the apparent magnitude of satellites from a ground location. I currently have the intrinsic magnitude of the satellites and the solar phase angle in degrees. I can't seem to find a formula that works.

I tried

magnitude = intrinsicMagnitude - 15 + 5 * Math.Log(distanceToSatellite) - 2.5 * Math.Log(Math.Sin(B) + (Math.PI - B) * Math.Cos(B));


(B is the phase angle)

...but it does not work (it's returning numbers like +30). I know it's wrong because I'm comparing it to heavens-above.com satellite passes.

intrinsicMagnitude = Visual magnitude at 1000km away (Use -1.3)

distanceToSatellite = Observer distance to the satellite in km (Use 483)

B = This is what I am trying to figure out.

In the paper it says what this is but it says some other things that I do not understand. The phase angle you use to get this should be 113.

The target output of this equation should be around -3.

• This is what i have been working with stackoverflow.com/questions/19739831/… Dec 16, 2018 at 1:53
• Here is where the equation is from satobs.org/seesat/Apr-2001/0313.html Dec 16, 2018 at 4:53
• What is "intrinsic magnitude"? Please write your answer out in terms of mathematical formulas, with defined symbols. Dec 16, 2018 at 8:59
• Its the breightness of the satellite from 1000km away. For sake of example, use -1.3 Dec 16, 2018 at 14:41
• @uhoh Intrinsic magnitude is the apparent magnitude of the object at full phase from 1000 km away Dec 17, 2018 at 14:02

Congratulations to @NickBrown for his solution! Based on that equation and some additional references I'll just add a little more.

Calculating visual magnitude takes three input parameters

1. how good of a reflector the object is
2. the angle between the illumination and the viewing
3. the distances from illuminator and viewer are from the object

For astronomical objects we use absolute magnitude for item #1, for satellite viewing both absolute magnitude and intrinsic magnitude are used. Absolute magnitude is the visual magnitude of the object at 1 AU from the Sun and 1 AU from you, viewed full-on (phase angle = 0) which means you are sitting right next to the Sun.

Intrinsic magnitude is similar, but you are now only 1,000 km from the object with the Sun over your shoulder.

Either way, all of the albedo, size and shape information is lumped into the absolute or intrinsic magnitude, leaving only distances and angles.

The angle between the direction of illumination and the direction of viewing is called the phase angle. Think phases of the Moon for example. If the phase angle of the Moon were 90 degrees, it would be a half-moon. Zero would be full Moon and 180 degrees would be new Moon.

The modulation of the brightness as a function of phase angle was proposed by Vallerie, E.M. III, Investigation of Photometric Data Received from an Artificial Earth Satellite, AD #419069, Air Force Institute of Technology, Defense Documentation Center, Alexandria, Virginia, 1963, which I found in Observations and Modeling of GEO Satellites at Large Phase Angles by Rita L. Cognion, also in Researchgate

The dependence is given by the term

$$\frac{1}{\pi}(\sin(\phi) + (\pi-\phi) \cos(\phi))$$

and looks like

For the satellite in the question at a distance of 483 kilometers and an intrinsic magnitude of -1.3, the the apparent magnitude seems to be about -2.0 and its dependence on phase angle is as follows:

Not all spacecraft are spherical with diffuse white surfaces nor spherical-cow-shaped.

For phase angle dependence of some more familliar shapes, see Figure 2 in Visible Magnitude of Typical Satellites in Synchronous Orbits William E. Krag, MIT, 1974 AD-785 380, which describes the problem nicely.

def Mapparent_from_Mintrinsic(Mint, d_km, pa):
term_1 = Mint
term_2 = +5.0 * np.log10(d_km/1000.)
arg    = np.sin(pa) + (pi - pa) * np.cos(pa)
term_3 = -2.5 * np.log10(arg)
return term_1 + term_2 + term_3

import numpy as np
import matplotlib.pyplot as plt

halfpi, pi, twopi = [f*np.pi for f in (0.5, 1, 2)]

Mintrinsic   = -1.3
d_kilometers = 483.

phase_angles = np.linspace(0, pi, 181)

Mapp = Mapparent_from_Mintrinsic(Mintrinsic, d_kilometers, phase_angles)

# https://astronomy.stackexchange.com/q/28744/7982
# https://www.researchgate.net/publication/268194552_Large_phase_angle_observations_of_GEO_satellites
# https://amostech.com/TechnicalPapers/2013/POSTER/COGNION.pdf
# https://apps.dtic.mil/dtic/tr/fulltext/u2/785380.pdf

if True:
plt.figure()

F = (1./pi)*(np.sin(phase_angles) + (pi-phase_angles)*np.cos(phase_angles))

plt.suptitle('F = (1/pi)(sin(phi) + (pi-phi)cos(phi))', fontsize=16)

plt.subplot(2, 1, 1)
plt.plot(degs*phase_angles, F)
plt.ylabel('F', fontsize=16)

plt.subplot(2, 1, 2)
plt.plot(degs*phase_angles, -2.5*np.log10(F))
plt.xlabel('phase angle (degs)', fontsize=16)
plt.ylabel('-2.5log10(F)', fontsize=16)
plt.ylim(-1, 11)

plt.show()

if True:
plt.figure()
plt.plot(degs*phase_angles, Mapp)
plt.plot(degs*phase_angles[113], Mapp[113], 'ok')
plt.text(90, -5, '{:0.2f} at {:0.1f} deg'.format(Mapp[113], 113), fontsize=16)
plt.xlabel('phase angle (degs)', fontsize=16)
plt.ylabel('mag', fontsize=16)
plt.title('apparent mag of intrinsic mag=-1.3 at 483 km', fontsize=16)
plt.ylim(-10, 15)
plt.show()

• holy cow thanks for the answer. Im going to try to implement this instead of the one i provided. Ill let you know how good it is. Dec 18, 2018 at 15:00
– uhoh
Dec 18, 2018 at 15:02
• Ah okay. I didnt fully read your functions. thanks! Dec 18, 2018 at 15:05
• Hmm. Mine actually is inaccurate. Yours works perfectly. Im going to edit my answer to show a c# version of yours. thanks! Dec 18, 2018 at 15:17
• its not really important. Some people use -1.3, some people use -1.8 Dec 18, 2018 at 17:02

This is for satellites with unknown size and orientation but known standard magnitude (Standard magnitude can be found on the satellite info page of heavens above, the number is called intrinsic magnitude) The proper formula is

            double distanceToSatellite = 485; //This is in KM
double phaseAngleDegrees = 113.1; //Angle from sun->satellite->observer
double pa = phaseAngleDegrees * 0.0174533; //Convert the phase angle to radians
double intrinsicMagnitude = -1.8; //-1.8 is std. mag for iss

double term_1 = intrinsicMagnitude;
double term_2 = 5.0 * Math.Log10(distanceToSatellite / 1000.0);

double arg = Math.Sin(pa) + (Math.PI - pa) * Math.Cos(pa);
double term_3 = -2.5 * Math.Log10(arg);

double apparentMagnitude = term_1 + term_2 + term_3;


This will give the apparent magnitude of the satellite. Note: I gave the formula in C#

• Congratulations!
– uhoh
Dec 18, 2018 at 5:30