#Intro

For an upcoming space game I've scripted a basic custom universal gravity simulator. I've set the workspace's gravity value to 0 and decided to use BodyForces to simulate gravitational attraction.

#The Problem

I've gotten pretty far on the grav sim, but I've encountered an issue regarding the trajectories of the parts. Namely, when a part starts orbiting another part, its orbit inexplicably gets larger each revolution. An example: https://imgur.com/gallery/G4h1sd4

As you can see, the orbits get progressively wider, and yes, there's only two bodies involved.

#Code

####Force Updater

runService.Stepped:Connect(function()
	
	local parts = {}
	
	for _, part in pairs(workspace:GetDescendants()) do
		local mass = getMass(part)
		if part ~= workspace.Terrain and not part:FindFirstChild("DoNotBeAttracted") and mass > 0 then
			parts[part] = {["pos"] = getPos(part), ["mass"] = mass}
		end
	end
	
	for part, attr in pairs(parts) do
		
		local pos = attr.pos
		local mass = attr.mass
		
		-- Calculate the net gravitational forces
		local netGForce = Vector3.new(0, 0, 0)			-- Possible bottleneck
		
		for _, otherpart in pairs(workspace:GetDescendants()) do
			
			if part ~= otherpart and otherpart ~= workspace.Terrain and not part:FindFirstChild("DoNotAttract") then
				
				local otherpartMass = getMass(otherpart)
				if otherpartMass > 0 then
					
					local otherpartPos = getPos(otherpart)
					
					local attraction = gravityModule.calculateGravitationalAttraction(pos, mass, otherpartPos, otherpartMass)
					local directionVector = (otherpartPos - pos).Unit
					netGForce = netGForce + attraction * directionVector
				end
			end
		end
		
		-- Make/update BodyForce
		updateForces(part, netGForce)
	end
			
	-- Loop through all parts and apply velocity change
	for _, part in pairs(workspace:GetDescendants()) do
		if part ~= workspace.Terrain and not part:FindFirstChild("DoNotBeAttracted") then
			if part:FindFirstChild("GravityForce") and part:FindFirstChild("GravityForceValue") then
				part.GravityForce.Force = part.GravityForceValue.Value
			end
		end
	end
end)

####Gravitation Calculation Function

function module.calculateGravitationalAttraction(pointA, massA, pointB, massB)
	return module.gravitationalConstant*massA*massB/(pointB-pointA).Magnitude^2
end

#Theories

Could the forces not be updating frequently enough, leading to a delayed gravity, in a sense, which would allow the bodies to drift more than they should? If so, how should I fix this?

Could this be similar to what's happening in real life to the Earth and Moon (very very doubtful)?

Any help is appreciated